gfan0.8beta/0000775000175000017500000000000015177170257012403 5ustar andersandersgfan0.8beta/LICENSE0000664000175000017500000000030115177170257013402 0ustar andersandersThe Gfan software is distributed under the "GNU GENERAL PUBLIC LICENSE" version 2 or any later version as described in the file "COPYING". Ask the author if you want a more reasonable license. gfan0.8beta/doc/0000775000175000017500000000000015177170257013150 5ustar andersandersgfan0.8beta/doc/polyformat.eps0000664000175000017500000000722715177170257016065 0ustar andersanders%!PS-Adobe-2.0 EPSF-2.0 %%Title: polyformat.fig %%Creator: fig2dev Version 3.2 Patchlevel 4 %%CreationDate: Fri Sep 7 18:46:53 2007 %%For: anders@alice (Anders Nedergaard Jensen) %%BoundingBox: 0 0 850 737 %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save newpath 0 737 moveto 0 0 lineto 850 0 lineto 850 737 lineto closepath clip newpath 0.7 735.5 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def $F2psBegin 10 setmiterlimit 0 slj 0 slc 0.06000 0.06000 sc % % Fig objects follow % % % here starts figure with depth 50 % Polyline 7.500 slw n 14142 12247 m 7071 12247 l 8838 9185 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 14142 12247 m 8838 9185 l 10606 6123 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 10606 6123 m 8838 9185 l 7071 8164 l 7071 6123 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 7071 0 m 10606 6123 l 7071 6123 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 7071 0 m 7071 6123 l 3535 6123 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 8838 9185 m 7071 12247 l 5303 9185 l 7071 8164 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 0 12247 m 5303 9185 l 7071 12247 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 0 12247 m 3535 6123 l 5303 9185 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 7071 8164 m 5303 9185 l 3535 6123 l 7071 6123 l cp gs col7 0.25 tnt ef gr gs col0 s gr % here ends figure; $F2psEnd rs showpage gfan0.8beta/doc/jensen.bib0000664000175000017500000006642715177170257015127 0ustar andersanders@book{tropicalbook, title={Introduction to Tropical Geometry: }, author={Maclagan, D. and Sturmfels, B.}, isbn={9780821851982}, lccn={2014036141}, series={Graduate Studies in Mathematics}, url={https://books.google.com.tw/books?id=3DLMoQEACAAJ}, year={2015}, publisher={American Mathematical Society} } @article{allermannRau, author = {Lars Allermann and Johannes Rau}, title = {First steps in tropical intersection theory}, journal = {Mathematische Zeitschrift}, publisher = {Springer}, year = {2009} } @inproceedings{AGK, author = {Beatrice Amrhein and Oliver Gloor and Wolfgang K\"uchlin}, title = {Walking faster}, booktitle = {Proceedings DISCO '96}, publisher = {LNCS 1128, Springer}, address = {Berlin}, year = {1996}, pages = {150-161} } @article{AGK2, author = {Beatrice Amrhein and Oliver Gloor and Wolfgang K\"uchlin}, title = {Walking faster.}, journal = {Proceedings DISCO '96}, publisher = {LNCS 1128, Springer}, address = {Berlin}, year = {1996}, pages = {150-161}, } @book{atiyah, AUTHOR = {Atiyah, M. F. and Macdonald, I. G.}, TITLE = {Introduction to commutative algebra}, PUBLISHER = {Addison-Wesley Publishing Co., Reading, Mass.-London-Don Mills, Ont.}, YEAR = {1969}, PAGES = {ix+128}, MRCLASS = {13.00}, MRNUMBER = {MR0242802 (39 \#4129)}, MRREVIEWER = {J. A. Johnson}, } @article {af-rse-96, AUTHOR = {Avis, David and Fukuda, Komei}, TITLE = {Reverse search for enumeration}, NOTE = {First International Colloquium on Graphs and Optimization (GOI), 1992 (Grimentz)}, JOURNAL = {Discrete Appl. Math.}, FJOURNAL = {Discrete Applied Mathematics. The Journal of Combinatorial Algorithms, Informatics and Computational Sciences}, VOLUME = {65}, YEAR = {1996}, NUMBER = {1-3}, PAGES = {21--46}, ISSN = {0166-218X}, CODEN = {DAMADU}, MRCLASS = {05C30 (05A15)}, MRNUMBER = {MR1380066 (98a:05080)}, } @article{avis, author = {David Avis and Komei Fukuda}, title = {A basis enumeration algorithm for convex hulls and vertex enumeration of arrangements and polyhedra.}, journal = {Discrete Computational Geometry}, volume = {8}, year = {1992}, pages = {295-313}, } @book {basu, AUTHOR = {Basu, Saugata and Pollack, Richard and Roy, Marie-Fran{\c{c}}oise}, TITLE = {Algorithms in real algebraic geometry}, SERIES = {Algorithms and Computation in Mathematics}, VOLUME = {10}, EDITION = {Second}, PUBLISHER = {Springer-Verlag}, ADDRESS = {Berlin}, YEAR = {2006}, PAGES = {x+662}, ISBN = {978-3-540-33098-1; 3-540-33098-4}, MRCLASS = {14P10 (03C10 52C45 68Q25 68W30)}, MRNUMBER = {MR2248869 (2007b:14125)}, } @article {bayer, AUTHOR = {Bayer, David and Morrison, Ian}, TITLE = {Standard bases and geometric invariant theory. {I}. {I}nitial ideals and state polytopes}, NOTE = {Computational aspects of commutative algebra}, JOURNAL = {J. Symbolic Comput.}, FJOURNAL = {Journal of Symbolic Computation}, VOLUME = {6}, YEAR = {1988}, NUMBER = {2-3}, PAGES = {209--217}, ISSN = {0747-7171}, MRCLASS = {13-04 (13B25 68Q40)}, MRNUMBER = {MR988413 (90e:13001)}, MRREVIEWER = {Ferdinando Mora}, } @book{becker, AUTHOR = {Becker, Thomas and Weispfenning, Volker}, TITLE = {Gr\"obner bases}, SERIES = {Graduate Texts in Mathematics}, VOLUME = {141}, NOTE = {A computational approach to commutative algebra, In cooperation with Heinz Kredel}, PUBLISHER = {Springer-Verlag}, ADDRESS = {New York}, YEAR = {1993}, PAGES = {xxii+574}, ISBN = {0-387-97971-9}, MRCLASS = {13P10 (13-01)}, MRNUMBER = {MR1213453 (95e:13018)}, MRREVIEWER = {J{\"o}rgen Backelin}, } @article {Ber, AUTHOR = {Bergman, George M.}, TITLE = {The logarithmic limit-set of an algebraic variety}, JOURNAL = {Trans. Amer. Math. Soc.}, FJOURNAL = {Transactions of the American Mathematical Society}, VOLUME = {157}, YEAR = {1971}, PAGES = {459--469}, ISSN = {0002-9947}, MRCLASS = {14.01}, MRNUMBER = {MR0280489 (43 \#6209)}, MRREVIEWER = {M. J. Greenberg}, } @preamble{ "\def\cprime{$'$} " } @article {MR0435072, AUTHOR = {Bernstein, D. N.}, TITLE = {The number of roots of a system of equations}, JOURNAL = {Funkcional. Anal. i Prilo\v zen.}, FJOURNAL = {Akademija Nauk SSSR. Funkcional\cprime nyi Analiz i ego Prilo\v zenija}, VOLUME = {9}, YEAR = {1975}, NUMBER = {3}, PAGES = {1--4}, ISSN = {0374-1990}, MRCLASS = {14B99 (12E99 58C25)}, MRNUMBER = {MR0435072 (55 \#8034)}, MRREVIEWER = {A. H. Wallace}, } @article{bernstein, author = {David Bernstein}, title = {The number of roots of a system of equations}, journal = {Functional Analysis and its Applications}, volume = {9}, number = {}, year = {1975}, pages = {183-185}, } @article{BG, AUTHOR = {Bieri, Robert and Groves, J. R. J.}, TITLE = {The geometry of the set of characters induced by valuations}, JOURNAL = {J. Reine Angew. Math.}, FJOURNAL = {Journal f\"ur die Reine und Angewandte Mathematik}, VOLUME = {347}, YEAR = {1984}, PAGES = {168--195}, ISSN = {0075-4102}, CODEN = {JRMAA8}, MRCLASS = {14A20 (12J20 13A18 52A25)}, MRNUMBER = {MR733052 (86c:14001)}, MRREVIEWER = {Ralph Strebel}, } @article{BF, author = {G\"oran Bj\"orck and Ralf Fr\"oberg}, title = {A faster way to count the solutions of inhomogeneous systems of algebraic equations, with applications to cyclic $n$-roots}, journal = {J. Symb. Comput.}, volume = {12}, number = {3/4}, year = {1991}, pages = {329-336} } @article {circuitideals, AUTHOR = {Bogart, Tristram and Jensen, Anders N. and Thomas, Rekha R.}, TITLE = {The circuit ideal of a vector configuration}, JOURNAL = {J. Algebra}, FJOURNAL = {Journal of Algebra}, VOLUME = {309}, YEAR = {2007}, NUMBER = {2}, PAGES = {518--542}, ISSN = {0021-8693}, CODEN = {JALGA4}, MRCLASS = {13Pxx (05Exx)}, MRNUMBER = {MR2303191}, eprint = {math.AC/0508628} } @article{ctvgammel, author = {Tristram Bogart and Anders Jensen and Rekha Thomas and David Speyer and Bernd Sturmfels}, title = {Computing tropical varieties.}, journal = {J. Symb. Comput.}, volume = {42}, number = {1-2}, year = {2007}, pages = {54-73}, bibsource = {}, eprint = {math.AG/0507563} } @article {ctv, AUTHOR = {Bogart, T. and Jensen, A. N. and Speyer, D. and Sturmfels, B. and Thomas, R. R.}, TITLE = {Computing tropical varieties}, JOURNAL = {J. Symbolic Comput.}, FJOURNAL = {Journal of Symbolic Computation}, VOLUME = {42}, YEAR = {2007}, NUMBER = {1-2}, PAGES = {54--73}, ISSN = {0747-7171}, MRCLASS = {14Qxx (68N30)}, MRNUMBER = {MR2284285}, eprint = {math.AG/0507563} } @misc{Buch, author = {Bruno Buchberger}, title = {An Algorithm for Finding a Basis for the Residue Class Ring of a Zero-Dimensional Polynomial Ideal}, year = {1965}, note = {PhD-thesis (German)}, } @article {collart, AUTHOR = {Collart, S. and Kalkbrener, M. and Mall, D.}, TITLE = {Converting bases with the {G}r\"obner walk}, NOTE = {Computational algebra and number theory (London, 1993)}, JOURNAL = {J. Symbolic Comput.}, FJOURNAL = {Journal of Symbolic Computation}, VOLUME = {24}, YEAR = {1997}, NUMBER = {3-4}, PAGES = {465--469}, ISSN = {0747-7171}, MRCLASS = {13P10 (68Q40)}, MRNUMBER = {MR1484492}, } @book {Cox97, AUTHOR = {Cox, David and Little, John and O'Shea, Donal}, TITLE = {Ideals, varieties, and algorithms}, SERIES = {Undergraduate Texts in Mathematics}, EDITION = {Second}, NOTE = {An introduction to computational algebraic geometry and commutative algebra}, PUBLISHER = {Springer-Verlag}, ADDRESS = {New York}, YEAR = {1997}, PAGES = {xiv+536}, ISBN = {0-387-94680-2}, MRCLASS = {13P10 (13-01 14-01 14Qxx 68Q40)}, MRNUMBER = {MR1417938 (97h:13024)}, } @article {develin-2004-9, AUTHOR = {Develin, Mike and Sturmfels, Bernd}, TITLE = {Erratum for: ``{T}ropical convexity'' [{D}oc. {M}ath. {\bf 9} (2004), 1--27 (electronic); MR2054977]}, JOURNAL = {Doc. Math.}, FJOURNAL = {Documenta Mathematica}, VOLUME = {9}, YEAR = {2004}, PAGES = {205--206 (electronic)}, ISSN = {1431-0635}, MRCLASS = {52A30 (92B10)}, MRNUMBER = {MR2117413 (2006c:52005)}, MRREVIEWER = {Gerard Sierksma}, } @misc {draisma, author = "Jan Draisma", title = "A tropical approach to secant dimensions", year = "2006", eprint = "math.AG/0605345v3" } @PhdThesis{thesis, author = {Anders Nedergaard Jensen}, title = {Algorithmic aspects of {G}r\"obner fans and tropical varieties}, school = {University of Aarhus}, year = {2007}, note = {\url{http://www.imf.au.dk/publs?id=655}}, } @Misc{cats, author = {Jensen, Anders}, title = {{CaTS}, a software system for toric state polytopes}, howpublished = {Available at {http://www.soopadoopa.dk/anders/cats/cats.html}} } @article {lind, AUTHOR = {Einsiedler, Manfred and Kapranov, Mikhail and Lind, Douglas}, TITLE = {Non-{A}rchimedean amoebas and tropical varieties}, JOURNAL = {J. Reine Angew. Math.}, FJOURNAL = {Journal f\"ur die Reine und Angewandte Mathematik}, VOLUME = {601}, YEAR = {2006}, PAGES = {139--157}, ISSN = {0075-4102}, CODEN = {JRMAA8}, MRCLASS = {14Gxx (14Pxx)}, MRNUMBER = {MR2289207}, } @article {FGLM, AUTHOR = {Faug{\`e}re, J. C. and Gianni, P. and Lazard, D. and Mora, T.}, TITLE = {Efficient computation of zero-dimensional {G}r\"obner bases by change of ordering}, JOURNAL = {J. Symbolic Comput.}, FJOURNAL = {Journal of Symbolic Computation}, VOLUME = {16}, YEAR = {1993}, NUMBER = {4}, PAGES = {329--344}, ISSN = {0747-7171}, MRCLASS = {68Q40}, MRNUMBER = {MR1263871 (94k:68095)}, } @manual{cdd , author = "Komei Fukuda" , title = "cddlib reference manual, cddlib Version 094b" , organization = "~Swiss Federal Institute of Technology" , address = "Lausanne and Z{\"u}rich, Switzerland" , year = 2005 , sortkey = "0051" , note = "\url{http://www.ifor.math.ethz.ch/~fukuda/cdd_home/cdd.html}" , update = "99.10 fukuda" } @article{fukuda, author = {Komei Fukuda and Anders Jensen and Rekha Thomas}, title = {Computing {G}r{\"o}bner Fans.}, journal = {Mathematics of Computation, to appear}, volume = {}, number = {}, year = {2007}, pages = {}, bibsource = {}, eprint = {math.AC/0509544} } @article {genericgroebnerwalk, AUTHOR = {Fukuda, K. and Jensen, A. N. and Lauritzen, N. and Thomas, R.}, TITLE = {The generic {G}r\"obner walk}, JOURNAL = {J. Symbolic Comput.}, FJOURNAL = {Journal of Symbolic Computation}, VOLUME = {42}, YEAR = {2007}, NUMBER = {3}, PAGES = {298--312}, ISSN = {0747-7171}, MRCLASS = {68W30}, MRNUMBER = {MR2292637}, eprint = {math.AC/0501345} } @article{genericgroebnerwalkgammel, author = {Komei Fukuda and Anders Jensen and Niels Lauritzen and Rekha Thomas}, title = {The generic {G}r\"obner walk.}, journal = {J. Symb. Comput.}, volume = {42}, number = {3}, year = {2007}, pages = {298-312}, bibsource = {}, eprint = {math.AC/0501345} } @inproceedings{weibel, author = {Christophe Weibel and Komei Fukuda}, title = {Computing faces up to k dimensions of a Minkowski Sum of Polytopes.}, booktitle = {CCCG}, year = {2005}, pages = {256-259}, ee = {http://www.cccg.ca/proceedings/2005/44.pdf}, bibsource = {DBLP, http://dblp.uni-trier.de} } @book {Ful, AUTHOR = {Fulton, William}, TITLE = {Introduction to toric varieties}, SERIES = {Annals of Mathematics Studies}, VOLUME = {131}, NOTE = {, The William H. Roever Lectures in Geometry}, PUBLISHER = {Princeton University Press}, ADDRESS = {Princeton, NJ}, YEAR = {1993}, PAGES = {xii+157}, ISBN = {0-691-00049-2}, MRCLASS = {14M25 (14-02 14J30)}, MRNUMBER = {MR1234037 (94g:14028)}, MRREVIEWER = {T. Oda}, } @article {li, AUTHOR = {Gao, Tangan and Li, T. Y.}, TITLE = {Mixed volume computation via linear programming}, JOURNAL = {Taiwanese J. Math.}, FJOURNAL = {Taiwanese Journal of Mathematics}, VOLUME = {4}, YEAR = {2000}, NUMBER = {4}, PAGES = {599--619}, ISSN = {1027-5487}, MRCLASS = {65D18 (52A39)}, MRNUMBER = {MR1799755 (2001j:65026)}, } @article{gathmann, author = {Andreas Gathmann}, title = {Tropical Algebraic Geometry}, eprint = {math.AG/0601322}, year = {2006} } @incollection{polymake, 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} } @article {gianni88, AUTHOR = {Gianni, Patrizia and Trager, Barry and Zacharias, Gail}, TITLE = {Gr\"obner bases and primary decomposition of polynomial ideals}, NOTE = {Computational aspects of commutative algebra}, JOURNAL = {J. Symbolic Comput.}, FJOURNAL = {Journal of Symbolic Computation}, VOLUME = {6}, YEAR = {1988}, NUMBER = {2-3}, PAGES = {149--167}, ISSN = {0747-7171}, MRCLASS = {68Q40 (13-04 13A17)}, MRNUMBER = {MR988410 (90f:68091)}, MRREVIEWER = {Daniel Lazard}, } @Misc{gfan, author = {Jensen, Anders Nedergaard}, title = {Gfan, a software system for {G}r{\"o}bner fans}, howpublished = {Available at \url{http://home.imf.au.dk/ajensen/software/gfan/gfan.html}} } @misc{gmp, author = {Torbj{\"o}rn {Granlund et al.}}, title = "{GNU} Multiple Precision Arithmetic Library 4.1.2", month = {December}, year = 2002, note = "\url{http://swox.com/gmp/}" } @book {greuelpfister, AUTHOR = {Greuel, Gert-Martin and Pfister, Gerhard}, TITLE = {A {S}ingular introduction to commutative algebra}, NOTE = {With contributions by Olaf Bachmann, Christoph Lossen and Hans Sch\"onemann, With 1 CD-ROM (Windows, Macintosh, and UNIX)}, PUBLISHER = {Springer-Verlag}, ADDRESS = {Berlin}, YEAR = {2002}, PAGES = {xviii+588}, ISBN = {3-540-42897-6}, MRCLASS = {13-01 (13-04)}, MRNUMBER = {MR1930604 (2003k:13001)}, MRREVIEWER = {Paulo F. Machado}, } @article {hampton, AUTHOR = {Hampton, Marshall and Moeckel, Richard}, TITLE = {Finiteness of relative equilibria of the four-body problem}, JOURNAL = {Invent. Math.}, FJOURNAL = {Inventiones Mathematicae}, VOLUME = {163}, YEAR = {2006}, NUMBER = {2}, PAGES = {289--312}, ISSN = {0020-9910}, CODEN = {INVMBH}, MRCLASS = {70F10}, MRNUMBER = {MR2207019}, } @article {hubersturmfels, AUTHOR = {Huber, Birkett and Sturmfels, Bernd}, TITLE = {A polyhedral method for solving sparse polynomial systems}, JOURNAL = {Math. Comp.}, FJOURNAL = {Mathematics of Computation}, VOLUME = {64}, YEAR = {1995}, NUMBER = {212}, PAGES = {1541--1555}, ISSN = {0025-5718}, } @misc{TrIm, AUTHOR = { Bernd Sturmfels and Josephine Yu} , title = "Tropical Implicitization and Mixed Fiber Polytopes", year = 2007, eprint = {cs.SC/0706.0564v1} } @misc{jensenMaster, AUTHOR = { Anders Nedergaard Jensen}, title = {Computing {G}r\"obner fans of toric ideals}, year = 2002, note = {Master thesis, University of Aarhus} } @InProceedings{jensenICMS2006, author = {Anders Nedergaard Jensen}, title = {A presentation of the {Gfan} software.}, booktitle = "Mathematical Software - ICMS 2006", pages = "222--224", year = 2006, editor = "Iglesias and Takayama", publisher = "Springer", ISBN = "3540380841", } @article {jensen, AUTHOR = {Jensen, Anders Nedergaard}, TITLE = {A non-regular {G}r\"obner fan}, JOURNAL = {Discrete Comput. Geom.}, FJOURNAL = {Discrete \& Computational Geometry. An International Journal of Mathematics and Computer Science}, VOLUME = {37}, YEAR = {2007}, NUMBER = {3}, PAGES = {443--453}, ISSN = {0179-5376}, CODEN = {DCGEER}, MRCLASS = {13P10}, MRNUMBER = {MR2301528}, eprint = {math.CO/0501352} } @misc{symmetricfans, author = {Jensen, Anders N.}, title = {Traversing symmetric polyhedral fans}, howpublished = {to appear in ``Mathe\-matical Software - ICMS 2010''}, booktitle = "Mathematical Software - ICMS 2010", year = 2010, publisher = "Springer", } @article {kalkbrener-onthecomplexity, AUTHOR = {Kalkbrener, Michael}, TITLE = {On the complexity of {G}r\"obner bases conversion}, NOTE = {Polynomial elimination---algorithms and applications}, JOURNAL = {J. Symbolic Comput.}, FJOURNAL = {Journal of Symbolic Computation}, VOLUME = {28}, YEAR = {1999}, NUMBER = {1-2}, PAGES = {265--273}, ISSN = {0747-7171}, MRCLASS = {13P10 (68W30)}, MRNUMBER = {MR1709906 (2000g:13020)}, MRREVIEWER = {Joachim Apel}, } @misc {katz, author = "Eric Katz", title = "A tropical toolkit", year = "2006", eprint = "math.AG/0610878v2" } @misc {mlfb, author = "Anders Nedergaard Jensen and Niels Lauritzen and Bjarke Hammersholt Roune", title = "Maximal lattice free bodies, test sets and the Frobenius problem", year = "2007", eprint = "arXiv:0705.4483" } @book {lauritzen-concrete, AUTHOR = {Lauritzen, Niels}, TITLE = {Concrete abstract algebra}, NOTE = {From numbers to Gr\"obner bases}, PUBLISHER = {Cambridge University Press}, ADDRESS = {Cambridge}, YEAR = {2003}, PAGES = {xiv+240}, ISBN = {0-521-53410-0}, MRCLASS = {00-01 (13-01 20-01)}, MRNUMBER = {MR2014325 (2005d:00001)}, MRREVIEWER = {Frank Sottile}, } @article{lauritzen, author = {Niels Lauritzen}, title = {Truncated {G}r\"obner fans and lattice ideals}, journal = {}, volume = {}, year = {2005}, eprint = {math.AG/0509247} } @incollection {mall, AUTHOR = {Mall, Daniel}, TITLE = {Gr\"obner fans and projective schemes}, BOOKTITLE = {Symbolic rewriting techniques (Ascona, 1995)}, SERIES = {Progr. Comput. Sci. Appl. Logic}, VOLUME = {15}, PAGES = {181--191}, PUBLISHER = {Birkh\"auser}, ADDRESS = {Basel}, YEAR = {1998}, MRCLASS = {13P10 (68Q40)}, MRNUMBER = {MR1624580 (99d:13033)}, MRREVIEWER = {Ralf Fr{\"o}berg}, } @misc{mikhalkin, author = {Grigory Mikhalkin}, title = {Tropical geometry}, year = {2007}, note = {Work in progress, http://www.math.toronto.edu/mikha/TG-project.html}, } @incollection {doubledescription, AUTHOR = {Motzkin, T. S. and Raiffa, H. and Thompson, G. L. and Thrall, R. M.}, TITLE = {The double description method}, BOOKTITLE = {Contributions to the theory of games, vol. 2}, SERIES = {Annals of Mathematics Studies, no. 28}, PAGES = {51--73}, PUBLISHER = {Princeton University Press}, ADDRESS = {Princeton, N. J.}, YEAR = {1953}, MRCLASS = {90.0X}, MRNUMBER = {MR0060202 (15,638g)}, MRREVIEWER = {H. W. Kuhn}, } @book{ascb, author = {Lior Pachter and Bernd Sturmfelse}, title = {Algebraic Statistics for Computational Biology}, year = {2005}, PUBLISHER = {Cambridge Univ. Press}, ADDRESS = {New York}, } @article{rambau, author = {J{\"o}rg Rambau}, title = {{TOPCOM}: Triangulations of Point Configurations and Oriented Matroids}, journal = {ZIB report}, institution ={Konrad-Zuse-Zentrum f{\"u}r Informationstechnik Berlin}, volume = {02-17}, year = {2002}, } @TechReport{singular, author = {G.-M. Greuel and G. Pfister and H. Sch\"onemann}, title = {{\sc Singular} 2.0.5}, type = {{A Computer Algebra System for Polynomial Computations}}, institution = {Centre for Computer Algebra}, address = {University of Kaiserslautern}, year = {2004}, note = {\url{http://www.singular.uni-kl.de}}, } @Misc{4ti2, author = {4ti2 team}, title = {4ti2---A software package for algebraic, geometric and combinatorial problems on linear spaces}, howpublished = {{A}vailable at www.4ti2.de} } @article{huber, author = {Birkett Huber and Rekha R. Thomas}, title = {Computing {G}r{\"o}bner fans of toric ideals.}, journal = {Experimental Mathematics}, volume = {9}, number = {3/4}, year = {2000}, pages = {321-331} } @misc{singularscript, author = {Anders Nedergaard Jensen}, title = "A {S}ingular script for verifying a {Gr{\"o}bner} fan computation.", year = 2005, note = "\url{http://home.imf.au.dk/ajensen/papers/singularscript.html}" } @article{lifting, author = {Hannah Markwig and Thomas Markwig and Anders Jensen}, title = {An Algorithm for Lifting Points in a Tropical Variety}, journal = {}, volume = {}, pages = {}, year = {2007}, eprint = {math.AG/0705.2441} } @article{Kalk, author = {Michael Kalkbrener}, title = {On the complexity of {G}r{\"o}bner bases conversion}, journal = {J. Symb. Comput.}, volume = {28}, year = {1999}, pages = {265--273} } @article {MoRo, AUTHOR = {Mora, Teo and Robbiano, Lorenzo}, TITLE = {The {G}r\"obner fan of an ideal}, NOTE = {Computational aspects of commutative algebra}, JOURNAL = {J. Symbolic Comput.}, FJOURNAL = {Journal of Symbolic Computation}, VOLUME = {6}, YEAR = {1988}, NUMBER = {2-3}, PAGES = {183--208}, ISSN = {0747-7171}, MRCLASS = {13A15 (13-04 68Q40)}, MRNUMBER = {MR988412 (90d:13004)}, MRREVIEWER = {Felipe Cucker}, } @article{onn, author = {Shmuel Onn and Bernd Sturmfels}, title = {Cutting corners}, journal = {Advances in Applied Mathematics}, volume = {23}, number = {}, year = {1999}, pages = {29-48} } @incollection {richtergebert-2003-, AUTHOR = {Richter-Gebert, J{\"u}rgen and Sturmfels, Bernd and Theobald, Thorsten}, TITLE = {First steps in tropical geometry}, BOOKTITLE = {Idempotent mathematics and mathematical physics}, SERIES = {Contemp. Math.}, VOLUME = {377}, PAGES = {289--317}, PUBLISHER = {Amer. Math. Soc.}, ADDRESS = {Providence, RI}, YEAR = {2005}, MRCLASS = {14P99 (52B70 68W30)}, MRNUMBER = {MR2149011 (2006d:14073)}, MRREVIEWER = {Eugenii Shustin}, eprint = {math.AG/0306366}, } @incollection {robbiano, AUTHOR = {Robbiano, Lorenzo}, TITLE = {Term orderings on the polynomial ring}, BOOKTITLE = {EUROCAL '85, Vol.\ 2 (Linz, 1985)}, SERIES = {Lecture Notes in Comput. Sci.}, VOLUME = {204}, PAGES = {513--517}, PUBLISHER = {Springer}, ADDRESS = {Berlin}, YEAR = {1985}, MRCLASS = {13B25 (06F15 32B05)}, MRNUMBER = {MR826583 (87e:13006)}, MRREVIEWER = {David C. Lantz}, } @book {saito, AUTHOR = {Saito, Mutsumi and Sturmfels, Bernd and Takayama, Nobuki}, TITLE = {Gr\"obner deformations of hypergeometric differential equations}, SERIES = {Algorithms and Computation in Mathematics}, VOLUME = {6}, PUBLISHER = {Springer-Verlag}, ADDRESS = {Berlin}, YEAR = {2000}, PAGES = {viii+254}, ISBN = {3-540-66065-8}, MRCLASS = {13N10 (13P10 16S32 32C38 33C80 68W30)}, MRNUMBER = {MR1734566 (2001i:13036)}, MRREVIEWER = {Francisco Jes{\'u}s Castro-Jim{\'e}nez}, } @article {tropgrass, AUTHOR = {Speyer, David and Sturmfels, Bernd}, TITLE = {The tropical {G}rassmannian}, JOURNAL = {Adv. Geom.}, FJOURNAL = {Advances in Geometry}, VOLUME = {4}, YEAR = {2004}, NUMBER = {3}, PAGES = {389--411}, ISSN = {1615-715X}, CODEN = {AGDEA3}, MRCLASS = {14P99 (13J30 14M25)}, MRNUMBER = {MR2071813 (2005d:14089)}, MRREVIEWER = {Meirav Amram-Blei}, eprint = {math.AG/0304218}, } @book {stoustrup, AUTHOR = {Stoustrup, Bjarne}, TITLE = {The C++ Programming Language}, PUBLISHER = {Addison-Wesley}, EDITION = {Third}, YEAR = {1997}, ISBN = {0-201-88954-4}, } @book {sturmfels, AUTHOR = {Sturmfels, Bernd}, TITLE = {Gr\"obner bases and convex polytopes}, SERIES = {University Lecture Series}, VOLUME = {8}, PUBLISHER = {American Mathematical Society}, ADDRESS = {Providence, RI}, YEAR = {1996}, PAGES = {xii+162}, ISBN = {0-8218-0487-1}, MRCLASS = {13P10 (14M25 52B20)}, MRNUMBER = {MR1363949 (97b:13034)}, MRREVIEWER = {P. Schenzel}, } @book {sturmfelssolving, AUTHOR = {Sturmfels, Bernd}, TITLE = {Solving systems of polynomial equations}, SERIES = {CBMS Regional Conference Series in Mathematics}, VOLUME = {97}, PUBLISHER = {Published for the Conference Board of the Mathematical Sciences, Washington, DC}, YEAR = {2002}, PAGES = {viii+152}, ISBN = {0-8218-3251-4}, MRCLASS = {13P10 (14P99 14Q15 62-09 65H10)}, MRNUMBER = {MR1925796 (2003i:13037)}, MRREVIEWER = {Joseph Gubeladze}, } @article{sturmfelstevelev, author = {Bernd Sturmfels and Jenia Tevelev}, title = {Elimination Theory for Tropical Varieties}, eprint = {math.AG/0704.3471v1}, year = {2007} } @article {theobald, AUTHOR = {Theobald, Thorsten}, TITLE = {On the frontiers of polynomial computations in tropical geometry}, JOURNAL = {J. Symbolic Comput.}, FJOURNAL = {Journal of Symbolic Computation}, VOLUME = {41}, YEAR = {2006}, NUMBER = {12}, PAGES = {1360--1375}, ISSN = {0747-7171}, MRCLASS = {68Q17 (14P25 14Q15 68Q15 68Q25)}, MRNUMBER = {MR2271330 (2007g:68052)}, MRREVIEWER = {Luis Felipe Tabera}, eprint = {math.CO/0411012}, } @article {tran, AUTHOR = {Tran, Quoc-Nam}, TITLE = {A fast algorithm for {G}r\"obner basis conversion and its applications}, JOURNAL = {J. Symbolic Comput.}, FJOURNAL = {Journal of Symbolic Computation}, VOLUME = {30}, YEAR = {2000}, NUMBER = {4}, PAGES = {451--467}, ISSN = {0747-7171}, MRCLASS = {13P10 (68W30)}, MRNUMBER = {MR1784752 (2001k:13043)}, MRREVIEWER = {Petr Lison{\v{e}}k}, } @article{Traverso, author = {Carlo Traverso}, title = {Hilbert functions and {B}uchberger algorithm}, journal = {J. Symb. Comput.}, volume = {22}, year = {1996}, pages = {355--376} } @article{vigeland-2004-, author = {Magnus Dehli Vigeland}, title = {The group law on a tropical elliptic curve}, url = {http://www.citebase.org/cgi-bin/citations?id=oai:arXiv.org:math/0411485}, eprint = {math.AG/0411485}, year = {2004} } @PhdThesis{wunderling, author = "Roland Wunderling", title = "Paralleler und objektorientierter {S}implex-{A}lgorithmus", school = "Technische Universit{\"a}t Berlin", year = "1996", note = "\url{http://www.zib.de/Publications/abstracts/TR-96-09/}", } @book{ziegler, author = {G{\"u}nter Ziegler}, title = {Lectures on Polytopes}, year = {1994}, publisher = {Springer-Verlag}, volume = {152}, series = {GTM}, } gfan0.8beta/doc/manual.dvi0000664000175000017500000117064415177170257015146 0ustar andersanders; TeX output 2026.05.07:2205! systemdict /pdfmark known{userdict /?pdfmark systemdict /exec get put}{userdict /?pdfmark systemdict /pop get put userdict /pdfmark systemdict /cleartomark get put}ifelseps:SDict begin [/Producer (dvips + Distiller)/Title ()/Subject ()/Creator (LaTeX with hyperref)/Author ()/Keywords () /DOCINFO pdfmark end! /DvipsToPDF{72.27 mul Resolution div} def/PDFToDvips{72.27 div Resolution mul} def/BPToDvips{72 div Resolution mul}def product (Ghostscript) search {pop pop pop revision 927 gt}{pop false} ifelse{/BorderArrayPatch{} def}{/BorderArrayPatch{[exch{dup dup type/integertype eq exch type/realtype eq or{BPToDvips}if}forall]}def} ifelse /HyperBorder {1 PDFToDvips} def/H.V {pdf@hoff pdf@voff null} def/H.B {/Rect[pdf@llx pdf@lly pdf@urx pdf@ury]} def/H.S {currentpoint HyperBorder add /pdf@lly exch def dup DvipsToPDF 72 add /pdf@hoff exch def HyperBorder sub /pdf@llx exch def} def/H.L {2 sub dup/HyperBasePt exch def PDFToDvips /HyperBaseDvips exch def currentpoint HyperBaseDvips sub /pdf@ury exch def/pdf@urx exch def} def/H.A {H.L currentpoint exch pop vsize 72 sub exch DvipsToPDF HyperBasePt sub sub /pdf@voff exch def} def/H.R {currentpoint HyperBorder sub /pdf@ury exch def HyperBorder add /pdf@urx exch def currentpoint exch pop vsize 72 sub exch DvipsToPDF sub /pdf@voff exch def} def!papersize=597.50787pt,845.04684ptheader=l3backend-dvips.pro!papersize=597.50787pt,845.04684ptps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endDps:SDict begin [/View [/XYZ H.V]/Dest (page.1) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin [/Count -3/Dest (section.1) cvn/Title (\376\377\000I\000n\000t\000r\000o\000d\000u\000c\000t\000i\000o\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.1.1) cvn/Title (\376\377\000T\000h\000e\000\040\000G\000r\000\366\000b\000n\000e\000r\000\040\000f\000a\000n\000\040\000o\000f\000\040\000a\000n\000\040\000i\000d\000e\000a\000l) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.1.2) cvn/Title (\376\377\000G\000r\000\366\000b\000n\000e\000r\000\040\000b\000a\000s\000e\000s) /OUT pdfmark endps:SDict begin [/Count -2/Dest (subsection.1.3) cvn/Title (\376\377\000A\000l\000g\000o\000r\000i\000t\000h\000m\000i\000c\000\040\000b\000a\000c\000k\000g\000r\000o\000u\000n\000d) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsubsection.1.3.1) cvn/Title (\376\377\000L\000o\000c\000a\000l\000\040\000c\000o\000m\000p\000u\000t\000a\000t\000i\000o\000n\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsubsection.1.3.2) cvn/Title (\376\377\000G\000l\000o\000b\000a\000l\000\040\000c\000o\000m\000p\000u\000t\000a\000t\000i\000o\000n\000s) /OUT pdfmark endps:SDict begin [/Count -4/Dest (section.2) cvn/Title (\376\377\000I\000n\000s\000t\000a\000l\000l\000a\000t\000i\000o\000n) /OUT pdfmark endps:SDict begin [/Count -1/Dest (subsection.2.1) cvn/Title (\376\377\000I\000n\000s\000t\000a\000l\000l\000a\000t\000i\000o\000n\000\040\000o\000f\000\040\000t\000h\000e\000\040\000g\000m\000p\000\040\000l\000i\000b\000r\000a\000r\000y) /OUT pdfmark endjps:SDict begin [/Count -0/Dest (subsubsection.2.1.1) cvn/Title (\376\377\000I\000n\000s\000t\000a\000l\000l\000i\000n\000g\000\040\000t\000h\000e\000\040\000g\000m\000p\000\040\000l\000i\000b\000r\000a\000r\000y\000\040\000o\000n\000\040\000M\000a\000c\000\040\000O\000S\000\040\000X\000\040\000u\000s\000i\000n\000g\000\040\000f\000i\000n\000k) /OUT pdfmark end ps:SDict begin [/Count -0/Dest (subsection.2.2) cvn/Title (\376\377\000I\000n\000s\000t\000a\000l\000l\000a\000t\000i\000o\000n\000\040\000o\000f\000\040\000t\000h\000e\000\040\000c\000d\000d\000l\000i\000b\000\040\000l\000i\000b\000r\000a\000r\000y) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.2.3) cvn/Title (\376\377\000G\000f\000a\000n\000\040\000i\000n\000s\000t\000a\000l\000l\000a\000t\000i\000o\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.2.4) cvn/Title (\376\377\000S\000o\000P\000l\000e\000x\000\040\000\050\000f\000o\000r\000\040\000t\000h\000e\000\040\000a\000d\000v\000a\000n\000c\000e\000d\000\040\000u\000s\000e\000r\000\040\000o\000n\000l\000y\000\051) /OUT pdfmark endps:SDict begin [/Count -5/Dest (section.3) cvn/Title (\376\377\000U\000s\000i\000n\000g\000\040\000t\000h\000e\000\040\000s\000o\000f\000t\000w\000a\000r\000e) /OUT pdfmark endps:SDict begin [/Count -1/Dest (subsection.3.1) cvn/Title (\376\377\000C\000o\000m\000p\000u\000t\000i\000n\000g\000\040\000t\000h\000e\000\040\000G\000r\000\366\000b\000n\000e\000r\000\040\000f\000a\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsubsection.3.1.1) cvn/Title (\376\377\000E\000x\000p\000l\000o\000i\000t\000i\000n\000g\000\040\000s\000y\000m\000m\000e\000t\000r\000y) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.3.2) cvn/Title (\376\377\000C\000o\000m\000b\000i\000n\000i\000n\000g\000\040\000t\000h\000e\000\040\000p\000r\000o\000g\000r\000a\000m\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.3.3) cvn/Title (\376\377\000I\000n\000t\000e\000r\000a\000c\000t\000i\000v\000e\000\040\000m\000o\000d\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.3.4) cvn/Title (\376\377\000I\000n\000t\000e\000g\000e\000r\000s\000\040\000a\000n\000d\000\040\000p\000-\000a\000d\000i\000c\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.3.5) cvn/Title (\376\377\000T\000o\000r\000i\000c\000\040\000i\000d\000e\000a\000l\000s\000\040\000a\000n\000d\000\040\000s\000e\000c\000o\000n\000d\000a\000r\000y\000\040\000f\000a\000n\000s) /OUT pdfmark endps:SDict begin [/Count -7/Dest (section.4) cvn/Title (\376\377\000D\000o\000i\000n\000g\000\040\000t\000r\000o\000p\000i\000c\000a\000l\000\040\000c\000o\000m\000p\000u\000t\000a\000t\000i\000o\000n\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.4.1) cvn/Title (\376\377\000T\000r\000o\000p\000i\000c\000a\000l\000\040\000v\000a\000r\000i\000e\000t\000y\000\040\000b\000y\000\040\000b\000r\000u\000t\000e\000\040\000f\000o\000r\000c\000e) /OUT pdfmark endEps:SDict begin [/Count -0/Dest (subsection.4.2) cvn/Title (\376\377\000T\000r\000a\000v\000e\000r\000s\000i\000n\000g\000\040\000t\000r\000o\000p\000i\000c\000a\000l\000\040\000v\000a\000r\000i\000e\000t\000i\000e\000s\000\040\000o\000f\000\040\000p\000r\000i\000m\000e\000\040\000i\000d\000e\000a\000l\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.4.3) cvn/Title (\376\377\000I\000n\000t\000e\000r\000s\000e\000c\000t\000i\000n\000g\000\040\000t\000r\000o\000p\000i\000c\000a\000l\000\040\000h\000y\000p\000e\000r\000s\000u\000r\000f\000a\000c\000e\000s\000\040\000\050\000p\000a\000r\000t\000i\000a\000l\000l\000y\000\040\000d\000e\000p\000r\000e\000c\000a\000t\000e\000d\000\051) /OUT pdfmark end ps:SDict begin [/Count -0/Dest (subsection.4.4) cvn/Title (\376\377\000C\000o\000m\000p\000u\000t\000i\000n\000g\000\040\000t\000r\000o\000p\000i\000c\000a\000l\000\040\000b\000a\000s\000e\000s\000\040\000o\000f\000\040\000c\000u\000r\000v\000e\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.4.5) cvn/Title (\376\377\000T\000r\000o\000p\000i\000c\000a\000l\000\040\000i\000n\000t\000e\000r\000s\000e\000c\000t\000i\000o\000n\000\040\000t\000h\000e\000o\000r\000y) /OUT pdfmark endTps:SDict begin [/Count -1/Dest (subsection.4.6) cvn/Title (\376\377\000N\000o\000n\000-\000c\000o\000n\000s\000t\000a\000n\000t\000\040\000c\000o\000e\000f\000f\000i\000c\000i\000e\000n\000t\000s\000\040\000\050\000p\000a\000r\000t\000i\000a\000l\000l\000y\000\040\000d\000e\000p\000r\000e\000c\000a\000t\000e\000d\000\051) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsubsection.4.6.1) cvn/Title (\376\377\000A\000l\000g\000e\000b\000r\000a\000i\000c\000\040\000f\000i\000e\000l\000d\000\040\000e\000x\000t\000e\000n\000s\000i\000o\000n\000s\000\040\000o\000f\000\040\000Q) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.4.7) cvn/Title (\376\377\000T\000r\000o\000p\000i\000c\000a\000l\000\040\000p\000r\000e\000v\000a\000r\000i\000e\000t\000i\000e\000s) /OUT pdfmark endps:SDict begin [/Count -8/Dest (appendix.A) cvn/Title (\376\377\000D\000a\000t\000a\000\040\000f\000o\000r\000m\000a\000t\000s) /OUT pdfmark endsps:SDict begin [/Count -0/Dest (subsection.A.1) cvn/Title (\376\377\000F\000i\000e\000l\000d\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.A.2) cvn/Title (\376\377\000V\000a\000r\000i\000a\000b\000l\000e\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.A.3) cvn/Title (\376\377\000P\000o\000l\000y\000n\000o\000m\000i\000a\000l\000\040\000r\000i\000n\000g\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.A.4) cvn/Title (\376\377\000P\000o\000l\000y\000n\000o\000m\000i\000a\000l\000s) /OUT pdfmark endnps:SDict begin [/Count -0/Dest (subsection.A.5) cvn/Title (\376\377\000L\000i\000s\000t\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.A.6) cvn/Title (\376\377\000P\000e\000r\000m\000u\000t\000a\000t\000i\000o\000n\000s) /OUT pdfmark endps:SDict begin [/Count -2/Dest (subsection.A.7) cvn/Title (\376\377\000P\000o\000l\000y\000h\000e\000d\000r\000a\000l\000\040\000f\000a\000n\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsubsection.A.7.1) cvn/Title (\376\377\000D\000a\000t\000a\000\040\000t\000y\000p\000e\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsubsection.A.7.2) cvn/Title (\376\377\000P\000r\000o\000p\000e\000r\000t\000i\000e\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.A.8) cvn/Title (\376\377\000P\000o\000l\000y\000h\000e\000d\000r\000a\000l\000\040\000c\000o\000n\000e\000s) /OUT pdfmark endps:SDict begin [/Count -55/Dest (appendix.B) cvn/Title (\376\377\000A\000p\000p\000l\000i\000c\000a\000t\000i\000o\000n\000\040\000l\000i\000s\000t) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.1) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000b\000a\000s\000e\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.2) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000b\000u\000c\000h\000b\000e\000r\000g\000e\000r) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.3) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000c\000o\000m\000b\000i\000n\000e\000r\000a\000y\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.4) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000d\000o\000e\000s\000i\000d\000e\000a\000l\000c\000o\000n\000t\000a\000i\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.5) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000f\000a\000n\000c\000o\000m\000m\000o\000n\000r\000e\000f\000i\000n\000e\000m\000e\000n\000t) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.6) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000f\000a\000n\000h\000o\000m\000o\000l\000o\000g\000y) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.7) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000f\000a\000n\000i\000s\000b\000a\000l\000a\000n\000c\000e\000d) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.8) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000f\000a\000n\000l\000i\000n\000k) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.9) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000f\000a\000n\000p\000r\000o\000d\000u\000c\000t) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.10) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000f\000a\000n\000s\000u\000b\000f\000a\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.11) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000g\000e\000n\000e\000r\000i\000c\000l\000i\000n\000e\000a\000r\000c\000h\000a\000n\000g\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.12) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000g\000r\000o\000e\000b\000n\000e\000r\000c\000o\000n\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.13) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000g\000r\000o\000e\000b\000n\000e\000r\000f\000a\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.14) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000h\000o\000m\000o\000g\000e\000n\000e\000i\000t\000y\000s\000p\000a\000c\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.15) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000h\000o\000m\000o\000g\000e\000n\000i\000z\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.16) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000i\000n\000i\000t\000i\000a\000l\000f\000o\000r\000m\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.17) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000i\000n\000t\000e\000r\000a\000c\000t\000i\000v\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.18) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000i\000s\000m\000a\000r\000k\000e\000d\000g\000r\000o\000e\000b\000n\000e\000r\000b\000a\000s\000i\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.19) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000k\000r\000u\000l\000l\000d\000i\000m\000e\000n\000s\000i\000o\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.20) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000l\000a\000t\000t\000i\000c\000e\000i\000d\000e\000a\000l) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.21) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000l\000e\000a\000d\000i\000n\000g\000t\000e\000r\000m\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.22) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000l\000i\000s\000t) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.23) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000m\000a\000r\000k\000p\000o\000l\000y\000n\000o\000m\000i\000a\000l\000s\000e\000t) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.24) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000m\000i\000n\000k\000o\000w\000s\000k\000i\000s\000u\000m) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.25) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000m\000i\000n\000o\000r\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.26) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000m\000i\000x\000e\000d\000v\000o\000l\000u\000m\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.27) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000o\000v\000e\000r\000i\000n\000t\000e\000g\000e\000r\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.28) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000p\000a\000d\000i\000c) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.29) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000p\000o\000l\000y\000n\000o\000m\000i\000a\000l\000s\000e\000t\000u\000n\000i\000o\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.30) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000r\000e\000n\000d\000e\000r) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.31) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000r\000e\000n\000d\000e\000r\000s\000t\000a\000i\000r\000c\000a\000s\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.32) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000r\000e\000s\000u\000l\000t\000a\000n\000t\000f\000a\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.33) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000s\000a\000t\000u\000r\000a\000t\000i\000o\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.34) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000s\000e\000c\000o\000n\000d\000a\000r\000y\000f\000a\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.35) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000s\000t\000a\000t\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.36) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000s\000u\000b\000s\000t\000i\000t\000u\000t\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.37) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000s\000y\000m\000m\000e\000t\000r\000i\000e\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.38) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000o\000l\000a\000t\000e\000x) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.39) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000o\000p\000o\000l\000y\000h\000e\000d\000r\000a\000l\000f\000a\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.40) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000b\000a\000s\000i\000s) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.41) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000b\000r\000u\000t\000e\000f\000o\000r\000c\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.42) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000c\000u\000r\000v\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.43) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000e\000v\000a\000l\000u\000a\000t\000i\000o\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.44) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000f\000u\000n\000c\000t\000i\000o\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.45) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000h\000y\000p\000e\000r\000s\000u\000r\000f\000a\000c\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.46) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000i\000n\000t\000e\000r\000s\000e\000c\000t\000i\000o\000n) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.47) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000l\000i\000f\000t\000i\000n\000g) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.48) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000l\000i\000n\000e\000a\000r\000s\000p\000a\000c\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.49) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000m\000u\000l\000t\000i\000p\000l\000i\000c\000i\000t\000y) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.50) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000p\000r\000e\000v\000a\000r\000i\000e\000t\000y) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.51) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000r\000a\000n\000k) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.52) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000s\000t\000a\000r\000t\000i\000n\000g\000c\000o\000n\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.53) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000t\000r\000a\000v\000e\000r\000s\000e) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.54) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000t\000r\000o\000p\000i\000c\000a\000l\000w\000e\000i\000l\000d\000i\000v\000i\000s\000o\000r) /OUT pdfmark endps:SDict begin [/Count -0/Dest (subsection.B.55) cvn/Title (\376\377\000g\000f\000a\000n\000\137\000v\000e\000r\000s\000i\000o\000n) /OUT pdfmark endNps:SDict begin [/PageMode /UseOutlines/Page 1/View [/Fit] /DOCVIEW pdfmark end/ps:SDict begin [ {Catalog}<<>> /PUT pdfmark endps:SDict begin H.S endps:SDict begin 14.5 H.A endGps:SDict begin [/View [/XYZ H.V]/Dest (Doc-Start) cvn /DEST pdfmark end<%ticolor push Black color pop+Te&DtqGcmr17GfanBvuNersion0.8beta:mAUser'sManual#􍍍y3O'XQ ff cmr12Anders/NedergaardJensen=59 tcrm1000*-l-1May/7,202699color push Black color pop<"V 3 cmbx10AbstractMƍlcolor push Black color pop-̻;K`y 3 cmr10Gfan^is]asoft!warepackdDage^forcomputingGrfobnerfansandtropical _vdDarieties.TheseNarepMolyhedralfansOassociatedtopolynomialideals.The_maximalconesofaGrfobnerfanareinbijectionwiththemark!edreduced_Grfobnerbasesofitsde ningideal. Thesoft!warecomputesallmark!ed_reducedGrfobnerbasesofanideal.OTheirunionisauniv!ersalGrfobner_basis.F~ThetropicalvdDariet!yofapMolynomialidealisacertainsubMcomplex_oftheGrfobnerfan.Gfancon!tainsalgorithmsforcomputingthiscomplex_forgeneralidealsandspMecializedalgorithmsfortropicalcurv!es,tropical_h!ypMersurfaces qand ptropicalvdDarietiesofprimeideals. Inadditiontothe_abMo!veOcorefunctionsthepac!kdDagecontainsNmanytoMolswhichareusefulin_the%study&ofGrfobnerbases,initialidealsandtropicalgeometrye.Thefull_list5ofcommands5canbMefoundinAppendixps:SDict begin H.S endcolor push BlackB color pop|ps:SDict begin H.R end{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (appendix.B) cvn H.B /ANN pdfmark end.5FeorordinaryGrfobnerbasis_computationsGfanisnotcompMetitiv!einspeedcomparedtoprogramssuc!h_asfCoCoA,SingularandMacaula!y2.(Vps:SDict begin H.S endps:SDict begin 22 H.A endHps:SDict begin [/View [/XYZ H.V]/Dest (section*.1) cvn /DEST pdfmark end>NG cmbx12Conutentsb#ps:SDict begin H.S end?N cmbx121Intro`ductionps:SDict begin 14.5 H.L endzps:SDict begin [/Subtype /Link/Dest (section.1) cvn/H /I/Border [0 0 1]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark end0S2ps:SDict begin H.S end$XQ cmr121.1VTheGr obnerfanofanidealps:SDict begin 14.5 H.L endps:SDict begin [/Subtype /Link/Dest (subsection.1.1) cvn/H /I/Border [0 0 1]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark end‰. C....................?color push Black3  color popps:SDict begin H.S end1.2VGr obnerbasesps:SDict begin 14.5 H.L endps:SDict begin [/Subtype /Link/Dest (subsection.1.2) cvn/H /I/Border [0 0 1]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endxm΍. C............................?color push Black4  color popps:SDict begin H.S end1.3VAlgorithmicbacrkgroundps:SDict begin 14.5 H.L endps:SDict begin [/Subtype /Link/Dest (subsection.1.3) cvn/H /I/Border [0 0 1]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark end򍍑. C......................?color push Black5  color pop,Jps:SDict begin H.S end1.3.1%}LoScalcomputationsps:SDict begin 14.5 H.L endps:SDict begin [/Subtype /Link/Dest (subsubsection.1.3.1) cvn/H /I/Border [0 0 1]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endFx. C.....................?color push Black5  color pop,Jps:SDict begin H.S end1.3.2%}Globalcomputationsps:SDict begin 14.5 H.L endps:SDict begin [/Subtype /Link/Dest (subsubsection.1.3.2) cvn/H /I/Border [0 0 1]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark end‰. C....................?color push Black6  color pop "!color push Blackffff џ^:tcrm0700*K`y cmr10ResearchbpartiallysuppGortedcbytheF*acultyofScience,&UniversityofAarhus,&DanishRe- searchtT*raininguCouncil(Forskeruddannelsesradet,0his>ithankfultothefollorwingpSeopleandinstitutionsforinitiallysuppSortingt*theXresearcrh:KomeiFVukudaandXHans-JakobLSvuthi(InstituteforXOperationsRe-t*searcrh,ETH%ZSvurich),DouglasLindandRekhaThomas&(UniversityofWVashing-t*ton,ESeattle)andtheAmericanInstituteofMathematics.#Theresearcrhhaslatert*bSeenGsupportedbryUniversityGofAarhus, UniversityofGMinnesota, TU-Berlin,t*the GermanResearcrhFVoundation(DFG) throughtheinstitutionalstrategyoft*Georg-August-Univrersit atGottingenandTheDanishCouncilforIndepSendenrtt*Researcrh.TheXNauthorwouldalsoliketothankXMhisformeradvisorNielsLauritzent*for?encouragingthestudyinthearea>andthemanrypSeoplewhohavebSeentesting,t*bSeenusingandhelpedimprorvingthesoftware. OtherconrtributorstotheGfansourcecoSdeinclude:t*color push BlackNT|C tcrm1200T color pop+BjarneKnrudsen(abstractparallelgraphtraverserusedformixedvolume+computationandtropicalprevXarieties)At*color push BlackNT color pop+AnrtonLeykint*color push BlackNT color pop+YVueRent*color push BlackNT color pop+JosephineYVut*ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.1) cvn /DEST pdfmark endUNff cmbx12U1.1$cTheffGrgobnerfanofanideal@TheGr obnerfanofanidealBIFE!", cmsy10EURBkg[Bx@1B;:::ʜ;xCnP]inapSolynomialringorvera eldBkisapSolyhedralcomplexconsistingofconesinNR2CnP.MWVeprorvideashortde nitionandreferthereadertothepapSersmenrtionedaborvefordetails."ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (theorem.1.1) cvn /DEST pdfmark end color push BlackDe nition1.1 color popV!LetkB!DE2 NR2Cn [andBaE2NN2CnP.)WVede nelBx2Ca :=BxnCaqAAacmr6A1/č@1 .tE.pBx2CaD;cmmi6DnRACn ".*TheB!n9S-weightofMB x2CawithNB hE2URBkEnbf0EgisB!EbBa.4mFVorBfQE2URBkg[Bx@1B;:::ʜ;xCnP]wrede neitsSinitialformxinBC!U@(BfG)jtobSethesumofallktermsinBfiwithmaximalB!n9-wreight.vFVorjanidealBIFEURBkg[Bx@1B;:::ʜ;xCnP]wrede netheSinitial35ideffal);tobSein LC!(BI):=Ehin ʤC!&(BfG):BfQE2BIEi.QDNotice:thatinitial;idealsmighrtnotbSemonomialideals.IfforsomeB!E2NR2CnRA>@0dwreharvexin TC!f(BI)UR=BIzthenxwresaythatBIzisShomoffgeneousUinxtheB!n9-grading.{WVenow xtheidealBIFEURBkg[Bx@1B;:::ʜ;xCnP]andconsidertheequivXalencerelation:獒BuUREBvËE,in Cu(BI)=in Cv (BI)onŲvrectorsųBu;v8`E2'NR2CnP.IfBI5ishomogeneousthenanryequivXalenceclassconrtainsapSositivrevector.DAnyequivXalenceclasscontainingapSositivevectorisconvex.Moreorver,itsclosureisapSolyhedralcone.8WVeusethenotationr BCC!(BI)UR:=`z pEfBuE2NRCn:in Cu(BI)=in C!2x(BI)EgtodenotetheclosureoftheequivXalenceclassconrtainingB!n9.t*color push Black,6S color pop4ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endDps:SDict begin [/View [/XYZ H.V]/Dest (page.7) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (theorem.1.2) cvn /DEST pdfmark end.color push BlackDe nition1.2 color popd[?`,De nitionZ2.8][LetBIFEURBkg[Bx@1B;:::ʜ;xCnP]bSeanideal.qTheSGrobnert*fanpof BI|is thecollectionofconesBCC!(BI)whereB!ԇE2fONR2CnRA>@0togetherwithalltheirt*non-emptryfaces. AnryPconePintheGr obnerfaniscalledaSGrobnerucffone.i;Therelativreinteriort*ofpSolyhedral=fan;see[?`]or[?].PThe=SsuppffortoftheGr obnerfani.e.Ptheuniont*of5itsconesiscalledtheSGrobnerrffegiondof5BI. IfBIpishomogeneousthenthet*Gr obnerregionisNR2Cn j&and,moreorver,theGr obnerfanisthenormalfanofthet*SstateFpffolytope,of|BI;5see[?`]{foraconstructionofthispSolytope.&The|Slineffalityspacet*ofB;apSolyhedralBTheothert*Gr obnerbasisofin bC!(BI)canbSecomputedusingatermorderrepresenrtedbythet*outernormalofthefacet.is>aneasyrulefororienrtingtheedgesofagraphsothatithasauniquesinkandunocyclesitisalsoeasyto ndauspanningtreeforthegraph.ٕTherevrersesearcrh2&willtraverse2'thisspanningtree.[ThemethoSdworks2'wellforenumeratingvrertices_$ofpSolytopes_$sinceanorientationof_#theedgeswithrespSecttoagenericvrectorwillhaveauniquesinkandnocycles.8(AproSofin[?`]shorwsthatasimilarorienrtationgorientinggBGwithrespSecttoatermorderwillalsogivreanacyclicorienrtationYwithauniquesinkandthusallowenumerationbyreversesearch.RevrersesearchisthedefaultenumerationmethoSdinGfan.If8\the8[idealissymmetricwremay8\wantto8\dotheGr obnerbasisenrumerationup1&to1'symmetryV. Forexample1&theidealBIF=UREhBa/E/BbEiBkg[Ba;b]is1&inrvXariantunder1&theexcrhangeofBaandBb.TheidealhastrwomarkedGr obnerbasesEfBa뀉z+CEBBbEgandEfBb뀉zꎑ,EBBaEg,eacrh\1de ningafulldimensionalGr obnerconein\2NR2@2.{Uptosymmetrytheyareequal.HWVeuonlyvwranttovcomputeoneofthem.HIngeneralBI2EBkg[Bx@1B;:::ʜ;xCnP]isinrvXariantunderallpSermrutationsofsomesubgroupGVEUBSCnP.yApplyingaper-mrutationi+ini*GtoamarkredreducedGr obnerbasisofBIZwregetanothermarkredreducedHGr obnerbasisHofBI.Hence,i1GactsonthesetofmarkredreducedGr obnert*color push Black,9S color pop pUps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.10) cvn /DEST pdfmark end\t*color push BlackS color popt*basesofBI.WVewishtocomputeonlyonerepresenrtativeforeacrhorbit.WVeapplyt*tecrhniquessimilartotheonesusedin[?`]forcomputingregulartriangulationsoft*pSoinrtPcon gurationsPuptosymmetryV.OftenthenrumbSerPoforbitsismruchPsmallert*thanPthePnrumbSerofreducedPGr obnerbasesandwresaveaPlotoftimebrynott*computingthemall.t*color push Black.10S color pop  ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.11) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endGps:SDict begin [/View [/XYZ H.V]/Dest (section.2) cvn /DEST pdfmark end 2(Installationb#In΋someΊsituationsinstallationofGfaniseasywhileinothersituationsitcanbSevrery3complicated.Ifyouare4satis edwithanoldvrersionofGfan,XthenyroumightjustusethepacrkXagemanageronthesystem.IfyrouareusingLinuxandhaveroSot-accessthenthefollowingmightwork color push Black color popX߆T cmtt12Xsudo,apt-getinstallgfanor color push Black color popXsudo,emergegfandepSendingAonyrourdistributionandpackXagemanager.Ifyousucceed, itisgoSodtoknorwwhichversionwasinstalled.8Run color push Black color popXgfan,_versionShouldthiscommandfail,thenyrouareusinganoldversionofgfan.AsSanalternativreStousingpackXagemanagersSasabSoveyoucanStrytoloScateangexecutable lenamed\gfan"intheinstallationofothermathsoftrware.Sage-Math,`kforHexample,conrtainsHagfanexecutable.SYVoualsoharvetheHpSossibilityofinstallingЮaЭprecompiledexecutables:gototheGfanwrebpage, .gotothebina-ries.hrtml subpage,eandfollow theinstructionsthere.a Thereishorwever onlyvreryfewexecutablesarvXailable.Therestofthissectioneplainshorw toinstallGfanbycompilingitfromsourceTheAprogramAwilloutputthepSolynomialringandthelistofreducedGr obnerbasesoftheinputideal.8Inthisexamplethereare33sucrhbases.Oftenitisconrvenienttostoreyrourgeneratorsinatext leinsteadoftrypingtheminevrerytimeyouusetheprogram.[YVoucanredirectthestandardinputforAtheprogramtoreadfroma leinsteadBofthekreybSoard."FVorexample,ifyourringandgeneratorsarestoredinthe leXmyinputfile.txtyrouwouldtypSe: color push gray 0 color popXgfan_bases,myoutputfile.txtThelistofreducedGr obnerbasescanbSetransformedinrtoapolyhedralrep-resenrtationIofHtheGr obnerfanbyHusingtheprogramXgfanff}r-topolyhedralfanasexplainedinSectionps:SDict begin H.S endcolor push gray 03.2 color popDEps:SDict begin H.R endps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (subsection.3.2) cvn H.B /ANN pdfmark end.HereisanotherexampleofapSolynomialringandanideal: color push gray 0 color popXZ/3Z[x_1,x_2,x_3]{x_1^2x_2-x_3,x_2^2x_3-x_1,x_3^2x_1-x_2} color push Blackffff ^ٓRcmr71ps:SDict begin H.S endps:SDict begin H.R endIps:SDict begin [/View [/XYZ H.V]/Dest (Hfootnote.1) cvn /DEST pdfmark endItk}isk|actuallymuchmorek}convenienttok|usetheEmacsshell.#InEmacspressMeta-xandtypGe shell.eWhen1you1areintheEmacsshellCtrl-upwillallowyouto1easilyreinputoldpGolynomialdataUUtoGfan. color popt*color push Black.16S color popps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.17) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.1) cvn /DEST pdfmark end 3.1.1)@Exploitingsymmetry@As7explainedin7Subsectionps:SDict begin H.S endcolor push gray 01.3.2 color pop' DEps:SDict begin H.R end' ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (subsubsection.1.3.2) cvn H.B /ANN pdfmark endtheprogramcandoitscomputationsuptosym-metryV.8In/the0exampleabSorvewe/maycycle/thethreevXariableswithoutcrhangingtheideal.HencethesubgroupBGEBSCn ZinSubsectionps:SDict begin H.S endcolor push gray 01.3.2 color pop' DEps:SDict begin H.R end' ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (subsubsection.1.3.2) cvn H.B /ANN pdfmark endisthegroupgener-ated3abrya3bthreecycle. A3Owaytowritedown3bthesubgroupisbywriting3balistofpSermrutationsthatgeneratethesubgroup:; color push gray 0 color popX{(0,1,2),(1,2,0)}The rstpSermrutationistheidenrtity(whichcanbSeleftout).7ThesecondpSer-mrutationisthree-cycle.!oTVogethertheygenerateBG.!pSeeAppSendixps:SDict begin H.S endcolor push gray 0A color popps:SDict begin H.R end{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (appendix.A) cvn H.B /ANN pdfmark endformoreinformationonhorwtospSecifythepermrutations.The`option_X--symmetrytellsXgfantodoitscomputationsuptosymmetryV.FVorexample,; color push gray 0 color popXgfan_bases,--symmetrymyoutputfile.txtt*ThiswillcomputeaSuniversal35Grobnerbffasis. In$EthreevXariables,2ifwre$Dwant$Etodrarwstaircasediagramsoftheinitialidealst*wremayusetheprogramXgfanff}r-renderstaircase:+.color push gray 0 color popt*Xgfan_bases,--symmetryout.figt*TheFIoutputFJ leisthex g leinFigureps:SDict begin H.S endcolor push gray 01 color popDEps:SDict begin H.R endyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (figure.1) cvn H.B /ANN pdfmark end.TVosarveFIpapSerweFIusedtheX--symmetryt*optionmBandmCgarvethemCprogramthe lealsoconrtainingthegroupgeneratorsast*input. InqthreevXariables,ifwreqwantqtodrarwtheGr obnerfan-orratherdrarwthet*inrtersectionGofHthe2-dimensionalstandardsimplexwiththeGr obnerfanwremayt*usetheprogramXgfanff}r-render:+􍍍.color push gray 0 color popt*Xgfan_bases,myoutputfile.figt*TheQoutputRisshorwninFigureps:SDict begin H.S endcolor push gray 02 color popDEps:SDict begin H.R endyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (figure.2) cvn H.B /ANN pdfmark end. IftherearemorethanthreevXariablesint*thetpSolynomialuringthisprogramcanstillbSeusedbutitismoredicult.3ESeet*AppSendixps:SDict begin H.S endcolor push gray 0B.30 color popUps:SDict begin H.R endUps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (subsection.B.30) cvn H.B /ANN pdfmark end.t*ops:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.3) cvn /DEST pdfmark endU3.3$cInteractiveffmos3de@TVostudytheloScalstructureoftheGr obnerfantheprogramXgfanff}r-interactiveisczuseful.WItallorwstheusertowalkalonganc{arbitrarypathoffulldimensionalt*color push Black.18S color pop0ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.19) cvn /DEST pdfmark end\t*color push BlackS color popbSt*0Kcolor push BlackϴS*gIcolor push Black color popm)7PSfile="gfan.eps" llx=0 lly=0 urx=850 ury=737 rhi=1672 %\color push BlackFigure2:8ps:SDict begin H.S endps:SDict begin H.R endFps:SDict begin [/View [/XYZ H.V]/Dest (figure.2) cvn /DEST pdfmark endTheGr obnerfanoftheidealinrtersectedwiththestandardsimplex. color pop color pop t*Gr obnerFconesintheGrobnerfanoftheideal.'ArteachsteptheuserwillspSecifyt*whicrhS;facettowalkthrough.rTheinputmustbSeamarkedS:Gr obnerbasis.rThet*programEwillminimiseFandautoreduceifnecessarytogetthereducedGr obnert*basis.8FVorexamplerunningtheprogram.color push gray 0 color popt*Xgfan_interactivet*withinput.color push gray 0 color popt*XQ[a,b,c]t*{t*c^15-c,t*b-c^11,t*a-c^9}t*willLgivreKusalistoffacetstowralkthrough.U(OnewaytoKgetastartingGr obnert*basis oisbryusing ntheprogramXgfanff}r-buchberger.)5Inthiscaseonlytrwo o ipsaret*pSossible,\sinceHtheIthirdwralldoSesnotleadtoanewGr obnercone.({Thewrallist*on9?the9>bSoundaryoftheGr obnerregion.WVemarychoSose9?anyof9?thetwo9?remainingt*facetsbrytypinginanindex(anumbSer)followedbyB. SeeAppSendixt*ps:SDict begin H.S endcolor push gray 0B.17 color popUps:SDict begin H.R endUps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (subsection.B.17) cvn H.B /ANN pdfmark endformoreoptions.t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.4) cvn /DEST pdfmark endU3.4$cIntegersffandp-adics@Gfan[handles[trwosettingsinwhich[theusualdivisionandBucrhbSergeralgorithmsdo!not!suce.ݸTheseareidealsinNZ[Bx@1B;:::ʜ;xCnP]andNQ[Bx@1B;:::ʜ;xCnP],/Wwhere,inthelatterTsetting,]theBp-adicvXaluationistakrenintoTaccountwhende ninginitialideals.t*color push Black.19S color popps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.20) cvn /DEST pdfmark end\t*color push BlackS color pop ArtpthemomentthesetwosettingsarehandledbythecommandsXgfanff}r-overintegerst*and(Xgfanff}r-padic.bTheyallorwthe)computationofGr obnerbases,initialideals,t*Gr obnerO2cones(orpSolyhedra)O1andGrobnerfans(orcomplexes).f}Inthissectiont*wregivetwoexamples.8UsetheX--helpoptiontogetthefulldoScumentation.9t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (theorem.3.1) cvn /DEST pdfmark end.color push gray 0Example3.1 color pop]I{TVoocomputetheoGr obnerfanof[?`,Example3.9],withotheidealt*consideredintheringNZ[Ba;b;c]wrerunthecommandr.color push gray 0 color popt*Xgfan_overintegers,--groebnerFan-g--log1qt*on.color push gray 0 color popt*XQ[a,b,c]t*{a^5+b^3+c^2-1,,b^2+a^2+c-1,c^3+a^6+b^5-1}t*SinceIfthetrypSe-systemofIeGfandoesnotunderstandXZ[a,b,c]wreIeneedtotrickGfant*bryLspSecifyingLtheringBQ[Ba;b;c]LwhenrunningvXgfanxfff:orverintegers.OFVromtheLoutputt*wreconcludethattheidealhas1659reducedGr obnerbasesovertheintegers(ast*oppSosedto360orvera eldofcrharacteristic0).9t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (theorem.3.2) cvn /DEST pdfmark end.color push gray 0Example3.2 color pop]I{TVo!computethereduced"Gr obnerbasisofBIF=UREhBx@1s+2o2Bx@2tE3Bx@3B;3Bx@2Et*4Bx@3+5Bx@4EiNQ[Bx@1B;:::ʜ;x@4]withrespSecttothevrector(1B;0B;0B;1)(tie-brokrenlexi-t*cographically)andwithNQharvingthe2-adicvXaluation,werun.color push gray 0 color popt*Xgfan_padic,--groebnerBasis-p2qt*ontheinput.color push gray 0 color popt*XQ[x1,x2,x3,x4]t*{t*x1+2x2-3x3,t*3x2-4x3+5x4t*}t*(1,1,0,0,1)t*TheR rstcoSordinateoftheinputvrectorisa1,+|sinceff} ]padicrequires\homoge-t*nized"JwreightJvectors. W1ThisisExampleJ2.4.3in 1[?`]. W2Thedivisionalgorithmt*implemenrted+inGfan+usedforthiscomputationwraspropSosedbyMaclagan.jTVot* ndallinitialideals,wrecanuseacomrbinationofJXgfanff}r-padic,--groebnerBasis,t*Xgfanff}r-combinerays,--sectionCONES-ifilenamepandXgfanff}padic,--initialIdealst*-m. NoticethattheGr obnercomplexofBI,wherevXaluationistakrenintoaccountt*(seepMaclagan-Sturmfels),Hisnotafan.xTheoutputofrXgfanff}r-padic,--groebnerComplex,t*horwever,willbSeafan.2TTVogettheGr obnercomplexwreneedtointersectthefant*withthehrypSerplaneB!@0V=UR1. NOTICE THAVTɈff} ~Xpadic "USESTHE MINIMUMCONVENTIONAVTTHEt*MOMENT-inordertobSeconsistenrtwithMaclaganandSturmfels.t*color push Black.20S color pop ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.21) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.5) cvn /DEST pdfmark end U3.5$cTforicffidealsandsecondaryfans@Gfan߷isareplacemenrtofthesoftwareCaTSߵ[?`]whichcomputesGr obnerfansoftoricYfandYelatticeideals.FVorconrvenienceaYfprogramforcomputinglatticeidealshasnbSeenaddedtoGfan."TVocomputetheolatticeidealofthelatticegeneratedbry(2B;E1B;0)and(3B;0B;E1)wrerun: color push gray 0 color popXgfan_latticeideal{(2,-1,0),(3,0,-1)}Gfanwilltransformthegeneratorsinrtobinomialsandcomputethesaturationof\the[idealtheygeneratebrytheproSductofallvXariables.ThecomputationisindepSendenrtofthecharacteristicofthe eld.IfeonftheotherhandwrewishtocomputethetoricidealofaSveffctorwcon gura-tionXgivrenbythecolumnsofthe1E3-matrix(1B;2B;3)wrerun color push gray 0 color popXgfan_latticeideal,-t{(1,2,3)}MorerorwscanbSeaddedtothematrixifwewant.Thebcrhoiceboftheterm\vectorbcon guration"isintentionalbandnonstandard.The|reason{forthiswillbSecomeclearlaterinthissection.InGfanterminologyaSpffointcon gurationispreservredforothecollectionofpSoinrtswehavebSeforeoweadda/rorw/ofonestoconstructaprojectivretoricvXarietryV.Byaddingtherow/ofonesthe.pSoinrtcon guration-isturnedintoavector-con guration.-bNoticethatscalingavrectorofavectorcon gurationmaychangeitstoricideal.ComputingtoricidealsGfanisnotoptimal.lIfoneneedstodobigexamplesthesoftrware4ti2[?`]isrecommended.FVoratoricidealtheradicalofamonomialinitialidealistheStanley-ReisneridealRofRaregulartriangulationofthepSoinrtcon guration,see[?`]. qHencethetoricˢGroSebnerfanisaˣre nemenrtoftheSseffcondaryNfan,CindexingˢallregulartriangulationofthepSoinrtcon guration.The!secondary!fanofthevrectorcon gurationEf(1B;0)B;(1B;1)B;(1B;2)B;(1B;3)Eg!canbSecomputedbrytyping color push gray 0 color popXgfan_secondaryfan{(1,0),(1,1),(1,2),(1,3)}ComparingrEthistothe nerGr obnerfanrDofthecorrespSondingtoricidealwhicrh yrougetbydoing color push gray 0 color popYgfan_transposematrix |?gfan_latticeideal-t|gfan_bases|gfan_topolyhedralfan{(1,0),(1,1),(1,2),(1,3)}yrourealisethatthreemonomialinitialidealsofthetoricidealharvethesameradical,whilefourmonomialinitialidealspairwiseharvethesameradical.t*color push Black.21S color popps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.22) cvn /DEST pdfmark end\t*color push BlackS color pop Thesecondaryfancomputationwrasaddedforconrvenience. &Analterna-t*tivrenistonuseTOPCOMn[?`].Noticehowever,thatthenvectorcon gurationsfort*gfanxfff:secondaryfandonotharvetobSepoinrted./Thismeansthatallcombinatorialt*trypSesoofpolytopeswitha xedsetofpnormalscanbeeasilyenrumerated.D5Thisist*notpSossiblewithTOPCOM.t*color push Black.22S color pop+ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.23) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endGps:SDict begin [/View [/XYZ H.V]/Dest (section.4) cvn /DEST pdfmark end 4(Doingztropicalcomputationsb#SThisoseffctionfollowsthemaxconventionforotropicalarithmetic. Forthenon-cffonstant35coecientcasetropicalvarietiesarede nedasin[?`S]and[?S].InthissectionwreexplainhorwtouseGfantodotropicalcomputations.FVora xedidealBIGEBkg[Bx@1B;:::ʜ;xCnP]thesetofallfacesofallfull-dimensionalGr obnerconescisacpSolyhedralcomplexwhicrhwecallctheGr obnerfanofBI.FVortropicalcomputations!the"lorwerdimensional"conesofthecomplexwillbSeofourinrterest.IngeneralevreryGr obnerconeisoftheform:lBCC!(BI)UR:=`z: pEfB!n9F0E2NRCn:in C!I{Gq% cmsy6G0?(BI)=in C!2x(BI)EgGB:WVeGde nethetropicalvXarietryET (BI)ofanidealFBItobSethethesetofallB!sucrhcomputethe>tropicalvXarietryofanidealwremustbSeginby nding>astartingBd-dimensionalGr obnercone.+FVorthisXgfanff}r-tropicalstartingconeisused.+AfterharvingcomputedastartingconeweusetheprogramXgfanff}r-tropicaltraversetotrarversethetropicalvXarietyV.8WeillustratetheproScedurewithanexample.ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.3) cvn /DEST pdfmark end color push gray 0Remark4.3 color popJN6GfanRdoSesitscomputationsorverRNQandthrustheinputshouldbeanidealgeneratedbrypSolynomialsinNQ[Bx@1B;:::ʜ;xCnP].GTheassumptionthatBIMisan*idealinNC[Bx@1B;:::ʜ;xCnP]isneededsince*bry\primeideal"intheabSovewemean\prime2idealinthepSolynomialringorver2the2algebraicallyclosed eldNC".IfBI$ isaprimeNdidealNcinNQ[Bx@1B;:::ʜ;xCnP]wredonotknorwthatitstropicalvXarietryisconnected.InSectionps:SDict begin H.S endcolor push gray 04.6 color popDEps:SDict begin H.R endps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (subsection.4.6) cvn H.B /ANN pdfmark endwreaddresstheproblemofspSecifyingnon-rationalcoecienrts.t*color push Black.24S color popCps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.25) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.4) cvn /DEST pdfmark end.color push gray 0Example4.4 color pop]I{LetBIFEURNQ[Ba;:::ʜ;o] bSetheidealgeneratedbrytherelationsonthet*2#bry2minorsofa2"by6genericmatrix.$^InNC[Bx@1B;:::ʜ;xCnP]theidealBIgeneratesat*primeVideal.~TVogetaVstartingconeforthetrarversalVofET (BI)wrerunthecommand/.color push gray 0 color popt*Xgfan_tropicalstartingcone.t*ontheinput.color push gray 0 color popt*XQ[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o]t*{t*bg-aj-cf, Ybh-ak-df,bi-al-ef,ck-bm-dj,ch-am-dg,t*cl-ej-bn, Yci-eg-an,dn-co-em,dl-bo-ek,di-ao-eh,t*gk-fm-jh, Ygl-fn-ij,hl-fo-ik,kn-jo-lm,hn-im-got*}t*andgetapairofmarkredreducedGr obnerbases/.color push gray 0 color popt*XQ[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o]t*{t*l*m+j*o, Yi*m+g*o,i*k-h*l,i*j-g*l,h*j-g*k,t*e*m+c*o, Ye*k+b*o,e*j-c*l,e*h+a*o,e*g-c*i,t*c*k-b*m, Yc*h-a*m,b*i-a*l,b*h-a*k,b*g-a*j}t*{t*l*m-k*n+j*o,,i*m-h*n+g*o,i*k-h*l+f*o,i*j-g*l+f*n,h*j-g*k+f*m,t*e*m-d*n+c*o,,e*k-d*l+b*o,e*j-c*l+b*n,e*h-d*i+a*o,e*g-c*i+a*n,t*c*k-d*j-b*m,,c*h-d*g-a*m,b*i-e*f-a*l,b*h-d*f-a*k,b*g-c*f-a*j}t*ThisJ-takresJ,abSoutasecond.WnWVestoretheoutputinthe leXgrassmann2ff}r-6.conet*forIlateruse.)kSinceBIhasmanryHsymmetriesweaddthefollowinglinesdescribingt*thesymmetrygrouptotheendofthe le:/.color push gray 0 color popt*X{t*(0,8,7,6,5,4,3,2,1,14,13,11,12,10,9),t*(5,6,7,8,0,9,10,11,1,12,13,2,14,3,4)t*}t*WVearereadytotrarverseET (BI).8Werunthefollorwingcommand/.color push gray 0 color popt*Xgfan_tropicaltraverse,--symmetry cmmi10FcontainingallfacesofFcontainingR.  ^3ps:SDict begin H.S endps:SDict begin H.R endIps:SDict begin [/View [/XYZ H.V]/Dest (Hfootnote.3) cvn /DEST pdfmark endtakean-ballaroundarelativeinterior!"!!", cmsy102RdandintersectitwithFc.PT*ranslatingtheball toUUtheoriginandscalingtheintersectiontoin nitywegetthelinkofRiinFc. color popt*color push Black.29S color popps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.30) cvn /DEST pdfmark end\t*color push BlackS color pop TVo'demonstrate(theGfanfeatureswrerecompute[?`,Example3.10]._Aneasyt*wray;to;generatetheBkg-cycleofthatexampleistocomputeitasahrypSersurface.t*SincethepapSerisusingminandGfanisusingmaxwreneedtocrhangethet*pSolynomialfromthepapersucrhthattheNewtonpolytopeis ipped:U.color push gray 0 color popt*Xgfan_tropicalhypersurface,>tmpfile1.polyt*Q[x_1,x_2,x_3]t*{x_2x_3+x_1x_3+x_1x_2+x_1x_2x_3}Vt*Thetwreights/multiplicitiestarestoredintheMULVTIPLICITIESt,sectionofthet*Prolymake le. ItBisharderBspSecifyingtherationalfunction.@WVemakrethefollorwing leandt*callinXfunc.poly.UU.color push gray 0 color popt*Y_application?PolyhedralFant*_version?2.2t*_type?PolyhedralFant*AMBIENT_DIMt*3t*DIMt*2t*LINEALITY_DIMt*0t*RAYSt*1?00#0t*0?10#1t*0?01#2t*-1?-1-1#3t*1?10#4t*-1?-10#5t*N_RAYSt*6t*LINEALITY_SPACEt*ORTH_LINEALITY_SPACEt*1?00t*0?10t*0?01t*MAXIMAL_CONESt*{3?5}#Dimension2t*{5?2}t*{0?2}t*{1?2}t*{1?3}t*color push Black.30S color popps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.31) cvn /DEST pdfmark end\t*color push BlackS color popt*Y{0?3} t*{1?4}t*{0?4}t*MULTIPLICITIESt*1t*1t*1t*1t*1t*1t*1t*1t*RAY_VALUESt*0t*0t*0t*1t*-1t*0t*LINEALITY_VALUESmt*InsteadSofspSecifyingthelinearfunctiononSeacrhmaximalconewehavetospSecifyt*itsbvXaluesboneacrhoftherarysinthefanandeacrhofthegeneratorsofthelinealitryt*space.!WThen GfanwillautomaticallyinrterpSolatethefunction.Sincethelinealitryt*spaceofthefanisemptryweleavetheLINEALITYxfff:VALUESsectionemptyV. WVenorwcomputetheWeildivisor:o.color push gray 0 color popt*Ygfan_tropicalweildivisor?-i1tmpfile1.poly-i2func.poly>tmpfile2.polyot*...andcomputetheWVeildivisoragainasin[?`]....color push gray 0 color popt*Ygfan_tropicalweildivisor?-i1tmpfile2.poly-i2func.poly>tmpfile3.polyヘt*WVegetafanwiththeoriginbSeingtheonlycone.8IthasmrultiplicityE1:.color push gray 0 color popt*XMULTIPLICITIESt*-1% #,Dimension0 ThereisanotherusefulcommandforcomputingpSolyhedralfansforrationalt*functions.The~command~Xgfanff}r-tropicalfunctiontakresapSolynomialandturnst*itsinrtoafanrepresentingitsrtropicalizationwhichisatropicalrationalfunction.t*'ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.6) cvn /DEST pdfmark endU4.6$cNon-constantffcos3ecients(partiallydeprecated)@Theeasiestwaytocomputetropicalprev@arietiesisbyusingthecom-mandb3XgfanZff ώ)tropicalprev@arietyb4intro`ducedinb4gfan0.7.SeeSectionps:SDict begin H.S endcolor push gray 04.7 color pop@DEps:SDict begin H.R end@ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (subsection.4.7) cvn H.B /ANN pdfmark end.Thecurrentsectioniskeptforcompatibilityreasons.t*color push Black.31S color pop ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.32) cvn /DEST pdfmark end\t*color push BlackS color pop InQtropicalgeometryRitiscommontotakrethevXaluationofNCEffBtEgginrtoaccountt*whende ningthetropicalvXarietryofanidealinNCEffBtEgg[Bx@1B;:::ʜ;xCnP].HereNCEffBtEggt*denotesthe eldofPuiseuxseries.S;ThevXaluationvalN(Bp)ofanon-zeroPuiseuxt*seriesBpisthedegreeofitslorwestorderterm.Ӊt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.7) cvn /DEST pdfmark end.color push gray 0De nition4.7 color popdFVorfB!E2(NR2Cn &theSt-B!n9S-deffgreeLoffaftermBct2CaBx2Cv SwithBc(E2(NC2F,BaE2NQt*andZBv5E2tNZ2Cn isde nedZasEvXal(Bct2Ca)+B!UEBv=tEBa+B!UEBvn9. pTheZSt-initialTformt*t-in :C!&ͼ(BfG)E2NC[Bx@1B;:::ʜ;xCnP]ofapSolynomialBfE2NCEffBtEgg(n[Bx@1B;:::ʜ;xCnP]isthesumofallt*termsinBf2ofmaximalt-B!n9-wreightbutwith1substitutedforBt.ӊt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.8) cvn /DEST pdfmark end.color push gray 0Remark4.8 color popX`NoticeVthatVsinceBthast-B!n9-degreeE1,qthemaximalt-B!n9-wreightVSist*attainedbryatermifthepSolynomialisnon-zero. .FVurthermore,onlya nitet*nrumbSerZof[termsattainthemaximrum.nTherefore,ևitmakesZsensetosubstitutet*BtUR=1andconsiderthe nitesumoftermsasapSolynomialinNC[Bx@1B;:::ʜ;xCnP].t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.9) cvn /DEST pdfmark end.color push gray 0Example4.9 color pop]I{ConsiderqABfk=:k(1L+Bt)+Bt2@2Bx+Btx2@2pE2:lNCEffBtEgg)#R[Bx@1B;:::ʜ;xCnP].̪LetqAB!=t*(Fu33@133z@2j)VE2NR2@1.;1Thennt-in2~C!E(BfG)=V1/+Bx2@2.;1FVornanryotherchoiceofB!Ythet-initialformist*amonomial.ӊt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endJps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.10) cvn /DEST pdfmark end.color push gray 0De nition4.10 color popkULetEBIE_NCEffBtEgg(E[Bx@1B;:::ʜ;xCnP]andB!^E2`NR2Cn.J(TheSt-initialideffalSoft*BI+withrespSecttoB!Xisde nedas:@h|t-in{>C!Q(BI)UR:=Eht-inGC!Y(BfG):BfQE2BIEiNC[Bx@1B;:::ʜ;xCnP]B:At*ps:SDict begin H.S endps:SDict begin 14.5 H.A endJps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.11) cvn /DEST pdfmark end.color push gray 0De nition4.11 color popkULetBIFEURNCEffBtEgg(>8[Bx@1B;:::ʜ;xCnP]bSeanideal."TheStrffopicalvarietycoft*BI+isthesetfET ͟ F0(BI)UR:=EfB!ËE2NR Cn:t-inbC!(BI)ismonomial-freeXEgB:ōt*WVeusethenotationET ͟2F0(BI)toarvoidcontradictingouroriginalde nitionofthet*tropicalvXarietryofanidealinthepSolynomialringovera eld.t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endJps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.12) cvn /DEST pdfmark end.color push gray 0Prop`osition4.12 color popuCS[?`S,YPrffopositionR7.3]RLetBIEqNC[Bt;x@1B;:::ʜ;xCnP]RSbffeanideal,YBJ=t*EhBIEiOCFffCtFgg@[CxqA1*C;:::\;xDn7@]ASand35B!ËE2URNR2CnPS.fiThent-inzEC!(BI)UR=t-inbC!(BJr)S.ӊt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endJps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.13) cvn /DEST pdfmark end.color push gray 0Remark4.13 color pop_`FVorBfQE2URNC[Bt;x@1B;:::ʜ;xCnP]wrehavet-ineC!w(BfG)UR=(in ʤ@(F@1C;!I{@)#(Bf))EjCt@=1nF.Con-t*sequenrtlyV,!for}@BIFEURNC[Bt;x@1B;:::ʜ;xCnP]wrehavet-inPC!(BI)UR=(in ʤ@(F@1C;!I{@)#(BI))EjCt@=1nF.gIn}@ordertot*decidegift-inC!(BI)conrtainsamonomialwegmaysimplydecideiftheinitialidealt*in>Ο@(F@1C;!I{@)2&(BI)conrtainsamonomial.8Asacorollaryweget@{cET (BI)E\(Ef1EgNR CnP)UR=Ef1EgT F0(BJr)B:A InfactthisgivresamethoSdforcomputingthetropicalvXarietryasasetofanryt*idealP0BJE#NCEffBtEgg[Bx@1B;:::ʜ;xCnP]generatedP/bryelementsinP/thepSolynomialringorvert*the9 eldof9rationalfunctionsNQ(Bt)[Bx@1B;:::ʜ;xCnP]inGfanbryclearingdenominatorst*andjinrtersectingjtheresultwiththeBt/=E1plane.(WVeremindjthereaderthatt*Lemma Aps:SDict begin H.S endcolor push gray 04.1 color popDEps:SDict begin H.R end|ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (theorem.4.1) cvn H.B /ANN pdfmark end @shorwsthatforcomputationalpurpSosesitisnorestrictionifBIisnott*homogeneous.)t*color push Black.32S color pop!ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.33) cvn /DEST pdfmark end\t*color push BlackS color pop InrtersectingothetropicalpvXarietywiththeBt,n=E1oplanecanpwithsomedif-t* cultry bSedonebyhand.Ifthetropical(pre)-vXarietyhasbSeencomputedwitht*Xgfanff}r-tropicalintersectionUthenVitisalsopSossibletoletGfandotheinrtersec-t*tion.3WhatGfandoSesistocomputethecommonre nemenrtofthefanwiththet*fanAconsistingoftheBhalfspaceBtURE0AanditspropSerface.4OfcoursethisdoSesnott*remorveZtheZconesintheBt=0Zplane,vybuttheyareeasilyremorvedbyZhand.oWVet*illustratetheproScedurebryanexample.tt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endJps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.14) cvn /DEST pdfmark end.color push gray 0Example4.14 color popd {ExerciseD2DinChapter9of[?`]asksustodrarwthevXarietryde nedt*bryJtheJStrffopical:pSolynomialBf@=1Bx2@2+2BxyZ=+1Byn92@2A+3Bx+3By+1.XIfJwreJtropicallyt*divideethisfpSolynomialbry3wefgetBfG2F0k:=URBfG=3=E2Bx2@2E1Bxy>E2Byn92@2CB+0Bx+0By=+E2t*whicrhde nesthesametropicalvXarietyV.ThisvXarietyequalsthevXarietyde nedt*bry!the"pSolynomialBgË=URBt2@2Bx2@2B+Btxy+Bt2@2Byn92@2+Bx+By+Bt2@2VE2URNCEffBtEgg[Bx;yn9].2^Notice!thatt*BfG2F0isthetropicalisationofBgn9. According toRemarkps:SDict begin H.S endcolor push gray 04.13 color pop〟DEps:SDict begin H.R end}ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (theorem.4.13) cvn H.B /ANN pdfmark endabSorve thewremaycomputeET ͟2F0(EhBgn9Ei)bycomputingt*thevXarietryofEhBt2@2Bx2@2+QBtxy+QBt2@2Byn92@2+Bx+QBy+Bt2@2EiURNC[Bt;x;yn9]andinrtersectingitwitht*thehrypSerplaneBtUR=E1.8Running"鍍.color push gray 0 color popt*Xgfan_tropicalintersection,--tplanet*on.color push gray 0 color popt*XQ[t,x,y]t*{t^2x^2+txy+t^2y^2+x+y+t^2}"荑t*wreget.color push gray 0 color popt*XRAYSt*0,-10#0t*-1,21#1t*0,11#2t*-1,11#3t*-1,-2-2#4t*0,0-1#5t*-1,12#6t*MAXIMAL_CONESt*{3,4}#Dimension2t*{2,6}t*{1,3}t*{1,2}t*{3,6}t*{4,5}t*{0,4}t*{0,6}t*{1,5}t*color push Black.33S color pop"~ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.34) cvn /DEST pdfmark end\t*color push BlackS color popWR΍t*;2color push BlackR΍*y؂color push Black color pop~;PSfile="nonconst.eps" llx=0 lly=0 urx=173 ury=173 rhi=1559 %Figure3:ps:SDict begin H.S endps:SDict begin H.R endFps:SDict begin [/View [/XYZ H.V]/Dest (figure.3) cvn /DEST pdfmark endThetropicalvXarietryde nedbythetropicalpSolynomialinExampleps:SDict begin H.S endcolor push Black4.14 color pop〟DEps:SDict begin H.R end}ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (theorem.4.14) cvn H.B /ANN pdfmark end. color pop t*amongQCotherinformation.lWVecannorwdrawtheQDtwo-dimensionalpictureaskedt*for؆intheexercise.2Theraryswithnon-zero rstcoSordinate؅become؆points؆inthet*picture.}(IfVthe rstcoSordinateisnotVE1scalingisrequiredtogettherationalt*Bx;yn9-coSordinates.)Theraryswithzero rstcoSordinatebecomedirections.Thet*maximal*cones+shorwhowto+connecttherarys; seeFigureps:SDict begin H.S endcolor push gray 03 color popDEps:SDict begin H.R endyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (figure.3) cvn H.B /ANN pdfmark end.gNoticethatsomeoft*theconnectionscouldharvebSeen\atin nitry".t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.6.1) cvn /DEST pdfmark end *4.6.1)@Algebraic eldextensionsofNQ@Ignoring1time,memoryusage0andorver owsGfan1cancomputethetropicalvXarietryET ͟2F0(BI)pofanryidealBIFEURNCEffBtEgg(>8[Bx@1B;:::ʜ;xCnP]generatedbyelementsofKz UW NQ (Bt)[Bx@1B;:::ʜ;xCnP].Thisisaconsequenceofthefollorwinglemma:ps:SDict begin H.S endps:SDict begin 14.5 H.A endJps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.15) cvn /DEST pdfmark end color push gray 0Lemma4.15 color popMQS[?`S,ELffemmaA3.12]LetABkSbeaA eldandABMk=pEhBmEipBkg[Ba]SaAmaximalideffal[whereBm[Sisnotamonomial.߮LetBIE-(Bkg[Ba]B=XM@)[Bx@1B;:::ʜ;xCnP]Sbeanideal.߮ForB!ËE2URNR2Cn ۅSwe35havein'GC!-(BI)conrtainsamonomialqcE()URin @(0C;!I{@) kh(B' F@1 \|(BI))conrtainsamonomialSwherffetB':Bkg[Ba;x@1B;:::ʜ;xCnP]E!(Bkg[Ba]B=XM@)[Bx@1B;:::ʜ;xCnP]tSistthehomomorphismtakingelements35totheircffosets.ʫps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.7) cvn /DEST pdfmark endU4.7$cTfropicalffprevarieties@Asexplainedearlier,YatropicalprevXarietryisde nedtobSeaninrtersectionof nitelymanryOtropicalPhypSersurfaces.mSuchintersectionPcanbSecomputedbryeithertheoldcommand"hgfanxfff:tropicalinrtersectionor"ithenewcommandgfanxffftropicalprevXarietryinrtroSducedinGfanversion0.7.t*color push Black.34S color pop#lps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.35) cvn /DEST pdfmark end\t*color push BlackS color pop ThereiaresevreraljchoicesitobSemadewhende ningthetropicalprevXarietryt*of:a;listofpSolynomialsinNCEffBtEgg(![Bx@1B;:::ʜ;xCnP],PforexamplewhetherBtshouldharvet*vXaluation`++1or`,E1,{whetherthevaluegroup`,shouldbSeorderedinthepSositivreort*negativڣdirectionڢ(andwhethergfanshould\coneorver"theڣcomplexatBx@0V=URE1t*orBx@0V=UR1togetthefan-likreoutput). Horwever,themostsensiblecrhoicesarejusttohavetheequation>ꍒ0BT(BI)E\NQ Cn=URvXalH(BVp(BI))>덑t*satis ed,0wherevXaliscoSoridinate-wisevXaluation.-Thislearvesthecrhoiceofthink-t*ingofNCEffBtEgg,asharvingincreasingexpSonentsinBt(min)ordecreasingexpSonentst*inBt(max)andtakingvXaluationtobSeBt-exponenrtoftheleadingtermofaseries. In=addition=tothesecrhoices,`upartoftheliteraturemixesmaxandminconrven-t*tions]to]harveincreasingPuiseuxseries]whilefollowingconventionsof]the(global)t*Gr obnerpdfanpctheory(usingSouternormals).ThisisconsistenrtwithDe nitionps:SDict begin H.S endcolor push gray 04.7 color popDEps:SDict begin H.R end|ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (theorem.4.7) cvn H.B /ANN pdfmark end.t*FVorthesecrhoicesthefollowingequationholds:xBT(BI)E\NQ Cn=UREvXal(BVp(BI))B: In[theZfollorwingweillustrateZthesechoicesonZsomeexamples.Notethatthet*GfanparseronlyunderstandsordinarypSolynomialsatthemomenrt.?Soalthought*wre#canspSecify"thecoecienrt eldtobe"rationalfunctionsinBt,onlypolynomialt*ofNC(Bt)[Bx@1B;:::ʜ;xCnP]lElNCEffBtEgg)U[Bx@1B;:::ʜ;xCnP]thatareactuallyinNC[Bt;x@1B;:::ʜ;xCnP]cant*bSezparsedzatthemomenrt,leadingtosomeinconrvenience.Moreover,spSecifyingt*for9example9Bp-adicvXaluationsforidealsinNQ[Bx@1B;:::ʜ;xCnP]isnotpSossibleatthet*momenrt. TheHcommandGgfanxfff:tropicalprevXarietryhastwoGoptionstosetmax/mincon-t*vrentions:[.color push gray 0 color popt*X--mintt*--minxt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endJps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.16) cvn /DEST pdfmark end.color push gray 0Example4.16(Default:Max,max) color pop)|ThetPuiseuxsseriesaredecreasinginBt-t*expSonenrt>and?BT(BI)uE\vNQ2Cn W$=vXal^(BVp(BI))issatis ed.֣Thisconrvention?iscompatiblet*withRmostofGfan,butseemstonotbSeusedmruchQinRtheliterature.pOneplacet*it7isusedisin6theinrtroSductionof[?`].2Inthefollowingnote6thatitwouldnotbSet*pSossibleforGfantoparseX(t4+1)xwhileXt4x+1xcanbeparsed.y.color push gray 0 color popt*Xgfan,_tropicalprevariety--usevaluationt*Q(t)[x]{t+t4x+1x+tx3}zt*givresaspartoftheoutput.color push gray 0 color popt*XRAYSt*1,-3#0t*2,3#1t*color push Black.35S color pop$ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.36) cvn /DEST pdfmark end\t*color push BlackS color popt*ThetropicalprevXarietryisEf3B;Fu31@331z@2hEg.t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endJps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.17) cvn /DEST pdfmark end.color push gray 0Example4.17(Maxconvention,increasingt-exp`onents) color pop]8WVepnorwchanget*tothede nitionthatiscompatiblebSothwiththeGr obnerbasisconrvention(outert*normals) and increasingt-expSonenrts.Thisconvention wasused in[?`],[?] and[?]t*andsatis esBT(BI)E\NQ2Cn=UREvXal(BVp(BI))..color push gray 0 color popt*Xgfan,_tropicalprevariety--usevaluation--mintt*Q(t)[x]{t+t4x+1x+tx3}t*givresaspartoftheoutput.color push gray 0 color popt*XRAYSt*1,-1#0t*2,1#1t*ThetropicalprevXarietryisEf1B;Fu31@131z@2hEg.t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endJps:SDict begin [/View [/XYZ H.V]/Dest (theorem.4.18) cvn /DEST pdfmark end.color push gray 0Example4.18(Minconvention,increasingt-exp`onents) color pop[U8Ourϻ nalϼexam-t*pleP[illustratesthePZmostcommonconrvention,sinceP[thisistheoneusedinthet*tropicalMubSookMvbryMaclaganandSturmfels[?`].aHItwrasalsousedin[?`].aHThecon-t*vrention-hastheadvXanrtagethatPuiseuxseries.areincreasinginBtandtheequationt*BT(BI)E\NQ2Cn=URvXalH(BVp(BI))issatis ed..color push gray 0 color popt*Xgfan,_tropicalprevariety--usevaluation--mint--minxt*Q(t)[x]{t+t4x+1x+tx3}t*givresaspartoftheoutput.color push gray 0 color popt*XRAYSt*1,1#0t*2,-1#1t*ThetropicalprevXarietryisEf1B;EFu33@133z@2jEg.t*MoreinrterestingexamplesareobtainedbyintroSducingmorevXariablesandpoly-t*nomials,butherewreonlywishedtodemonstratevXariousconventions. TVoNHspSeedupcomputationtheNIarithmeticcanbecrhangedtomachine-integert*using3[for3\exampleoptionX--bits64.Notethatinthatcaseorver owchecking3[ist*notcompletelyimplemenrted. If0X--usevaluationZgisnotspSeci ed,wAthentheoutputZhlivresinaspaceofdimen-t*sionIoneHlorwer.IfacoSecientH eldwithoutadefaultvXaluationisspSeci edinthet*input,thenthetrivialvXaluationisused.t*color push Black.36S color pop%ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.37) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endHps:SDict begin [/View [/XYZ H.V]/Dest (appendix.A) cvn /DEST pdfmark end A"Datazformatsb#In,rthissectionwredescribSehow,spSolynomials,|lists,|markedGr obnerbasesetc.arerepresenrtedasASCISI׽characterstrings.ThesestringswillbSeinputtotheprograms|bry|typingorby|redirectingthestandardinputandbSeoutputbrytheprogramonthestandardoutputwhicrhmaybSethescreen,apipeora le.HUsually lesareusedforinput.8FVorexample, color push gray 0 color popXgfan_bases,outputfile.txtwill3readitsinputfromXinputfile.txtandwriteitsoutputtoXoutputfile.txt.ThefollorwingisanexampleofhorwtousepipSesforcomputingaunivrersalGr obnerbasisoftheinput: color push gray 0 color popXgfan_bases,outputfile.txtInrwgeneralrvspacesandnewlinesintheinputareignored,jbutforthepSolyhedralformatsdescribSedinSectionps:SDict begin H.S endcolor push gray 0A.7 color popqps:SDict begin H.R endqps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (subsection.A.7) cvn H.B /ANN pdfmark endandSectionps:SDict begin H.S endcolor push gray 0A.8 color popps:SDict begin H.R endps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (subsection.A.8) cvn H.B /ANN pdfmark endtherulesaredi erenrt.ʫps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.A.1) cvn /DEST pdfmark endUA.1)Fields@Twrokindsof eldsaresuppSorted:color push gray 0NT color pop_The eldNQofrationalswhicrhisrepresentedbythestring\XQ".color push gray 0NT color pop_Fields<oftheformNZB=pNZwhereBpisaprimenrumbSer..eThese< eldsarerep-_resenrtedfbytextstringsg\XZ/pZ"WwhereXpistheprimenrumbSer.%FVorexample_\XZ/3Z"or\XZ/17Z".InGfantheprimenrumbSerBpmrustbelessthan32749.ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.A.2) cvn /DEST pdfmark endUA.2)Vfariables@A%vXariableaisdenotedbryitsnamebwhichisanstringofcharacters. Theexactrules0forwhicrh/namesareallowedhavenot/bSeendecidedoninthisvrersionofGfan andthereforeGfanacceptsmostnames.#Horwever,white spaces,commasand\X]"arenotallorwedascrharactersinthename.lFVurthermoreoneshouldnotcrhoSoselNvXariablenameslOsuchthatonenamelOisastartingsubstringofanother{don'tcrhoSosenamessuchas\Xx1"and\Xx"inthesamepSolynomialring.ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.A.3) cvn /DEST pdfmark endUA.3)Polynomialffrings@ApSolynomialZringisrepresenrtedY rstbya eldandthenbyYalistofvXariablenames. hThelistbSeginswith\X["andendswith\X]". hNamesareseparatedbryPcommas. }TheorderingOofthevXariablesmattersasthisisalsotheorder-ingMwusedMvfortheenrtriesofforexamplewreightMwvectors.aKExamples:}\XZ/2Z[a,b]"and\XQ[xff}r-1,xff}2,y1,y2]".t*color push Black.37S color pop&ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.38) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.A.4) cvn /DEST pdfmark end UA.4)Polynomials@CoSecienrtsJinIthe eldaregivenIasfractions.6AHcoSecientequalsIitsnumeratormrultipliedYbyYtheinverseYofthedenominator.~ThenrumeratoranddenominatorthemselvresaregivenbyanintegerinNZwhichismappSedtothe eldbrythehomo-morphisms!sending1URE2NZs tos!1inthe eld.The'X/'crharacterandthedenominatorcanbSeleftoutifthedenominatoris1.Ifa eldwithnon-zerocrharacteristicwascrhosenoneshouldbSecarefulthatthedenominatorisnot0.Monomialsarewritteninthefollorwingformats:^1color push gray 0NT color pop_Xa^4dccolor push gray 0NT color pop_Xa4dccolor push gray 0NT color pop_XaaadacTheI!monomial1cannotbSewrittenwithoutwritingI itasatermintheusualwray$0\X1".xAnyothertermis$1eitheramonomialoracoSecientandamonomial.A bpSolynomial is alistoftermsseparatedbryX+.TheX+marybSeleftoutifthenrumeratorofthenextmonomialisnegative.Thatdescriptiondidnotcorvereverydetail.8Hereisanexample:^0 color push gray 0 color popXhello,world-3/8a2+23abcge^4+1Invourusualnotationwrewouldwriteitlikethis:BdehlC2@3Bo2@2BrSwY+1+23Babce2@4Bg+EFu@3z@8dBa2@2.Itisimp`ortanttonotethatthe rsttermwritteninap`olynomialisdistinguished0fromtheothertermsinthe0p`olynomial.dThisisusefulwhensp`ecifyingmarkedGr@obnerbases.ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.A.5) cvn /DEST pdfmark endUA.5)Lists@AlistbSeginswitha'Ef'ora'X(',conrtainselementsseparatedby'X,'andisendedbrya'Eg'ora'X)'.Di erenrttypSesoflistsmarybSeneededwhenspSecifyinginputforthevXariousprograms: color push gray 0Anintegervector color popmisalistofinrtegers. color push gray 0Alistofintegervectors color popyis3Ualistofinrtegervectors. Suchlistsareusedfor_examplewhenspSecifyinggeneratorsforsubgroupsofBSCnP. color push gray 0Ap`olynomiallist color popl4(orapSolynomialset)isalistofpolynomials. color push gray 0AGr@obnerbasis color popgisthelistofpSolynomialsinaGr obnerbasiswiththeleading_termhUofeacrhlistedhVpSolynomialbeingtheinitialtermwithhVrespecttoaterm_orderforwhicrhthisaGr obnerbasis. color push gray 0Alistofp`olynomialsets color pop$BisalistofpSolynomialsets.qOftenthepSolynomial_setsarerequiredtobSeGr obnerbases.t*color push Black.38S color pop'ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.39) cvn /DEST pdfmark end\t*color push BlackS color pop.color push gray 0Anideal color popF>iswrittenasalistofpSolynomialsgeneratingit.pt*FVorallotherliststhaninrtegervectorsthecharacters'Ef'and'Eg'areusedtostartt*andendthelist.t*ops:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.A.6) cvn /DEST pdfmark endUA.6)Permutations@WhenmexploitinglthesymmetryofanidealoneneedstoinputpSermrutationstothe]program. EacrhpSermutation]isspSeci edby]avector. Thelengthof]thevectorshouldps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.42) cvn /DEST pdfmark end\t*color push BlackS color popnt*$!color push BlackgIcolor push Black color popm)=PSfile="polyformat.eps" llx=0 lly=0 urx=850 ury=737 rhi=1672 %Figure/4:ۅps:SDict begin H.S endps:SDict begin H.R endFps:SDict begin [/View [/XYZ H.V]/Dest (figure.4) cvn /DEST pdfmark endThe/Gr obnerfaninExampleps:SDict begin H.S endcolor push BlackA.1 color popqps:SDict begin H.R endq|ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (theorem.A.1) cvn H.B /ANN pdfmark endinrtersectedwiththestandardsimplexinNR2@3. color pop t*X{1,57}t*{2,38}t*{0,689}#Neworbitt*{1,679}t*{2,789}t*MAXIMAL_CONESt*{0,38}#Neworbit#Dimension3t*{1,46}t*{2,57}t*{0,46}#Neworbitt*{1,57}t*{2,38}t*{0,689}#Neworbitt*{1,679}t*{2,789}t*PUREt*1t*The͘most͙impSortanrtpropertiesare͙\RAVYS"^and\CONES".Araryis͙givenbyt*aNrelativreNinteriorpSointNandaconeisgivrenbyNalistofindicesofrarysthatwillt*generate{thecone.XWVemarycomparethiscombinatorialdataztothedrawingoft*theGr obnerfangivreninFigureps:SDict begin H.S endcolor push gray 04 color popDEps:SDict begin H.R endyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 1]BorderArrayPatch/Subtype /Link/Dest (figure.4) cvn H.B /ANN pdfmark end.Noticethatthisexampleisparticularlysimplet*asthedimensionofthehomogeneitryspaceofBI+is0. TheKsymrbSol\#"isusedforwritingKcommentsinthe le. [tThecommentst*color push Black.42S color pop+CTps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.43) cvn /DEST pdfmark end\t*color push BlackS color popt*shouldHknotbSeHjconsideredapartofthe le.R(ThecommenrtsareusedbryGfantot*lettheuserknorwabSoutdimensions,orbitsandindices. AdetaileddescriptionofthepropSertiesfollorwsinthefollowing.t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.A.7.1) cvn /DEST pdfmark end *A.7.1,Datatyp`es@InGfan'sProlymakeformatthefollorwingdatatypSesaresupported: color push gray 0 color popCardinal:8Onenon-negativreinteger. color push gray 0 color popBoSolean:80or1. color push gray 0 color popMatrix:8Anarraryofintegervectors. color push gray 0 color popIncidenceMatrix:8Anarraryofsetsofintegers. color push gray 0 color popVVector:8Aninrtegervector.ps:SDict begin H.S endps:SDict begin 14.5 H.A endQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.A.7.2) cvn /DEST pdfmark end *A.7.2,Prop`erties@BeforewredescribSethepropertieswreneedtomakeafewde nitions.WVedonotconsidertheemptrysettobSeaconenorafaceofacone.ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (theorem.A.2) cvn /DEST pdfmark end color push gray 0De nitionA.2 color popYTheۂSlineffality%Hspace1ofapSolyhedralہconeisthelargestsubspaceconrtainedinthecone.The0linealitryspaceisthesmallestfaceofthe/coneandiftwoconesareinthesameKpSolyhedralLfanthentheymrusthaveKthesamelinealitryspace.@WVede nethe SlineffalityPspaceYofa fantobSethecommonlinealitryspaceofitscones.InthespSecialcaseofa(non-restricted)Gr obnerfanoratropicalvXarietrythelinealitryspaceofthefancoincideswiththehomogeneitryspaceofthede ningideal.ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (theorem.A.3) cvn /DEST pdfmark end color push gray 0De nitionA.3 color popYAcone(inafan)iscalledaSrffay7ifitsdimensionisonelargerthanthedimensionofitslinealitryspace.A,$rary,5canbSerepresentedbyavectorinitsrelativeinterior.Thisvectoriscon-tainedintheconebutnotconrtainedinanyofitspropSerfaces.=TherepresentationisnotuniquesincetheconeisinrvXariantundertranslationbryvectorsinitslinealityspace.AProlyhedralfaninGfancanhaveasubsetofthefollowingpropSerties: color push gray 0 color popAMBIENTxfff:DIMis a SCarffdinalwhosevXalueisthedimensionofthevrectorspace_in whicrhthefanlivres. VIfthefanisaGr obnerfanoratropicalvXarietrythen_thisrnrumbSersequalsthenrumbSerofsvXariablesinthepSolynomialringofthe_de ningideal.t*color push Black.43S color pop,Lps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.44) cvn /DEST pdfmark end\t*color push BlackS color pop.color push gray 0 color popT&DIMcviscaSCarffdinal+whosevXalueisthedimensioncofthehighestdimensionalcone+inthefan..color push gray 0 color popT&LINEALITYxfff:DIMaisΝaΜSCarffdinal /whosevXalueisthedimensionofthelinealitry+spaceofthefan..color push gray 0 color popT&RAVYSisaSMatrix.Therorwsofthematrixarevrectorsrepresentingtheraysof+them0fan|oneforeacrhrayV. TherowsareorderedandGfanwritesanindex+asacommenrttomakethe lehumanreadable..color push gray 0 color popT&Nxfff:RAVYSisaSCarffdinal);whicrhequalsthenumbSerofraysinthefan..color push gray 0 color popT&LINEALITYxfff:SPVArCEW3isWYaSMatrixjwhoserowsformWXabasisforthelinealitryspace+ofthefan..color push gray 0 color popT&ORVTHxfff:LINEALITYxfffSPArCE0is|a}SMatrixwhoserowsformabasisfortheor-+thogonalcomplemenrtofthelinealityspaceofthefan..color push gray 0 color popT&Fxfff:VECTOR7is8aSVeffctor.CThenrumbSerofentries7isDIMELINEALITYxfff:DIM+1.+TheBithenrtryisthenumbSerofconesinthefanofdimension+Bi+LINEALITYxfff:DIME1..color push gray 0 color popT&CONESisanSIncidencffeMatrix.3Thesectionconrtainsalineforeachconeinthe+fan.EacrhlineisthesetofindicesoftheraryscontainedinthecorrespSonding+cone..color push gray 0 color popT&MAXIMALxfff:CONES'is'anSIncidencffeMatrixand'similartoCONESexceptthat+onlyconeswhicrharemaximalwithrespSecttoinclusionarelisted..color push gray 0 color popT&PUREMisMAaM@SBoffolean.hThevXalueM@is1ifthepSolyhedralfanispureand0otherwise..color push gray 0 color popT&MULVTIPLICITIESfisfaSMatrixwithonecolumn. Anenrtryfisthemultiplicityof+amaximalcone.UsuallyconesinpSolyhedralfansdonotharvemultiplicities.+Thrus\thispropSerty]onlymakessenseforSweighteffdpSolyhedral]fansofwhich+tropicalGvXarietiesGisaspSecialcase.TheorderingoftherorwsinthispropSertry+isconsistenrtwiththeorderinginMAXIMALxfff:CONES..color push gray 0 color popT&RAVYxfff:VALUESisaaSMatrixkrwithjustonecolumn.h Itisusedwhen`thefanis+meanrt/to/spSecifyapiece-wiselinear(ortropicalrational)function. The+functionvXalueontheBithraryofthefanislistedintheBithrorwofthe+matrix..color push gray 0 color popT&LINEALITYxfff:VALUES{nis{aSMatrixwithjustonecolumn.Itis{usedwhenthe+fanismeanrttospSecifyapiece-wiselinear(ortropicalrational)function.+The functionvXalue ontheBithgeneratorofthelinealitryspace(storedin+LINEALITYxfff:SPVArCE)islistedintheBithrowofthematrix.t*color push Black.44S color pop-[ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.45) cvn /DEST pdfmark end\t*color push BlackS color popt*BesidespsectionslistedabSorve,HthepsectionsMAXIMALxfff:CONESxfffORBITS,pCONESxfffORBITSt*and~MULVTIPLICITIESxfff:ORBITSrareinrtroSducedwhendoingsymmetriccompu-t*tationsFwiththeX--symmetryoption. LThesesectionsareanalogoustoMAXI-t*MALxfff:CONES,֑CONES֌andMULVTIPLICITIES֋exceptthattheyopSerateonthet*levreloforbitsofconeswithrespSecttothesymmetryratherthancones.t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.A.8) cvn /DEST pdfmark endUA.8)Polyhedralffcones@ThestringrepresenrtationofapSolyhedralconestartswith color push gray 0 color popX_application,PolyhedralCone_version,2.2_type,PolyhedralConeAfterthisfollorwsthepropSerties.8FVorpolyhedralconestheyareasfollorws. color push gray 0 color popAMBIENTxfff:DIM|seeprevioussection. color push gray 0 color popDIMisaSCarffdinal);whosevXalueisthedimensionofthecone. color push gray 0 color popIMPLIEDxfff:EQUAVTIONSis^a]SMatrixNpwhoserorwsformabasisofthespaceof_linearformsvXanishingonthecone. color push gray 0 color popLINEALITYxfff:DIM|seeprevioussection. color push gray 0 color popLINEALITYxfff:SPVArCE|seeprevioussection. color push gray 0 color popFArCETSCiswaxSMatrix)whichcontainswanouternormalvrectorforeacrhfacetof_thecone. color push gray 0 color popRELAVTIVExfff:INTERIORxfffPOINTis"a#SVeffctorintherelativreinterior"ofthecone.t*color push Black.45S color pop.l&ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.46) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endHps:SDict begin [/View [/XYZ H.V]/Dest (appendix.B) cvn /DEST pdfmark end B!BApplicationzlistb#This?wsectionconrtains?vthefulllistofprogramsinGfan. 7MFVoreacrhprogramitshelp leislisted.kThehelp leofaprogramcanalsobSedisplaryedbyspSecifyingtheEX--helpFoptionwhenrunningtheprogram.^Besidestheoptionslistedinthissection=allprogramsharve=options-^-log1,ͣ--log2,...Ywhicrh=tellGfanhowmuchinformation to writeto\standarderror"whileacomputationisrunning.TheseoptionsareVERYUSEFULwhenyouwishtoknowifGfanismakinganyprogressinitscomputation.Additional5optionswhicrhcanbSeusedforallprograms,zbutwhicharenotlistedinthefollorwingsubsectionsare: color push gray 0 color pop-^-stdinv@alue3SpSecifya letouse3asinputinsteadofreadingfromthestandard_input. color push gray 0 color pop-^-stdoutl|v@alue٬SpSecify٫a letowriteoutputtoinsteadofwritingtothestan-_dardoutput. color push gray 0 color pop-^-xml^TVoletpSolyhedralfans^beoutputinanXML]format^insteadofinthetext_format.8(TheXML lesarenotreadablebryGfan.)ʫps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.1) cvn /DEST pdfmark endUB.1(Qgfan҉ff+bases@ThisJwisJxaprogramforcomputingallreducedGr obnerbasesofapSolynomialideal.ItjSTVellsWtheVprogramtoreadingeneratorsforagroupofsymmetries_(subgroupofBSgOfffn)afterharvingreadintheideal./Theprogramcrhecksthat_thejwidealjvstarys xedwhenpSermrutingthevXariableswithrespSecttoelemenrts_inthegroup.NTheprogramusesbreadth rstsearcrhtocomputetheset_oftreducedtGr obnerbasesuptosymmetrywithrespSecttothespSeci ed_subgroup. color push gray 0-e color popEcrho.8Outputthegeneratorsforthesymmetrygroup.t*color push Black.46S color pop/vUps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.47) cvn /DEST pdfmark end\t*color push BlackS color pop.color push gray 0-^-disableSymmetryTest color popkWhenusing-^-symmetrythisoptionwilldisablethe+crheckthatthegroupreado fromtheinputactuallyisasymmetrygroup+withrespSecttotheinputideal..color push gray 0-^-parametersv@alue color popWWiththisoptionyroucanspSecifyhowmanyvXariablesto+treatasparametersinsteadofvXariables.(ThismakresitpSossibletodocom-+putationsCwhereDthecoSecienrt eldisthe eldofrationalfunctionsinthe+parameters..color push gray 0-^-interruptv@alue color popvInrterrupt]the^enumerationaftera^spSeci ednumbSer^offacets+harve6bSeen7computed(wrorksforusualsymmetrictrarversals,butmay6not+wrork pingeneralfornon-symmetric qtraversalsorfortraversalsrestrictedto+fans).t*ʫps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.2) cvn /DEST pdfmark endUB.2(Qgfan҉ff+buchbs3erger@This~program~computesareducedlexicographicGr obnerbasisofthepSolynomialideal(givrenasinput.ThedefaultbSehavioristouseBuchbSerger's)algorithm.TheorderingofthevXariablesisBaUR>b>c:::(assumingthattheringisQ[a,b,c,...]).Options: color push gray 0-w color popComputeBaGr obnerBbasiswithrespSecttoadegreelexicographicorderwith_BaUR>b>c:::einstead. Thedegreesaregivrenbyeaweightvectorwhichisread_fromtheinputafterthegeneratingsethasbSeenread. color push gray 0-r color popUsetherevrerselexicographicorder(orthereverselexicographicorderasatie_breakrerif-wisused).KTheinputmustbSehomogeneousifthepurereverse_lexicographicorderiscrhosen.8Ignoredif-Wisused. color push gray 0-W color popQDo4=a4byapplyingthedivisionalgorithmforeacrhelement.8Theoutputis1fortrueand0forfalse.Options:P color push gray 0-^-remainder color popK'TVelltheprogramtooutputtheremaindersofthedivisionsrather_thanoutputting0or1. color push gray 0-^-multiplier color popI ReadsnYinapSolynomialthatwillbemrultipliedtothepolynomialto_bSedividedbeforedoingthedivision.ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.5) cvn /DEST pdfmark endUB.5(Qgfan҉ff+fancommonre nementThisprogramtakrestwopSolyhedralfansandcomputestheircommonre nemenrt.Options:P color push gray 0-i1v@alue color pop7SpSecifythenameofthe rstinput le. color push gray 0-i2v@alue color pop7SpSecifythenameofthesecondinput le. color push gray 0-^-stable color pop1Computethestableinrtersection.ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.6) cvn /DEST pdfmark endUB.6(Qgfan҉ff+fanhomologyThisjwprogramjvtakresapSolyhedralfanandcomputesitsreducedhomologygroups.OfcoursethesuppSortofafanisconrtractible,'sowhatisreallycomputedisthereduced[zhomology[{groupsofthesuppSortofthefanafterquotienrtingoutwiththelinealitryspaceandintersectingwithasphere.;Noticethattakingthequotienrtwith-thelinealitryspaceresultsinan-invertedsuspSensionwhichjustresultsinashiftofthereducedhomologygroups.Options:O color push gray 0-iv@alue color pop0SpSecifythenameoftheinput le. color push gray 0-^-no-optimize color popTgDisableNpreproScessingNofboundarymapsbeforeNdoinglattice_computations.t*color push Black.48S color pop1ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.49) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.7) cvn /DEST pdfmark end UB.7(Qgfan҉ff+fanisbalanced@ThisprogramcrhecksifafanisbalancedOptions:n? color push gray 0-iv@alue color pop0SpSecifythenameoftheinput le.$ color push gray 0-^-makeBalanced color popcWAssignpSositivremultiplicitiestoconestomakrethefanbal-_ancedinstead.8FVanisassumedtobSepure.$ color push gray 0-^-facetComplex color pop_sWhenmakingthefanbalanced, rsttakrefacetcomplex color push gray 0-^-cone color pop)Outputconeofallbalancedwreightfunctions.lps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.8) cvn /DEST pdfmark endUB.8(Qgfan҉ff+fanlink@This5fprogramtakresapSolyhedralfananda5evectorandcomputesthelinkofthepSolyhedral6fan6aroundthatvrertex.Thelinkwillharve6linealityspace6dimensionequalitothedimensionhoftherelativreopSenpolyhedralconehoftheoriginalfanconrtainingthevector.Options:n? color push gray 0-iv@alue color pop0SpSecifythenameoftheinput le. color push gray 0-^-symmetry color popJ>SReadsinafanstoredwithsymmetryV.6Thegeneratorsofthesym-_metrygroupmrustbSegivenonthestandardinput.$ color push gray 0-^-star color pop%pComputes|thestarinstead.BThestar|isde nedasthesmallestpSolyhedral_fanconrtainingallconesoftheoriginalfancontainingthevector.lps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.9) cvn /DEST pdfmark endUB.9(Qgfan҉ff+fanpros3duct@ThisprogramtakrestwopSolyhedralfansandcomputestheirproduct.Options:n? color push gray 0-i1v@alue color pop7SpSecifythenameofthe rstinput le. color push gray 0-i2v@alue color pop7SpSecifythenameofthesecondinput le.lps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.10) cvn /DEST pdfmark endUB.100jgfan҉ff+fansubfan@ThisprogramtakresapSolyhedralfanandalistofvrectorsandcomputesthesmallestsubfanofthefanharvingthelistofvectorsinitssuppSort.Options:n? color push gray 0-iv@alue color pop0SpSecifythenameoftheinput le.$ color push gray 0-^-symmetry color popJ>SReadsintheconestoredwithsymmetryV.Thegeneratorsofthe_symmetrygroupmrustbSegivenonthestandardinput.t*color push Black.49S color pop2ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.50) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.11) cvn /DEST pdfmark end UB.110jgfan҉ff+genericlinearchange@ThisprogramtakresalistofpSolynomialsandperformsagenericlinearcrhangeofcoSordinatesbryintroSducingnxnnewvXariables.ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.12) cvn /DEST pdfmark endUB.120jgfan҉ff+gros3ebnerconeThisprogramcomputesaGr obnercone.67Threedi erenrtcasesarehandled.67Theinput֋mary֊bSeamarked֊reducedGr obnerbasisinwhicrhcaseitsGr obnerconeiscomputed.=TheIinputImarybSejustamarkredminimalbasisinwhicrhcasetheconecomputedhisgnotaGr obnerconeintheusualsensebutsmaller. (Theseconesare<2describSedin[FVukuda,PJensen,PLauritzen,Thomas]).-~The<2thirdpossiblecaseisethatdtheGr obnerconeispSossiblylorwerdimensionaleandgivenebyaepairofGr obner|dbases|easitisusefultodofortropicalvXarieties,seeoption-^-pair.ThefacetsEofEtheconecanbSereado insectionFArCETSEVandtheequationsinsectionIMPLIEDxfff:EQUAVTIONS.Options: color push gray 0-^-restrict color pop:AddaninequalitryforeacrhcoSordinate,Vsothatthetheconeisrestricted_tothenon-negativreorthant. color push gray 0-^-pair color pop&the\?-goptionisnotspSeci editwillcomputeoneusingBucrhbSerger's\>algorithm.Options: color push gray 0-g color popTVells#theprogramthattheinputisalreadyaGr obnerbasis(withtheini-_tialKtermJofeacrhpSolynomialbeingJthe rstoneslisted).Usethisoption_ifittakrestoSomuchtimetocomputethestarting(standarddegreelexico-_graphic)Gr obnerbasisandtheinputisalreadyaGrobnerbasis.t*color push Black.50S color pop3ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.51) cvn /DEST pdfmark end\t*color push BlackS color pop.color push gray 0-^-symmetry color popX}TVellsWtheVprogramtoreadingeneratorsforagroupofsymmetries+(subgroupofBSgOfffn)afterharvingreadintheideal./Theprogramcrhecksthat+thejwidealjvstarys xedwhenpSermrutingthevXariableswithrespSecttoelemenrts+inthegroup.NTheprogramusesbreadth rstsearcrhtocomputetheset+oftreducedtGr obnerbasesuptosymmetrywithrespSecttothespSeci ed+subgroup..color push gray 0-^-disableSymmetryTest color popkWhenusing-^-symmetrythisoptionwilldisablethe+crheckthatthegroupreado fromtheinputactuallyisasymmetrygroup+withrespSecttotheinputideal..color push gray 0-^-restrictingfanv@alue color pop~SpSecifyIthenameIofa leconrtainingapSolyhedralfanin+Prolymake~'format.[Thecomputation~&oftheGr obnerfanwillbSerestricted+to1thisfan.5Ifthe-^-symmetryoptionisused0thenthisrestrictingfanmrust+bSeinrvXariantunderthesymmetryandtheorbitsinthe lemrustbSewith+respSectrtothespeci edgroupofsymmetries.q?Theorbitsofmaximalcones+ofthe learethenreadinratherthanthemaximalcones..color push gray 0-^-parametersv@alue color popWWiththisoptionyroucanspSecifyhowmanyvXariablesto+treatasparametersinsteadofvXariables.(ThismakresitpSossibletodocom-+putationsCwhereDthecoSecienrt eldisthe eldofrationalfunctionsinthe+parameters..color push gray 0-^-no`cones color popLTVellstheprogramnottooutputtheCONES6andMAXIMALxfff:CONES+sections,HbutpstilloutputCONESxfff:COMPRESSEDandMAXIMALxfffCONESxfffCOMPRESSED+if-^-symmetryisused..color push gray 0-^-interruptv@alue color popvInrterrupt]the^enumerationaftera^spSeci ednumbSer^offacets+harve6bSeen7computed(wrorksforusualsymmetrictrarversals,butmay6not+wrork pingeneralfornon-symmetric qtraversalsorfortraversalsrestrictedto+fans).t*ʫps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.14) cvn /DEST pdfmark endUB.140jgfan҉ff+homogeneityspace@This%programcomputes%thehomogeneitryspaceofalistofpSolynomials-asacone.xThrusU8generatorsforU9thehomogeneityspaceU9arefoundinthesectionLIN-EALITYxfff:SPVArCE.Ifyouwishthehomogeneityspaceofanidealyoushould rstcomputexawsetofhomogeneousgeneratorsandcalltheprogramonthese. OAreducedGr obnerbasiswillalwrayssuceforthispurpSose.ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.15) cvn /DEST pdfmark endUB.150jgfan҉ff+homogenizeThisSprogramhomogenisesalistofpSolynomialsbryintroSducinganextravXariable.ThenameofthevXariabletobSeinrtroducedisreadfromtheinputafterthelistoft*color push Black.51S color pop4ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.52) cvn /DEST pdfmark end\t*color push BlackS color popt*pSolynomials.RWithout?the>-woptionthehomogenisationisdonewithrespSecttot*totaldegree.8Example:Input:Q[x,y]Efy-1EgzOutput:Q[x,yV,z]Efy-zEgt*Options:.color push gray 0-i color pop&TVreatQinputasanQideal.Thiswillmakretheprogramcomputethehomogenisa-+tion oftheinput ideal.kThisisdonebrycomputingadegreeGr obnerbasis+andhomogenisingit..color push gray 0-w color pop"&SpSecifyjahomogenisationvrector.)ThelengthofthevectormustbSethesame+asethenrumbSereofevXariablesinthering.gThevrectorisreadfromtheinput+afterthelistofpSolynomials..color push gray 0-H color pop#b`Let;thename;ofthenewvXariablebSeH;nratherthanreadinginanamefrom+theinput.t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.16) cvn /DEST pdfmark endUB.160jgfan҉ff+initialforms@ThisGprogramconrvertsFaGlistofpSolynomialstoalistoftheirinitialformswithrespSecttothevrectorgivenafterthelist.Options: color push gray 0-^-ideal color pop*TVreatinputasanideal.'Thiswillmakretheprogramcomputetheinitial_ideal)oftheidealgeneratedbrytheinputpSolynomials.mcThecomputationis_done brycomputingaGr obnerbasiswithrespSecttothegivrenvector.The_vrectormustbSepositivreortheinputpolynomialsmrustbehomogeneousin_apSositivregrading.8Noneoftheseconditionsarecheckedbytheprogram. color push gray 0-^-pair color pop&ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.53) cvn /DEST pdfmark end\t*color push BlackS color popt*program0will1wralkthroughtheselectedfacetanddisplarythenewGr obnerbasist*andgalistgofnewfacetnormalsfortheusertocrhoSosefrom.DSincetheprogramt*readsvytheuser'scrhoicesthroughthethestandardinputitisrecommendednottot*redirectthestandardinputforthisprogram.t*Options:.color push gray 0-L color pop LatexmoSde.TheprogramwilltrytoshorwthecurrentGr obnerbasisina+readableformbryinvokingLaTVeXandxdvi..color push gray 0-x color pop&ExitimmediatelyV..color push gray 0-f color pop&TVell)theprogram)tolistthe ippSedreducedGr obnerbasisoftheinitialideal+foreacrh ippablewallinthecurrentGr obnercone..color push gray 0-w color pop"&TVelltheprogramtolist(aGr obnerbasiswithrespSecttothecurrenrtterm+orderFfor)Gtheinitialidealforeacrh ippablewallGinthecurrenrtGr obner+cone..color push gray 0-i color pop&TVelltheprogramtolistthede ningsetofinequalitiesofthenon-restricted+Gr obnerconeasasetofvrectorsafterharvinglistedthecurrenrtGr obner+basis..color push gray 0-W color pop&Prinrtweightvector.EThiswillmaketheprogramprintaninteriorvector+ofthecurrenrtGr obnerconeandarelativreinteriorpSointforeach ippable+facetofthecurrenrtGr obnercone..color push gray 0-^-tropical color popJfTVrarverseatropicalvXarietryinteractivelyV.t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.18) cvn /DEST pdfmark endUB.180jgfan҉ff+ismarkedgros3ebnerbasis@ThisprogramcrhecksifasetofmarkredpSolynomialsisaGr obnerbasiswithrespSectto`itsmarking. Firstitiscrhecked`ifthemarkingsareconsistenrtwithrespSecttoapSositivrevector.1ThenBuchbSerger'sS-criterionischecked.1TheoutputisbSooleanvXalue.ʫps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.19) cvn /DEST pdfmark endUB.190jgfan҉ff+krulldimensionTVakresdancidealBIandcomputestheKrulldimensionofR/IZwhereRiscthepSoly-nomialring.8Thisisdonebry rstcomputingaGr obnerbasis.Options: color push gray 0-g color popTVelltheprogramthattheinputisalreadyareducedGr obnerbasis.t*color push Black.53S color pop6ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.54) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.20) cvn /DEST pdfmark end UB.200jgfan҉ff+latticeideal@Thiskprogramcomputesthelatticeidealofalattice.$!Theinputisalistofgener-atorsforthelattice.Options: color push gray 0-t color popComputeSthetoricidealTofthematrixwhoserorwsaregivrenontheinput_instead. color push gray 0-^-convert color pop:DoSes not doanrycomputation,>butjustconrverts thevrectorstobino-_mials.ʫps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.21) cvn /DEST pdfmark endUB.210jgfan҉ff+leadingterms@ThisprogramconrvertsalistofpSolynomialstoalistoftheirleadingterms.Options: color push gray 0-m color popDo0the/samethingforalistofpSolynomialsets.)wThatis,outputthesetof_setsofleadingterms.ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.22) cvn /DEST pdfmark endUB.220jgfan҉ff+list@ThisprogramlistsallsubScommandsoftheGfaninstallation.Options: color push gray 0-^-hidden color pop7'ShorwhiddencommandswhicharenotociallysuppSorted.ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.23) cvn /DEST pdfmark endUB.230jgfan҉ff+markps3olynomialset@ThisǕprogramǖmarksasetofpSolynomialswithrespSecttothevrectorgivenǖattheend[oftheZinput,meaningthatthelargesttermsaremorved[tothefronrt..IncaseofatiethelexicographictermorderwithBaUR>b>c:::isusedtobreakit.ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.24) cvn /DEST pdfmark endUB.240jgfan҉ff+minkowskisum@ThisTisSaprogramforcomputingthenormalfanoftheMinkrowskiTsumoftheNewtonpSolytopesofalistofpolynomials.Options: color push gray 0-^-symmetry color popJ>STVellsWtheVprogramtoreadingeneratorsforagroupofsymmetries_(subgroupofBSgOfffn)afterharvingreadintheideal./Theprogramcrhecksthat_thejwidealjvstarys xedwhenpSermrutingthevXariableswithrespSecttoelemenrts_inthegroup.NTheprogramusesbreadth rstsearcrhtocomputetheset_oftreducedtGr obnerbasesuptosymmetrywithrespSecttothespSeci ed_subgroup.t*color push Black.54S color pop7ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.55) cvn /DEST pdfmark end\t*color push BlackS color pop.color push gray 0-^-disableSymmetryTest color popkWhenusing-^-symmetrythisoptionwilldisablethe+crheckthatthegroupreado fromtheinputactuallyisasymmetrygroup+withrespSecttotheinputideal..color push gray 0-^-no`cones color popLTVelltheprogramtonotlistconesintheoutput.t*Lps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.25) cvn /DEST pdfmark endUB.250jgfan҉ff+minors@Thisprogramwillgeneratether*rminorsofad*nmatrixofindeterminates.Options:N color push gray 0-rv@alue color pop2nSpSecifyr. color push gray 0-dv@alue color pop4SpSecifyd. color push gray 0-nv@alue color pop4SpSecifyn. color push gray 0-M2 color pop6UseMacaulary2conventionsfororderofvXariables. color push gray 0-^-names color pop4 Assignnamestotheminors. color push gray 0-^-dressian color pop>ProSduce!tropical de ningtheDressian(3,n)instead.'(Thesignsmary_notbSecorrect,thatistheequationsmarynotbePluecrkerrelations.) color push gray 0-^-pluckersymmetries color pop}&DonothingbutproSducesymmetrygeneratorsforthe_Pluecrkerideal. color push gray 0-^-symmetry color popJ>SProSducesalistofgeneratorsforthegroupofsymmetrieskreeping_thesetofminors xed.8(Onlywithout-^-names). color push gray 0-^-parametrize color popUwPrarametrize[thesetofdtimesZnmatricesofBarvinokrankless_thanorequaltor-1bryalistoftropicalpSolynomials. color push gray 0-^-ultrametric color popQProSducetropicalequationscuttingouttheultrametrics.Mps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.26) cvn /DEST pdfmark endUB.260jgfan҉ff+mixedvolume@ThisprogramcomputesthemixedvrolumeoftheNewtonpSolytopesofalistofpSolynomials.Theringisspeci edontheinput.AfterthisfollorwsthelistofpSolynomials.Options:N color push gray 0-^-vectorinput color popS+ReadinalistofpSoinrtcon gurationsinsteadofapSolynomialring_andalistofpSolynomials. color push gray 0-^-cyclicv@alue color popRUsecyclic-nexampleinsteadofreadinginput. color push gray 0-^-no`onv@alue color popNUseNoSonrburg-nexampleinsteadofreadinginput.t*color push Black.55S color pop8Ops:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.56) cvn /DEST pdfmark end\t*color push BlackS color pop.color push gray 0-^-chandrav@alue color popoOIUseChandrasekhar-nexampleinsteadofreadinginput..color push gray 0-^-k@atsuravalue color popk}UseKatsura-nexampleinsteadofreadinginput..color push gray 0-^-gaukwav@alue color poplkUseGaukwra-nexampleinsteadofreadinginput..color push gray 0-^-ecov@alue color popStUseEco-nexampleinsteadofreadinginput..color push gray 0-jv@alue color pop? NumrbSerofthreadst*ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.27) cvn /DEST pdfmark endUB.270jgfan҉ff+overintegers@This[programisanexpSerimenrtalimplementation[ofGr obnerbasesforidealsinZ[xxfff:1,...,xxfffn].xSevreralqopSerationsaresupportedbrypspecifyingtheappropriateop-tion:1(1)JcomputationofthereducedGr obnerbasiswithrespSecttoagivrenvector(tiebrokren6lexicographically),(2)7computationofaninitialideal,(3)computa-tionioftheiGr obnerfan,n(4)computationofasingleGr obnercone.SinceGfanonly״knorwspSolynomialringswithcoecienrtsbeingelemenrtsofa׵ eld,~theidealisspSeci edbrygivingasetofpolynomialsinthepolynomialringQ[xxfff:1,...,xxfffn].Thatis,bryusingQinsteadofZwhenspSecifyingthering.iTheidealMUSTBEHOMOGENEOUSn(inapSositivregrading)forcomputationoftheGr obnerfan.Non-homogeneousZidealsareallorwedZfortheothercomputationsifthespSeci edwreightVvectorsWarepSositive.NOTE:ThisprogramisWexpSerimentalandexpSectedtocrhangebSehaviourinfuturereleases,sodon'twriteyrourSAGE andM2inter-facesjustyret.Options:% color push gray 0-^-gro`ebnerBasis color popbAsksItheprogramHtocomputeamarkredGr obnerbasiswith_respSect.toawreight.vectortie-brokenlexicographicallyV.8 Theinputorderis:_Ringidealvrector. color push gray 0-^-initialIdeal color popNAsksܑtheܐprogramtocomputeaninitialidealwithrespSecttoa_vrector.8Theinputorderis:Ringidealvrector. color push gray 0-^-gro`ebnerFan color popXAskstheprogramtocomputetheGr obnerfan.Theinputorder_is:8Ringideal. color push gray 0-^-gro`ebnerCone color popatAskstheprogramtocomputeasingleGr obnerconeconrtain-_ingrthespSeci edvrectorinitsrelativeinterior.=Theoutputisstoredasa_fan.8Theinputorderis:Ringidealvrector. color push gray 0-m color popFVortheopSerationstakingavrectorasinput,readinalistofvrectorsinstead,_andpSerformtheoperationforeacrhvectorinthelist. color push gray 0-g color popTVells!the!programthattheinputisalreadyaGr obnerbasis(withtheinitial_term ofeacrhpSolynomial being the rstoneslisted).jUsethisoptionifthe_usual-^-groSebnerFVanistooslorw.t*color push Black.56S color pop9 ps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.57) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.28) cvn /DEST pdfmark end UB.280jgfan҉ff+padic@Thisp/programisp0anexpSerimenrtalimplementationofp-adicGr obnerp0basesaspro-pSosedCbryDianeBMaclagan.SeveralopSerationsCaresupportedbryBspecifyingtheappropriateoption:(1)computationofGr obnerbasiswithrespSecttoagivrenvec-tor3B(tiebrokren3Alexicographically),Eh(2)computationofthep-adicinitialideal,Eh(3)computationтoftheуp-adicGr obnercomplexasde nedbryMaclaganandSturm-fels,{(4)computationofasinglepSolyhedronofthep-adicGr obnercomplex.#TheinputfidealshouldbSeanidealofthefpolynomialringwithcoecienrt eldQ.ThevXaluation$is#spSeci edwiththeoption-p._TheidealMUSTBEHOMOGENEOUS(in|a}pSositivregrading).'SincegfancanonlyhandlefansandnotpSolyhedralcom-plexesʄinʅgeneral,whatiscomputedastheGr obnercomplexisactuallythe"fanorver"Qthecomplex-inQotherwrords,p~the rstcoSordinateissupposedQtobe1intheoutputfan.=SimilarlyV,thewreightvectorsmustbSespeci edinanhomogeneouswrayV,yfor]examplebryaddinganadditional1entryas rstcoSordinate. (Iffractionsare_needed,|usetheenrtry_asacommondenominator.)NOTE:ThisprogramisexpSerimenrtalandexpectedtocrhangebeharviourinfuturereleases,sodon'twriteyrourSAGEandM2interfacesjustyet. Inparticularthisprogramusesthetrop-icalminimrum-convention!!Options:g3 color push gray 0-pv@alue color pop4De nestheprimeusedforthevXaluation.w color push gray 0-^-gro`ebnerBasis color popbAsksItheprogramHtocomputeamarkredGr obnerbasiswith_respSect\toa\wreight\vector(tie-brokenlexicographically).Theinputorder_is:8Ringidealvrector. color push gray 0-^-initialIdeal color popNAsksܑtheܐprogramtocomputeaninitialidealwithrespSecttoa_vrector.8Theinputorderis:Ringidealvrector.w color push gray 0-^-gro`ebnerComplex color popwtAsksrtheprogramtocomputethep-adicGr obnercom-_plex.8Theinputorderis:Ringideal. color push gray 0-^-gro`ebnerPolyhedron color popAskstheprogramtocomputeasinglepSolyhedronof_thepGr obnerqcomplexconrtainingthespSeci edvrectorinitsrelativreinterior._Theoutputisstoredasafan.8Theinputorderis:Ringidealvrector. color push gray 0-m color popFVortheopSerationstakingavrectorasinput,readinalistofvrectorsinstead,_andpSerformtheoperationforeacrhvectorinthelist.vps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.29) cvn /DEST pdfmark endUB.290jgfan҉ff+ps3olynomialsetunion@ThisMprogramcomputesMtheunionofalistofpSolynomialsetsgivrenasinput.~ThepSolynomials;mrustallbelongtothesame:ring. Theringisspeci edontheinput.AfterthisfollorwsthelistofpSolynomialsets.Options:t*color push Black.57S color pop:Sps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.58) cvn /DEST pdfmark end\t*color push BlackS color pop.color push gray 0-s color pop'ZSortoutputbrydegree.t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.30) cvn /DEST pdfmark endUB.300jgfan҉ff+render@ThisWPprogramWOrendersaGr obnerfanasanx g le.TVobSemoreprecise,ttheinputis6the6listofallreducedGr obnerbasesofanideal.TheoutputisadrarwingoftheGr obnerfdfaninrtersectedwithatriangle. Thecornersofthetriangleare(1,0,0)totherighrt,$(0,1,0)totheleftand(0,0,1)atthetop.IftherearemorethanthreevXariables in theringthesecoSordinatesareextendedwithzeros.ۓItispSossibletoshiftthe1enrtrycyclicwiththeoption-^-shiftVVariables.Options: color push gray 0-L color pop|nMakrethetrianglelargersothattheshapSeoftheGr obnerregionappears. color push gray 0-^-shiftVariablesv@alue color pop<1ShiftthepSositionsofthevXariablesinthedrarwing.}hFVor_examplewiththevXalueequalto1thecornerswillbSerighrt:(0,1,0,0,...),think=bSeforeusingit.Use-^-symmetrytogivehints>abSoutwhichsubgroupofthesymmetrygroupcouldbSeuseful.'TheprogramcrheckseachelementofthespSeci edsubgrouptoseeifitpreservrestheideal.Options: color push gray 0-^-symmetry color popJ>SSpSecifysubgrouptobesearcrhedforpSermrutationskeepingtheideal_ xed. color push gray 0-^-symsigns color popCISpSecifynforoeacrhgeneratorofthegroupspSeci edwihrt-^-symmetryan_elemenrtofEf1B;+1Eg2Cn kwhichbyitsmultiplicationonthevXariablestogether_withthepSermrutationisexpectedtokreeptheideal xed.ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.38) cvn /DEST pdfmark endUB.380jgfan҉ff+tolatex@ThisprogramconrvertsASCISImathtoTVeXmath.ceThedata-trypSeisspeci edbrytheoptions.Options: color push gray 0-h color popAddaheadertotheoutput.*3UsingthisoptiontheoutputwillbSeLaTVeXable_righrtawayV. color push gray 0-^-p`olynomialsetZff ώ) color popeThedatatobSeconrvertedisalistofpolynomials. color push gray 0-^-p`olynomialsetlistZff ώ) color popw!ThedatatobSeconrvertedisalistoflistsofpolynomials.ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.39) cvn /DEST pdfmark endUB.390jgfan҉ff+tops3olyhedralfan@ThisZprogramtakresalistofreducedZ Gr obnerbasesandproSducesthefanofallfacesqofrthese.6#InthiswraybyqgivingthecompletelistofreducedGr obnerbases,the~Gr obner~fancanbSecomputedasapSolyhedralcomplex.Theoption-^-restrictletstheusercrhoSosebetrweencomputingtheGr obnerfanortherestrictedGrobnerfan.Options:t*color push Black.61S color pop>Wps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.62) cvn /DEST pdfmark end\t*color push BlackS color pop.color push gray 0-^-restrict color popHv AddyanyinequalitryforeacrhcoSordinate,sothatthetheconesarere-+strictedtothenon-negativreorthant..color push gray 0-^-symmetry color popX}TVellF3theprogramtoreadinF4generatorsforagroupofsymmetries+(subgroup of BSgOfffn)afterharvingreadinthering.,TheoutputisgroupSed+according.tothesesymmetries.+rOnly-onerepresenrtative.foreacrhorbitis+neededontheinput.t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.40) cvn /DEST pdfmark endUB.400jgfan҉ff+tropicalbasis@ThisYprogramZcomputesatropicalbasisforanidealde ningatropicalcurvre.De ningatropicalcurvremeansthattheKrulldimensionofR/Iisatmost1+theadimensionofthehomogeneitryspaceofaI`whereRisthepSolynomialring. Theinputisageneratingsetfortheideal.)Iftheinputisnothomogeneousoption-hmrustbSeused.Options: color push gray 0-h color popHomogenisetheinputbSeforecomputingatropicalbasisanddehomogenisethe_output.Thispisoneedediftheinputgeneratorsarenotalreadyhomogeneous.ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.41) cvn /DEST pdfmark endUB.410jgfan҉ff+tropicalbruteforce@This&programtakresamarkedreduced&Gr obnerbasisforahomogeneousidealandcomputes~Rthetropical~SvXarietryoftheidealasasubfanoftheGr obnerfan.Theprogramisslorwbutworksforanyhomogeneousideal.Ifyouknowthatyouridealis-primeorver-thecomplexnrumbSers-or-yousimplyknowthatitstropicalvXarietyisxpurexandconnectedincoSdimensiononethenusegfanxfff:tropicalstartingconeandgfanxfff:tropicaltrarverseinstead.ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.42) cvn /DEST pdfmark endUB.420jgfan҉ff+tropicalcurve@ThisYprogramZcomputesatropicalbasisforanidealde ningatropicalcurvre.De ningatropicalcurvremeansthattheKrulldimensionofR/Iisatmost1+theadimensionofthehomogeneitryspaceofaI`whereRisthepSolynomialring. Theinputisageneratingsetfortheideal.)Iftheinputisnothomogeneousoption-hmrustbSeused.Options: color push gray 0-^-singleray color popCNSOnlycomputeasingleraryofthecurve. color push gray 0-^-parametersv@alue color popsWiththisoptionyroucanspSecifyhowmanyvXariablesto_treatasparametersinsteadofvXariables.(ThismakresitpSossibletodocom-_putationsCwhereDthecoSecienrt eldisthe eldofrationalfunctionsinthe_parameters.t*color push Black.62S color pop?fps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.63) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.43) cvn /DEST pdfmark end UB.430jgfan҉ff+tropicalevaluation@ThisprogramevXaluatesatropicalpSolynomialfunctioninagivrensetofpoinrts.ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.44) cvn /DEST pdfmark endUB.440jgfan҉ff+tropicalfunctionThisprogramtakresapSolynomialandtropicalizesit.ŀTheoutputispiecewiselinearfunctionrepresenrtedbyafanwhoseconesarethelinearregions.Eacrhrary6of6thefangetsthevXalueofthetropicalfunctionassignedtoit. Inotherwrords thisprogramcomputesthenormalfanoftheNewtonpSolytope oftheinputpSolynomialwithadditionalinformation.Options:pG color push gray 0-^-exp`onents color popJTVellprogramtoreadalistofexpSonenrtvectorsinstead.ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.45) cvn /DEST pdfmark endUB.450jgfan҉ff+tropicalhyps3ersurface@ThisprogramcomputesthetropicalhrypSersurfacede nedbryaprincipalideal.TheinputisthepSolynomialringfollorwedbyasetconrtainingjustageneratoroftheideal.ops:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.46) cvn /DEST pdfmark endUB.460jgfan҉ff+tropicalintersectionThis.programcomputesthesettheoreticalinrtersection-ofasetoftropicalhy-pSersurfaces(ortobeprecise,Ʃtheircommonre nemenrtasafan).HTheinputisalistofpSolynomialswitheacrhpolynomialde ningahrypersurface.ConsideringtropicalhrypSersurfacesasfans,theintersectioncanbSecomputedasthecommonre nemenrt^of^these./Thusthe^outputisafanwhosesuppSortistheinrtersectionofthetropicalhrypSersurfaces.Options:pG color push gray 0-^-tropicalbasistest color popnĻThisoptionwilltestthattheinputpSolynomialsforatrop-_icalySbasisoftheidealtheyyRgeneratebrycomputingthetropicalprevXarietyof_the̍input̎pSolynomialsandthenre neeacrhconewiththeGr obnerfanand_testingwhethereacrhconeinthere nemenrthasanassoSciatedmonomial_free!initialideal.JIfso,thenwrehave atropicalbasisand1iswrittenas_output.qIf .not,thenazeroiswritten -totheoutputtogetherwithavrector_in87the86tropicalprevXarietrybutnotinthevXarietryV.!Theactualcheck86isdone_onahomogenizationoftheinputideal,butthisdoSesnota ecttheresult._(Thisoptionreplacesthe-toptionfromearliergfanvrersions.) color push gray 0-^-tplane color pop3ThisnAoptioninrtersectstheresultingn@fanwiththeplanexxfff:0=-1,'where_xxfff:0wisthe rstxvXariable. MTVosimplifytheimplemenrtationtheoutputis_actually>_the>^commonre nemenrtwiththenon-negativrehalfspace. 4This_meansthat"stu atin nitry"(wherexxfff:0=0)isnotremoved.t*color push Black.63S color pop@ups:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.64) cvn /DEST pdfmark end\t*color push BlackS color pop.color push gray 0-^-symmetryPrinting color popPrarse8a9groupofsymmetriesaftertheinputhasbSeen+read.8Usedwhenprinrtingwith-^-incidence.Í.color push gray 0-^-symmetryExploit color popRestrictU}computationU|totheclosedlexicographicfunda-+menrtalXdomainoftheYspSeci edsymmetrygroup.Thisoverwrites-^-restrict..color push gray 0-^-no`cones color popLTVellstheprogramnottooutputtheCONES6andMAXIMALxfff:CONES+sections,HbutpstilloutputCONESxfff:COMPRESSEDandMAXIMALxfffCONESxfffCOMPRESSED+if-^-symmetryisused..color push gray 0-^-restrict color popHv Restrictthecomputationtoafull-dimensionalconegivrenbyalistof+markred#pSolynomials.) Theconeis$theclosureofallwreightvectors#choSosing+thesemarkredterms..color push gray 0-^-stable color pop@>FindƭtheƬstableinrtersectionoftheinputpSolynomialsusingtropical+inrtersectiontheoryV.8ThiscanbSeslow.8Mostotheroptionsareignored..color push gray 0-^-parametersv@alue color popWWiththisoptionyroucanspSecifyhowmanyvXariablesto+treatasparametersinsteadofvXariables.(ThismakresitpSossibletodocom-+putationsCwhereDthecoSecienrt eldisthe eldofrationalfunctionsinthe+parameters.t*ͺps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.47) cvn /DEST pdfmark endUB.470jgfan҉ff+tropicallifting@ThisspSeci ed.hFVorexampleQ(t)will+come8with9itsusualvXaluation.Inordertorepresenrttheoutputanadditional+0thcoSordinateisinrtroduced..color push gray 0-^-mint color pop9In@a eldwithparametertAthisoptiondecidesifmaximalorminimal+degreesoftdeterminethevXaluation..color push gray 0-^-minx color pop;RSwitcrhtheprogrammetominconventionforthevXariables.t*ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.51) cvn /DEST pdfmark endUB.510jgfan҉ff+tropicalrank@This$programwillcomputethetropicalrankof$matrixgivrenasinput.TVropicaladditionisMAXIMUM.Options: color push gray 0-^-k@apranov color popDTVrarversethestableinrtersectionor,equivXalentlyV,pretendthatthecoSef-+ cienrtsaregenereric..color push gray 0-^-interruptv@alue color popvInrterrupt]the^enumerationaftera^spSeci ednumbSer^offacets+harve6bSeen7computed(wrorksforusualsymmetrictrarversals,butmay6not+wrork pingeneralfornon-symmetric qtraversalsorfortraversalsrestrictedto+fans).t*ʫps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.54) cvn /DEST pdfmark endUB.540jgfan҉ff+tropicalweildivisor@This"aprogram"bcomputesthetropicalWVeildivisorofpiecewiselinear(ortropicalrational)functiononatropicalk-cycle.SeetheGfanmanrualformoreinforma-tion.Options: color push gray 0-i1v@alue color pop7SpSecifythenameoftheProlymakeinput leconrtainingthek-cycle. color push gray 0-i2v@alue color pop7SpSecifyStheRnameoftheProlymakeinputS lecontainingSthepiecewise_linearfunction.ʫps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.B.55) cvn /DEST pdfmark endUB.550jgfan҉ff+version@ThisprogramwritesoutvrersioninformationoftheGfaninstallation.t*color push Black.67S color popDps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.68) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 22 H.A endHps:SDict begin [/View [/XYZ H.V]/Dest (section*.2) cvn /DEST pdfmark endt*Referencest*R8ps:SDict begin H.S endps:SDict begin 14.5 H.A endGps:SDict begin [/View [/XYZ H.V]/Dest (cite.4ti2) cvn /DEST pdfmark end덍color push gray 0[1] color pop' 4ti2hteam.4ti2|asoftrwarehpackXagehforalgebraic,lgeometricandcomrbina-' torialproblemsonlinearspaces.5AvXailableatwww.4ti2.de.?ps:SDict begin H.S endps:SDict begin 14.5 H.A endOps:SDict begin [/View [/XYZ H.V]/Dest (cite.allermannRau) cvn /DEST pdfmark endcolor push gray 0[2] color pop' LarsBAllermannCandJohannesRau.5 FirststepsintropicalinrtersectiontheoryV.' SMathematische35Zeitschrift,2009.ps:SDict begin H.S endps:SDict begin 14.5 H.A endGps:SDict begin [/View [/XYZ H.V]/Dest (cite.avis) cvn /DEST pdfmark endcolor push gray 0[3] color pop' Darvid`Avisand`KomeiFVukuda. A`?basisenumeration`algorithmforcon-' vrex'Dhulls'Eandvertex'Eenumerationofarrangements'EandpSolyhedra.'SDiscrffete' Computational35Geffometry,8:295{313,1992.ps:SDict begin H.S endps:SDict begin 14.5 H.A endEps:SDict begin [/View [/XYZ H.V]/Dest (cite.bg) cvn /DEST pdfmark endcolor push gray 0[4] color pop' RobSert"*BieriandJ.R.J.Grorves.The"*geometryofthesetofcrharacters' inducedbryvXaluations.5SJ.35RffeineA2ngew.Math.,347:168{195,1984.ps:SDict begin H.S endps:SDict begin 14.5 H.A endFps:SDict begin [/View [/XYZ H.V]/Dest (cite.ctv) cvn /DEST pdfmark endcolor push gray 0[5] color pop' T.Bogart,WA.N.Jensen,D.SpSeyrer,VB.Sturmfels,andR.R.Thomas.' ComputingtropicalvXarieties. >/Subtype /Link H.B /ANN pdfmark end.:ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (cite.fukuda) cvn /DEST pdfmark endeAcolor push gray 0[9] color pop' KomeiFVukuda,2&AndersJensen,2'andRekhaThomas.BFComputingGr obner' fans.5SMathematics35ofComputation,toappffear,2007,math.ArC/0509544.ps:SDict begin H.S endps:SDict begin 14.5 H.A endKps:SDict begin [/View [/XYZ H.V]/Dest (cite.polymake) cvn /DEST pdfmark endcolor push gray 0[10] color pop' Ewgenij̙Garwrilow̘andMichael̘Joswig.c>/Subtype /Link H.B /ANN pdfmark end.:ps:SDict begin H.S endps:SDict begin 14.5 H.A endHps:SDict begin [/View [/XYZ H.V]/Dest (cite.huber) cvn /DEST pdfmark endeAcolor push gray 0[12] color pop' BirkrettcHubSerandRekhaR.Thomas. ComputingGr obnerfansoftoric' ideals.5SExpfferimental35Mathematics,9(3/4):321{331,2000.ps:SDict begin H.S endps:SDict begin 14.5 H.A endGps:SDict begin [/View [/XYZ H.V]/Dest (cite.cats) cvn /DEST pdfmark endcolor push gray 0[13] color pop' Anders`(Jensen.SCaTS,asoftrware`(systemfortoricstatepSolytopes.AvXailable' athrttp://www.soSopadoopa.dk/anders/cats/cats.html.ps:SDict begin H.S endps:SDict begin 14.5 H.A endPps:SDict begin [/View [/XYZ H.V]/Dest (cite.symmetricfans) cvn /DEST pdfmark endcolor push gray 0[14] color pop' Anders N. Jensen. *TVrarversingsymmetric pSolyhedralfans. *toappSearin' \MathematicalSoftrware-ICMS2010",2010.t*color push Black.68S color popEps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end s5ps:SDict begin H.S endps:SDict begin H.R endEps:SDict begin [/View [/XYZ H.V]/Dest (page.69) cvn /DEST pdfmark end\t*color push BlackS color popt*ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (cite.thesis) cvn /DEST pdfmark end color push gray 0[15] color pop' Anders Nedergaard Jensen.SA2lgorithmic EaspffectsofGrobnerfans' and ;8trffopical ;7varieties.RPhD xthesis, eUnivrersity zrof zsAarhus,2007.' ps:SDict begin H.S end' color push gray 0Xhttp://www.imf.au.dk/publs?id=655 color popyps:SDict begin H.R endyps:SDict begin [/H /I/Border [0 0 1]BorderArrayPatch/Color [0 1 1]/Action <>/Subtype /Link H.B /ANN pdfmark end.ps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (cite.jensen) cvn /DEST pdfmark endVcolor push gray 0[16] color pop' AndersjNedergaardJensen.Ajnon-regularGr obnerfan.SDiscrffeteComput.' Geffom.,37(3):443{453,2007,math.CO/0501352.ps:SDict begin H.S endps:SDict begin 14.5 H.A endOps:SDict begin [/View [/XYZ H.V]/Dest (cite.tropicalbook) cvn /DEST pdfmark endcolor push gray 0[17] color pop' D.)Maclaganand*B.Sturmfels.'SIntrffoductiontoTropicalGeometry:.'Gradu-' ateStudiesinMathematics.AmericanMathematicalSoScietryV,2015.UTps:SDict begin H.S endps:SDict begin 14.5 H.A endJps:SDict begin [/View [/XYZ H.V]/Dest (cite.lifting) cvn /DEST pdfmark end*color push gray 0[18] color pop' HannahMarkwig,\ThomasMarkwig,]andAndersJensen.Analgorithmfor' liftingpSoinrtsinatropicalvXarietyV.52007,math.AG/0705.2441.ps:SDict begin H.S endps:SDict begin 14.5 H.A endGps:SDict begin [/View [/XYZ H.V]/Dest (cite.MoRo) cvn /DEST pdfmark endcolor push gray 0[19] color pop' TVeoMoraandLorenzoRobbiano.TheGr obnerfanofanideal.SJ. Symbffolic' Comput.,u6(2-3):183{208,u1988.ComputationalYgaspSectsYfofcommrutativeYgal-' gebra.UTps:SDict begin H.S endps:SDict begin 14.5 H.A endIps:SDict begin [/View [/XYZ H.V]/Dest (cite.rambau) cvn /DEST pdfmark end*color push gray 0[20] color pop' J org Ramrbau.[FTOPCOM:TVriangulations ofpSointcon gurationsandori-' enrtedmatroids.5SZIB35rffeport,02-17,2002.ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (cite.tropgrass) cvn /DEST pdfmark end*color push gray 0[21] color pop' DarvidSpSeyerandBerndSturmfels./ThetropicalGrassmannian./SAffdv.=Geom.,' 4(3):389{411,2004,math.ArG/0304218.ps:SDict begin H.S endps:SDict begin 14.5 H.A endLps:SDict begin [/View [/XYZ H.V]/Dest (cite.sturmfels) cvn /DEST pdfmark endcolor push gray 0[22] color pop' BerndfSturmfels.ySGrobner8bffasesandconvexpolytopes,vrolumef8gofSUniversity' Lffecture35Series.5AmericanMathematicalSoScietryV,Providence,RI,1996.ps:SDict begin H.S endps:SDict begin 14.5 H.A endSps:SDict begin [/View [/XYZ H.V]/Dest (cite.sturmfelssolving) cvn /DEST pdfmark end*color push gray 0[23] color pop' BerndSturmfels. ?SSolving.systems-ofpffolynomialequations,vrolume97of' SCBMSLRffegionalLConferenceSeriesLinMathematics.'PublishedbforatheCon-' ferenceBoardoftheMathematicalSciences,WVashington,DC,2002.ps:SDict begin H.S endps:SDict begin 14.5 H.A endMps:SDict begin [/View [/XYZ H.V]/Dest (cite.wunderling) cvn /DEST pdfmark end*color push gray 0[24] color pop' Roland =WVunderling."c)SParffalleler 3.und 3-objektorientierterSimplex-' Algorithmus.1PhD thesis, STVecrhnische 1Universit atBerlin, S1996.' ps:SDict begin H.S end' color push gray 0Xhttp://www.zib.de/Publications/abstracts/TR-96-09/ color popMps:SDict begin H.R endMps:SDict begin [/H /I/Border [0 0 1]BorderArrayPatch/Color [0 1 1]/Action <>/Subtype /Link H.B /ANN pdfmark end.t*color push Black.69S color pop۫;d} EYNG cmbx12<"V 3 cmbx10;K`y 3 cmr10:tcrm070059 tcrm1000'XQ ff cmr12&DtqGcmr17$XQ cmr12!!", cmsy10 b> cmmi10K`y cmr10ٓRcmr7gfan0.8beta/doc/manual.bbl0000664000175000017500000001126115177170257015107 0ustar andersanders\def\cprime{$'$} \begin{thebibliography}{10} \bibitem{4ti2} 4ti2 team. \newblock 4ti2---a software package for algebraic, geometric and combinatorial problems on linear spaces. \newblock {A}vailable at www.4ti2.de. \bibitem{allermannRau} Lars Allermann and Johannes Rau. \newblock First steps in tropical intersection theory. \newblock {\em Mathematische Zeitschrift}, 2009. \bibitem{avis} David Avis and Komei Fukuda. \newblock A basis enumeration algorithm for convex hulls and vertex enumeration of arrangements and polyhedra. \newblock {\em Discrete Computational Geometry}, 8:295--313, 1992. \bibitem{bg} Robert Bieri and J.~R.~J. Groves. \newblock The geometry of the set of characters induced by valuations. \newblock {\em J. Reine Angew. Math.}, 347:168--195, 1984. \bibitem{ctv} T.~Bogart, A.~N. Jensen, D.~Speyer, B.~Sturmfels, and R.~R. Thomas. \newblock Computing tropical varieties. \newblock {\em J. Symbolic Comput.}, 42(1-2):54--73, 2007, math.AG/0507563. \bibitem{Buch} Bruno Buchberger. \newblock An algorithm for finding a basis for the residue class ring of a zero-dimensional polynomial ideal, 1965. \newblock PhD-thesis (German). \bibitem{collart} S.~Collart, M.~Kalkbrener, and D.~Mall. \newblock Converting bases with the {G}r\"obner walk. \newblock {\em J. Symbolic Comput.}, 24(3-4):465--469, 1997. \newblock Computational algebra and number theory (London, 1993). \bibitem{cdd} Komei Fukuda. \newblock {\em cddlib reference manual, cddlib Version 094b}. \newblock ~Swiss Federal Institute of Technology, Lausanne and Z{\"u}rich, Switzerland, 2005. \newblock \url{http://www.ifor.math.ethz.ch/~fukuda/cdd_home/cdd.html}. \bibitem{fukuda} Komei Fukuda, Anders Jensen, and Rekha Thomas. \newblock Computing {G}r{\"o}bner fans. \newblock {\em Mathematics of Computation, to appear}, 2007, math.AC/0509544. \bibitem{polymake} Ewgenij Gawrilow and Michael Joswig. \newblock polymake: a framework for analyzing convex polytopes. \newblock In Gil Kalai and G\"unter~M. Ziegler, editors, {\em Polytopes --- Combinatorics and Computation}, pages 43--74. Birkh\"auser, 2000. \bibitem{gmp} Torbj{\"o}rn {Granlund et al.} \newblock {GNU} multiple precision arithmetic library 4.1.2, December 2002. \newblock \url{http://swox.com/gmp/}. \bibitem{huber} Birkett Huber and Rekha~R. Thomas. \newblock Computing {G}r{\"o}bner fans of toric ideals. \newblock {\em Experimental Mathematics}, 9(3/4):321--331, 2000. \bibitem{cats} Anders Jensen. \newblock {CaTS}, a software system for toric state polytopes. \newblock Available at {http://www.soopadoopa.dk/anders/cats/cats.html}. \bibitem{symmetricfans} Anders~N. Jensen. \newblock Traversing symmetric polyhedral fans. \newblock to appear in ``Mathe\-matical Software - ICMS 2010'', 2010. \bibitem{thesis} Anders~Nedergaard Jensen. \newblock {\em Algorithmic aspects of {G}r\"obner fans and tropical varieties}. \newblock PhD thesis, University of Aarhus, 2007. \newblock \url{http://www.imf.au.dk/publs?id=655}. \bibitem{jensen} Anders~Nedergaard Jensen. \newblock A non-regular {G}r\"obner fan. \newblock {\em Discrete Comput. Geom.}, 37(3):443--453, 2007, math.CO/0501352. \bibitem{tropicalbook} D.~Maclagan and B.~Sturmfels. \newblock {\em Introduction to Tropical Geometry:}. \newblock Graduate Studies in Mathematics. American Mathematical Society, 2015. \bibitem{lifting} Hannah Markwig, Thomas Markwig, and Anders Jensen. \newblock An algorithm for lifting points in a tropical variety. \newblock 2007, math.AG/0705.2441. \bibitem{MoRo} Teo Mora and Lorenzo Robbiano. \newblock The {G}r\"obner fan of an ideal. \newblock {\em J. Symbolic Comput.}, 6(2-3):183--208, 1988. \newblock Computational aspects of commutative algebra. \bibitem{rambau} J{\"o}rg Rambau. \newblock {TOPCOM}: Triangulations of point configurations and oriented matroids. \newblock {\em ZIB report}, 02-17, 2002. \bibitem{tropgrass} David Speyer and Bernd Sturmfels. \newblock The tropical {G}rassmannian. \newblock {\em Adv. Geom.}, 4(3):389--411, 2004, math.AG/0304218. \bibitem{sturmfels} Bernd Sturmfels. \newblock {\em Gr\"obner bases and convex polytopes}, volume~8 of {\em University Lecture Series}. \newblock American Mathematical Society, Providence, RI, 1996. \bibitem{sturmfelssolving} Bernd Sturmfels. \newblock {\em Solving systems of polynomial equations}, volume~97 of {\em CBMS Regional Conference Series in Mathematics}. \newblock Published for the Conference Board of the Mathematical Sciences, Washington, DC, 2002. \bibitem{wunderling} Roland Wunderling. \newblock {\em Paralleler und objektorientierter {S}implex-{A}lgorithmus}. \newblock PhD thesis, Technische Universit{\"a}t Berlin, 1996. \newblock \url{http://www.zib.de/Publications/abstracts/TR-96-09/}. \end{thebibliography} gfan0.8beta/doc/staircase.eps0000664000175000017500000326215515177170257015655 0ustar andersanders%!PS-Adobe-2.0 EPSF-2.0 %%Title: staircase.fig %%Creator: fig2dev Version 3.2 Patchlevel 4 %%CreationDate: Tue Apr 5 11:04:56 2005 %%For: anders@paula (Anders Nedergaard Jensen) %%BoundingBox: 0 0 1353 463 %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save newpath 0 463 moveto 0 0 lineto 1353 0 lineto 1353 463 lineto closepath clip newpath -14.8 461.5 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def $F2psBegin 10 setmiterlimit 0 slj 0 slc 0.06000 0.06000 sc % % Fig objects follow % % % here starts figure with depth 50 % Polyline 7.500 slw n 2231 2100 m 2127 2159 l 2127 2039 l 2231 1980 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 2127 1920 m 2023 1979 l 2023 1860 l 2127 1801 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 2023 1740 m 1920 1800 l 1920 1680 l 2023 1621 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 2023 1620 m 1920 1680 l 1920 1560 l 2023 1501 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1920 1440 m 1817 1500 l 1817 1380 l 1920 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 1320 m 1817 1380 l 1817 1260 l 1920 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 1200 m 1817 1260 l 1817 1140 l 1920 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 1080 m 1817 1140 l 1817 1020 l 1920 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 960 m 1817 1020 l 1817 900 l 1920 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 840 m 1817 900 l 1817 780 l 1920 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 720 m 1817 780 l 1817 660 l 1920 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 600 m 1817 660 l 1817 540 l 1920 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 480 m 1817 540 l 1817 420 l 1920 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 360 m 1817 420 l 1817 300 l 1920 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 240 m 1817 300 l 1817 180 l 1920 121 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 120 m 1817 180 l 1817 60 l 1920 1 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 2100 m 1920 2159 l 1920 2039 l 2023 1980 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 2023 1980 m 1920 2039 l 1920 1920 l 2023 1861 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1920 1800 m 1817 1860 l 1817 1740 l 1920 1681 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1920 1680 m 1817 1740 l 1817 1620 l 1920 1561 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1817 1500 m 1713 1560 l 1713 1440 l 1817 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 1380 m 1713 1440 l 1713 1320 l 1817 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 1260 m 1713 1320 l 1713 1200 l 1817 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 1140 m 1713 1200 l 1713 1080 l 1817 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 1020 m 1713 1080 l 1713 960 l 1817 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 900 m 1713 960 l 1713 840 l 1817 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 780 m 1713 840 l 1713 720 l 1817 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 660 m 1713 720 l 1713 600 l 1817 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 540 m 1713 600 l 1713 480 l 1817 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 420 m 1713 480 l 1713 360 l 1817 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 300 m 1713 360 l 1713 240 l 1817 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 180 m 1713 240 l 1713 120 l 1817 61 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 2100 m 1713 2159 l 1713 2039 l 1817 1980 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1713 1920 m 1609 1979 l 1609 1860 l 1713 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 1800 m 1609 1860 l 1609 1740 l 1713 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 1680 m 1609 1740 l 1609 1620 l 1713 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 1560 m 1609 1620 l 1609 1500 l 1713 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 1440 m 1609 1500 l 1609 1380 l 1713 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 1320 m 1609 1380 l 1609 1260 l 1713 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 1200 m 1609 1260 l 1609 1140 l 1713 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 1080 m 1609 1140 l 1609 1020 l 1713 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 960 m 1609 1020 l 1609 900 l 1713 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 840 m 1609 900 l 1609 780 l 1713 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 720 m 1609 780 l 1609 660 l 1713 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 600 m 1609 660 l 1609 540 l 1713 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 480 m 1609 540 l 1609 420 l 1713 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 360 m 1609 420 l 1609 300 l 1713 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 240 m 1609 300 l 1609 180 l 1713 121 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 2160 m 1609 2219 l 1609 2099 l 1713 2040 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1609 1980 m 1505 2039 l 1505 1920 l 1609 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 1860 m 1505 1920 l 1505 1800 l 1609 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 1740 m 1505 1800 l 1505 1680 l 1609 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 1620 m 1505 1680 l 1505 1560 l 1609 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 1500 m 1505 1560 l 1505 1440 l 1609 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 1380 m 1505 1440 l 1505 1320 l 1609 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 1260 m 1505 1320 l 1505 1200 l 1609 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 1140 m 1505 1200 l 1505 1080 l 1609 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 1020 m 1505 1080 l 1505 960 l 1609 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 900 m 1505 960 l 1505 840 l 1609 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 780 m 1505 840 l 1505 720 l 1609 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 660 m 1505 720 l 1505 600 l 1609 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 540 m 1505 600 l 1505 480 l 1609 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 420 m 1505 480 l 1505 360 l 1609 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 300 m 1505 360 l 1505 240 l 1609 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 2160 m 1401 2219 l 1401 2099 l 1505 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 2040 m 1401 2099 l 1401 1979 l 1505 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 1920 m 1401 1979 l 1401 1860 l 1505 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 1800 m 1401 1860 l 1401 1740 l 1505 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 1680 m 1401 1740 l 1401 1620 l 1505 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 1560 m 1401 1620 l 1401 1500 l 1505 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 1440 m 1401 1500 l 1401 1380 l 1505 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 1320 m 1401 1380 l 1401 1260 l 1505 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 1200 m 1401 1260 l 1401 1140 l 1505 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 1080 m 1401 1140 l 1401 1020 l 1505 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 960 m 1401 1020 l 1401 900 l 1505 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 840 m 1401 900 l 1401 780 l 1505 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 720 m 1401 780 l 1401 660 l 1505 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 600 m 1401 660 l 1401 540 l 1505 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 480 m 1401 540 l 1401 420 l 1505 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 360 m 1401 420 l 1401 300 l 1505 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 2220 m 1297 2279 l 1297 2159 l 1401 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 2100 m 1297 2159 l 1297 2039 l 1401 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 1980 m 1297 2039 l 1297 1920 l 1401 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 1860 m 1297 1920 l 1297 1800 l 1401 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 1740 m 1297 1800 l 1297 1680 l 1401 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 1620 m 1297 1680 l 1297 1560 l 1401 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 1500 m 1297 1560 l 1297 1440 l 1401 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 1380 m 1297 1440 l 1297 1320 l 1401 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 1260 m 1297 1320 l 1297 1200 l 1401 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 1140 m 1297 1200 l 1297 1080 l 1401 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 1020 m 1297 1080 l 1297 960 l 1401 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 900 m 1297 960 l 1297 840 l 1401 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 780 m 1297 840 l 1297 720 l 1401 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 660 m 1297 720 l 1297 600 l 1401 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 540 m 1297 600 l 1297 480 l 1401 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 420 m 1297 480 l 1297 360 l 1401 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 2280 m 1193 2339 l 1193 2219 l 1297 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 2160 m 1193 2219 l 1193 2099 l 1297 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 2040 m 1193 2099 l 1193 1979 l 1297 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 1920 m 1193 1979 l 1193 1860 l 1297 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 1800 m 1193 1860 l 1193 1740 l 1297 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 1680 m 1193 1740 l 1193 1620 l 1297 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 1560 m 1193 1620 l 1193 1500 l 1297 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 1440 m 1193 1500 l 1193 1380 l 1297 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 1320 m 1193 1380 l 1193 1260 l 1297 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 1200 m 1193 1260 l 1193 1140 l 1297 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 1080 m 1193 1140 l 1193 1020 l 1297 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 960 m 1193 1020 l 1193 900 l 1297 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 840 m 1193 900 l 1193 780 l 1297 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 720 m 1193 780 l 1193 660 l 1297 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 600 m 1193 660 l 1193 540 l 1297 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 480 m 1193 540 l 1193 420 l 1297 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 2340 m 1089 2399 l 1089 2279 l 1193 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 2220 m 1089 2279 l 1089 2159 l 1193 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 2100 m 1089 2159 l 1089 2039 l 1193 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 1980 m 1089 2039 l 1089 1920 l 1193 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 1860 m 1089 1920 l 1089 1800 l 1193 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 1740 m 1089 1800 l 1089 1680 l 1193 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 1620 m 1089 1680 l 1089 1560 l 1193 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 1500 m 1089 1560 l 1089 1440 l 1193 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 1380 m 1089 1440 l 1089 1320 l 1193 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 1260 m 1089 1320 l 1089 1200 l 1193 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 1140 m 1089 1200 l 1089 1080 l 1193 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 1020 m 1089 1080 l 1089 960 l 1193 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 900 m 1089 960 l 1089 840 l 1193 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 780 m 1089 840 l 1089 720 l 1193 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 660 m 1089 720 l 1089 600 l 1193 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 540 m 1089 600 l 1089 480 l 1193 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 2400 m 985 2459 l 985 2339 l 1089 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 2280 m 985 2339 l 985 2219 l 1089 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 2160 m 985 2219 l 985 2099 l 1089 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 2040 m 985 2099 l 985 1979 l 1089 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 1920 m 985 1979 l 985 1860 l 1089 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 1800 m 985 1860 l 985 1740 l 1089 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 1680 m 985 1740 l 985 1620 l 1089 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 1560 m 985 1620 l 985 1500 l 1089 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 1440 m 985 1500 l 985 1380 l 1089 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 1320 m 985 1380 l 985 1260 l 1089 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 1200 m 985 1260 l 985 1140 l 1089 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 1080 m 985 1140 l 985 1020 l 1089 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 960 m 985 1020 l 985 900 l 1089 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 840 m 985 900 l 985 780 l 1089 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 720 m 985 780 l 985 660 l 1089 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 600 m 985 660 l 985 540 l 1089 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 2460 m 881 2519 l 881 2399 l 985 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 2340 m 881 2399 l 881 2279 l 985 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 2220 m 881 2279 l 881 2159 l 985 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 2100 m 881 2159 l 881 2039 l 985 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 1980 m 881 2039 l 881 1920 l 985 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 1860 m 881 1920 l 881 1800 l 985 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 1740 m 881 1800 l 881 1680 l 985 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 1620 m 881 1680 l 881 1560 l 985 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 1500 m 881 1560 l 881 1440 l 985 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 1380 m 881 1440 l 881 1320 l 985 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 1260 m 881 1320 l 881 1200 l 985 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 1140 m 881 1200 l 881 1080 l 985 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 1020 m 881 1080 l 881 960 l 985 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 900 m 881 960 l 881 840 l 985 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 780 m 881 840 l 881 720 l 985 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 660 m 881 720 l 881 600 l 985 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 2520 m 777 2579 l 777 2459 l 881 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 2400 m 777 2459 l 777 2339 l 881 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 2280 m 777 2339 l 777 2219 l 881 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 2160 m 777 2219 l 777 2099 l 881 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 2040 m 777 2099 l 777 1979 l 881 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 1920 m 777 1979 l 777 1860 l 881 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 1800 m 777 1860 l 777 1740 l 881 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 1680 m 777 1740 l 777 1620 l 881 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 1560 m 777 1620 l 777 1500 l 881 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 1440 m 777 1500 l 777 1380 l 881 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 1320 m 777 1380 l 777 1260 l 881 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 1200 m 777 1260 l 777 1140 l 881 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 1080 m 777 1140 l 777 1020 l 881 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 960 m 777 1020 l 777 900 l 881 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 840 m 777 900 l 777 780 l 881 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 720 m 777 780 l 777 660 l 881 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 2580 m 673 2639 l 673 2519 l 777 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 2460 m 673 2519 l 673 2399 l 777 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 2340 m 673 2399 l 673 2279 l 777 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 2220 m 673 2279 l 673 2159 l 777 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 2100 m 673 2159 l 673 2039 l 777 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 1980 m 673 2039 l 673 1920 l 777 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 1860 m 673 1920 l 673 1800 l 777 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 1740 m 673 1800 l 673 1680 l 777 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 1620 m 673 1680 l 673 1560 l 777 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 1500 m 673 1560 l 673 1440 l 777 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 1380 m 673 1440 l 673 1320 l 777 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 1260 m 673 1320 l 673 1200 l 777 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 1140 m 673 1200 l 673 1080 l 777 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 1020 m 673 1080 l 673 960 l 777 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 900 m 673 960 l 673 840 l 777 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 780 m 673 840 l 673 720 l 777 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 2640 m 570 2699 l 570 2579 l 673 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 2520 m 570 2579 l 570 2459 l 673 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 2400 m 570 2459 l 570 2339 l 673 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 2280 m 570 2339 l 570 2219 l 673 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 2160 m 570 2219 l 570 2099 l 673 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 2040 m 570 2099 l 570 1979 l 673 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 1920 m 570 1979 l 570 1860 l 673 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 1800 m 570 1860 l 570 1740 l 673 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 1680 m 570 1740 l 570 1620 l 673 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 1560 m 570 1620 l 570 1500 l 673 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 1440 m 570 1500 l 570 1380 l 673 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 1320 m 570 1380 l 570 1260 l 673 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 1200 m 570 1260 l 570 1140 l 673 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 1080 m 570 1140 l 570 1020 l 673 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 960 m 570 1020 l 570 900 l 673 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 840 m 570 900 l 570 780 l 673 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 2700 m 466 2759 l 466 2639 l 570 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 2580 m 466 2639 l 466 2519 l 570 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 2460 m 466 2519 l 466 2399 l 570 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 2340 m 466 2399 l 466 2279 l 570 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 2220 m 466 2279 l 466 2159 l 570 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 2100 m 466 2159 l 466 2039 l 570 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 1980 m 466 2039 l 466 1920 l 570 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 1860 m 466 1920 l 466 1800 l 570 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 1740 m 466 1800 l 466 1680 l 570 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 1620 m 466 1680 l 466 1560 l 570 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 1500 m 466 1560 l 466 1440 l 570 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 1380 m 466 1440 l 466 1320 l 570 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 1260 m 466 1320 l 466 1200 l 570 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 1140 m 466 1200 l 466 1080 l 570 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 1020 m 466 1080 l 466 960 l 570 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 900 m 466 960 l 466 840 l 570 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 2760 m 362 2819 l 362 2699 l 466 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 2640 m 362 2699 l 362 2579 l 466 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 2520 m 362 2579 l 362 2459 l 466 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 2400 m 362 2459 l 362 2339 l 466 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 2280 m 362 2339 l 362 2219 l 466 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 2160 m 362 2219 l 362 2099 l 466 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 2040 m 362 2099 l 362 1979 l 466 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 1920 m 362 1979 l 362 1860 l 466 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 1800 m 362 1860 l 362 1740 l 466 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 1680 m 362 1740 l 362 1620 l 466 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 1560 m 362 1620 l 362 1500 l 466 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 1440 m 362 1500 l 362 1380 l 466 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 1320 m 362 1380 l 362 1260 l 466 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 1200 m 362 1260 l 362 1140 l 466 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 1080 m 362 1140 l 362 1020 l 466 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 960 m 362 1020 l 362 900 l 466 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 2820 m 258 2879 l 258 2759 l 362 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 2700 m 258 2759 l 258 2639 l 362 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 2580 m 258 2639 l 258 2519 l 362 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 2460 m 258 2519 l 258 2399 l 362 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 2340 m 258 2399 l 258 2279 l 362 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 2220 m 258 2279 l 258 2159 l 362 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 2100 m 258 2159 l 258 2039 l 362 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 1980 m 258 2039 l 258 1920 l 362 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 1860 m 258 1920 l 258 1800 l 362 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 1740 m 258 1800 l 258 1680 l 362 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 1620 m 258 1680 l 258 1560 l 362 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 1500 m 258 1560 l 258 1440 l 362 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 1380 m 258 1440 l 258 1320 l 362 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 1260 m 258 1320 l 258 1200 l 362 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 1140 m 258 1200 l 258 1080 l 362 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 1020 m 258 1080 l 258 960 l 362 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 2160 m 1505 2040 l 1609 2100 l 1609 2220 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 1713 1920 m 1713 1800 l 1817 1861 l 1817 1980 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 1713 1800 m 1713 1680 l 1817 1741 l 1817 1861 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 1713 1680 m 1713 1560 l 1817 1621 l 1817 1741 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 1920 1440 m 1920 1320 l 2023 1381 l 2023 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 1320 m 1920 1200 l 2023 1261 l 2023 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 1200 m 1920 1080 l 2023 1141 l 2023 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 1080 m 1920 960 l 2023 1021 l 2023 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 960 m 1920 840 l 2023 901 l 2023 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 840 m 1920 720 l 2023 781 l 2023 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 720 m 1920 600 l 2023 661 l 2023 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 600 m 1920 480 l 2023 541 l 2023 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 480 m 1920 360 l 2023 421 l 2023 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 360 m 1920 240 l 2023 301 l 2023 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 240 m 1920 120 l 2023 181 l 2023 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 120 m 1920 0 l 2023 61 l 2023 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 2100 m 1817 1980 l 1920 2040 l 1920 2160 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 1817 1980 m 1817 1860 l 1920 1920 l 1920 2040 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 2023 1740 m 2023 1620 l 2127 1681 l 2127 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 1620 m 2023 1500 l 2127 1561 l 2127 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 1500 m 2023 1380 l 2127 1441 l 2127 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 1380 m 2023 1260 l 2127 1321 l 2127 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 1260 m 2023 1140 l 2127 1201 l 2127 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 1140 m 2023 1020 l 2127 1081 l 2127 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 1020 m 2023 900 l 2127 961 l 2127 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 900 m 2023 780 l 2127 841 l 2127 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 780 m 2023 660 l 2127 721 l 2127 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 660 m 2023 540 l 2127 601 l 2127 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 540 m 2023 420 l 2127 481 l 2127 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 420 m 2023 300 l 2127 361 l 2127 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 300 m 2023 180 l 2127 241 l 2127 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 180 m 2023 60 l 2127 121 l 2127 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 2100 m 2023 1980 l 2127 2040 l 2127 2160 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 2127 1920 m 2127 1800 l 2231 1861 l 2231 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 1800 m 2127 1680 l 2231 1741 l 2231 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 1680 m 2127 1560 l 2231 1621 l 2231 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 1560 m 2127 1440 l 2231 1501 l 2231 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 1440 m 2127 1320 l 2231 1381 l 2231 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 1320 m 2127 1200 l 2231 1261 l 2231 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 1200 m 2127 1080 l 2231 1141 l 2231 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 1080 m 2127 960 l 2231 1021 l 2231 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 960 m 2127 840 l 2231 901 l 2231 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 840 m 2127 720 l 2231 781 l 2231 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 720 m 2127 600 l 2231 661 l 2231 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 600 m 2127 480 l 2231 541 l 2231 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 480 m 2127 360 l 2231 421 l 2231 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 360 m 2127 240 l 2231 301 l 2231 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 240 m 2127 120 l 2231 181 l 2231 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 2100 m 2231 1980 l 2335 2040 l 2335 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 1980 m 2231 1860 l 2335 1920 l 2335 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 1860 m 2231 1740 l 2335 1801 l 2335 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 1740 m 2231 1620 l 2335 1681 l 2335 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 1620 m 2231 1500 l 2335 1561 l 2335 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 1500 m 2231 1380 l 2335 1441 l 2335 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 1380 m 2231 1260 l 2335 1321 l 2335 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 1260 m 2231 1140 l 2335 1201 l 2335 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 1140 m 2231 1020 l 2335 1081 l 2335 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 1020 m 2231 900 l 2335 961 l 2335 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 900 m 2231 780 l 2335 841 l 2335 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 780 m 2231 660 l 2335 721 l 2335 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 660 m 2231 540 l 2335 601 l 2335 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 540 m 2231 420 l 2335 481 l 2335 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 420 m 2231 300 l 2335 361 l 2335 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 300 m 2231 180 l 2335 241 l 2335 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 2160 m 2335 2040 l 2439 2100 l 2439 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 2040 m 2335 1920 l 2439 1980 l 2439 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 1920 m 2335 1800 l 2439 1861 l 2439 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 1800 m 2335 1680 l 2439 1741 l 2439 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 1680 m 2335 1560 l 2439 1621 l 2439 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 1560 m 2335 1440 l 2439 1501 l 2439 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 1440 m 2335 1320 l 2439 1381 l 2439 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 1320 m 2335 1200 l 2439 1261 l 2439 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 1200 m 2335 1080 l 2439 1141 l 2439 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 1080 m 2335 960 l 2439 1021 l 2439 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 960 m 2335 840 l 2439 901 l 2439 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 840 m 2335 720 l 2439 781 l 2439 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 720 m 2335 600 l 2439 661 l 2439 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 600 m 2335 480 l 2439 541 l 2439 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 480 m 2335 360 l 2439 421 l 2439 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 360 m 2335 240 l 2439 301 l 2439 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 2220 m 2439 2100 l 2543 2160 l 2543 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 2100 m 2439 1980 l 2543 2040 l 2543 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 1980 m 2439 1860 l 2543 1920 l 2543 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 1860 m 2439 1740 l 2543 1801 l 2543 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 1740 m 2439 1620 l 2543 1681 l 2543 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 1620 m 2439 1500 l 2543 1561 l 2543 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 1500 m 2439 1380 l 2543 1441 l 2543 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 1380 m 2439 1260 l 2543 1321 l 2543 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 1260 m 2439 1140 l 2543 1201 l 2543 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 1140 m 2439 1020 l 2543 1081 l 2543 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 1020 m 2439 900 l 2543 961 l 2543 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 900 m 2439 780 l 2543 841 l 2543 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 780 m 2439 660 l 2543 721 l 2543 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 660 m 2439 540 l 2543 601 l 2543 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 540 m 2439 420 l 2543 481 l 2543 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 420 m 2439 300 l 2543 361 l 2543 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 2280 m 2543 2160 l 2647 2220 l 2647 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 2160 m 2543 2040 l 2647 2100 l 2647 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 2040 m 2543 1920 l 2647 1980 l 2647 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 1920 m 2543 1800 l 2647 1861 l 2647 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 1800 m 2543 1680 l 2647 1741 l 2647 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 1680 m 2543 1560 l 2647 1621 l 2647 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 1560 m 2543 1440 l 2647 1501 l 2647 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 1440 m 2543 1320 l 2647 1381 l 2647 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 1320 m 2543 1200 l 2647 1261 l 2647 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 1200 m 2543 1080 l 2647 1141 l 2647 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 1080 m 2543 960 l 2647 1021 l 2647 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 960 m 2543 840 l 2647 901 l 2647 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 840 m 2543 720 l 2647 781 l 2647 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 720 m 2543 600 l 2647 661 l 2647 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 600 m 2543 480 l 2647 541 l 2647 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 480 m 2543 360 l 2647 421 l 2647 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 2340 m 2647 2220 l 2751 2280 l 2751 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 2220 m 2647 2100 l 2751 2160 l 2751 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 2100 m 2647 1980 l 2751 2040 l 2751 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 1980 m 2647 1860 l 2751 1920 l 2751 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 1860 m 2647 1740 l 2751 1801 l 2751 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 1740 m 2647 1620 l 2751 1681 l 2751 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 1620 m 2647 1500 l 2751 1561 l 2751 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 1500 m 2647 1380 l 2751 1441 l 2751 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 1380 m 2647 1260 l 2751 1321 l 2751 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 1260 m 2647 1140 l 2751 1201 l 2751 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 1140 m 2647 1020 l 2751 1081 l 2751 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 1020 m 2647 900 l 2751 961 l 2751 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 900 m 2647 780 l 2751 841 l 2751 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 780 m 2647 660 l 2751 721 l 2751 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 660 m 2647 540 l 2751 601 l 2751 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 540 m 2647 420 l 2751 481 l 2751 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 2400 m 2751 2280 l 2855 2340 l 2855 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 2280 m 2751 2160 l 2855 2220 l 2855 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 2160 m 2751 2040 l 2855 2100 l 2855 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 2040 m 2751 1920 l 2855 1980 l 2855 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 1920 m 2751 1800 l 2855 1861 l 2855 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 1800 m 2751 1680 l 2855 1741 l 2855 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 1680 m 2751 1560 l 2855 1621 l 2855 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 1560 m 2751 1440 l 2855 1501 l 2855 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 1440 m 2751 1320 l 2855 1381 l 2855 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 1320 m 2751 1200 l 2855 1261 l 2855 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 1200 m 2751 1080 l 2855 1141 l 2855 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 1080 m 2751 960 l 2855 1021 l 2855 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 960 m 2751 840 l 2855 901 l 2855 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 840 m 2751 720 l 2855 781 l 2855 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 720 m 2751 600 l 2855 661 l 2855 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 600 m 2751 480 l 2855 541 l 2855 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 2460 m 2855 2340 l 2959 2400 l 2959 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 2340 m 2855 2220 l 2959 2280 l 2959 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 2220 m 2855 2100 l 2959 2160 l 2959 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 2100 m 2855 1980 l 2959 2040 l 2959 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 1980 m 2855 1860 l 2959 1920 l 2959 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 1860 m 2855 1740 l 2959 1801 l 2959 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 1740 m 2855 1620 l 2959 1681 l 2959 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 1620 m 2855 1500 l 2959 1561 l 2959 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 1500 m 2855 1380 l 2959 1441 l 2959 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 1380 m 2855 1260 l 2959 1321 l 2959 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 1260 m 2855 1140 l 2959 1201 l 2959 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 1140 m 2855 1020 l 2959 1081 l 2959 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 1020 m 2855 900 l 2959 961 l 2959 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 900 m 2855 780 l 2959 841 l 2959 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 780 m 2855 660 l 2959 721 l 2959 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 660 m 2855 540 l 2959 601 l 2959 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 2520 m 2959 2400 l 3063 2460 l 3063 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 2400 m 2959 2280 l 3063 2340 l 3063 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 2280 m 2959 2160 l 3063 2220 l 3063 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 2160 m 2959 2040 l 3063 2100 l 3063 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 2040 m 2959 1920 l 3063 1980 l 3063 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 1920 m 2959 1800 l 3063 1861 l 3063 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 1800 m 2959 1680 l 3063 1741 l 3063 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 1680 m 2959 1560 l 3063 1621 l 3063 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 1560 m 2959 1440 l 3063 1501 l 3063 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 1440 m 2959 1320 l 3063 1381 l 3063 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 1320 m 2959 1200 l 3063 1261 l 3063 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 1200 m 2959 1080 l 3063 1141 l 3063 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 1080 m 2959 960 l 3063 1021 l 3063 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 960 m 2959 840 l 3063 901 l 3063 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 840 m 2959 720 l 3063 781 l 3063 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 720 m 2959 600 l 3063 661 l 3063 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 2580 m 3063 2460 l 3167 2520 l 3167 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 2460 m 3063 2340 l 3167 2400 l 3167 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 2340 m 3063 2220 l 3167 2280 l 3167 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 2220 m 3063 2100 l 3167 2160 l 3167 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 2100 m 3063 1980 l 3167 2040 l 3167 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 1980 m 3063 1860 l 3167 1920 l 3167 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 1860 m 3063 1740 l 3167 1801 l 3167 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 1740 m 3063 1620 l 3167 1681 l 3167 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 1620 m 3063 1500 l 3167 1561 l 3167 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 1500 m 3063 1380 l 3167 1441 l 3167 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 1380 m 3063 1260 l 3167 1321 l 3167 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 1260 m 3063 1140 l 3167 1201 l 3167 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 1140 m 3063 1020 l 3167 1081 l 3167 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 1020 m 3063 900 l 3167 961 l 3167 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 900 m 3063 780 l 3167 841 l 3167 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 780 m 3063 660 l 3167 721 l 3167 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 2640 m 3167 2520 l 3270 2580 l 3270 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 2520 m 3167 2400 l 3270 2460 l 3270 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 2400 m 3167 2280 l 3270 2340 l 3270 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 2280 m 3167 2160 l 3270 2220 l 3270 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 2160 m 3167 2040 l 3270 2100 l 3270 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 2040 m 3167 1920 l 3270 1980 l 3270 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 1920 m 3167 1800 l 3270 1861 l 3270 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 1800 m 3167 1680 l 3270 1741 l 3270 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 1680 m 3167 1560 l 3270 1621 l 3270 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 1560 m 3167 1440 l 3270 1501 l 3270 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 1440 m 3167 1320 l 3270 1381 l 3270 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 1320 m 3167 1200 l 3270 1261 l 3270 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 1200 m 3167 1080 l 3270 1141 l 3270 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 1080 m 3167 960 l 3270 1021 l 3270 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 960 m 3167 840 l 3270 901 l 3270 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 840 m 3167 720 l 3270 781 l 3270 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 2700 m 3270 2580 l 3374 2640 l 3374 2760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 2580 m 3270 2460 l 3374 2520 l 3374 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 2460 m 3270 2340 l 3374 2400 l 3374 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 2340 m 3270 2220 l 3374 2280 l 3374 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 2220 m 3270 2100 l 3374 2160 l 3374 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 2100 m 3270 1980 l 3374 2040 l 3374 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 1980 m 3270 1860 l 3374 1920 l 3374 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 1860 m 3270 1740 l 3374 1801 l 3374 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 1740 m 3270 1620 l 3374 1681 l 3374 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 1620 m 3270 1500 l 3374 1561 l 3374 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 1500 m 3270 1380 l 3374 1441 l 3374 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 1380 m 3270 1260 l 3374 1321 l 3374 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 1260 m 3270 1140 l 3374 1201 l 3374 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 1140 m 3270 1020 l 3374 1081 l 3374 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 1020 m 3270 900 l 3374 961 l 3374 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 900 m 3270 780 l 3374 841 l 3374 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 2760 m 3374 2640 l 3478 2700 l 3478 2820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 2640 m 3374 2520 l 3478 2580 l 3478 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 2520 m 3374 2400 l 3478 2460 l 3478 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 2400 m 3374 2280 l 3478 2340 l 3478 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 2280 m 3374 2160 l 3478 2220 l 3478 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 2160 m 3374 2040 l 3478 2100 l 3478 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 2040 m 3374 1920 l 3478 1980 l 3478 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 1920 m 3374 1800 l 3478 1861 l 3478 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 1800 m 3374 1680 l 3478 1741 l 3478 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 1680 m 3374 1560 l 3478 1621 l 3478 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 1560 m 3374 1440 l 3478 1501 l 3478 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 1440 m 3374 1320 l 3478 1381 l 3478 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 1320 m 3374 1200 l 3478 1261 l 3478 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 1200 m 3374 1080 l 3478 1141 l 3478 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 1080 m 3374 960 l 3478 1021 l 3478 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 960 m 3374 840 l 3478 901 l 3478 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 2820 m 3478 2700 l 3582 2760 l 3582 2880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 2700 m 3478 2580 l 3582 2640 l 3582 2760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 2580 m 3478 2460 l 3582 2520 l 3582 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 2460 m 3478 2340 l 3582 2400 l 3582 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 2340 m 3478 2220 l 3582 2280 l 3582 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 2220 m 3478 2100 l 3582 2160 l 3582 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 2100 m 3478 1980 l 3582 2040 l 3582 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 1980 m 3478 1860 l 3582 1920 l 3582 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 1860 m 3478 1740 l 3582 1801 l 3582 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 1740 m 3478 1620 l 3582 1681 l 3582 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 1620 m 3478 1500 l 3582 1561 l 3582 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 1500 m 3478 1380 l 3582 1441 l 3582 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 1380 m 3478 1260 l 3582 1321 l 3582 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 1260 m 3478 1140 l 3582 1201 l 3582 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 1140 m 3478 1020 l 3582 1081 l 3582 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 1020 m 3478 900 l 3582 961 l 3582 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 1440 m 2023 1501 l 1920 1560 l 1817 1500 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1817 1500 m 1920 1561 l 1817 1620 l 1713 1560 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1713 1920 m 1817 1980 l 1713 2039 l 1609 1979 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1609 1980 m 1713 2040 l 1609 2099 l 1505 2039 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1505 2160 m 1609 2220 l 1505 2279 l 1401 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 2220 m 1505 2280 l 1401 2339 l 1297 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 2280 m 1401 2340 l 1297 2399 l 1193 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 2340 m 1297 2400 l 1193 2459 l 1089 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 2400 m 1193 2460 l 1089 2519 l 985 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 2460 m 1089 2520 l 985 2579 l 881 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 2520 m 985 2580 l 881 2639 l 777 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 2580 m 881 2640 l 777 2699 l 673 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 2640 m 777 2700 l 673 2759 l 570 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 2700 m 673 2760 l 570 2819 l 466 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 2760 m 570 2820 l 466 2879 l 362 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 2820 m 466 2880 l 362 2939 l 258 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 1740 m 2127 1801 l 2023 1860 l 1920 1800 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1920 1800 m 2023 1861 l 1920 1920 l 1817 1860 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1817 2100 m 1920 2160 l 1817 2219 l 1713 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 2160 m 1817 2220 l 1713 2279 l 1609 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 2220 m 1713 2280 l 1609 2339 l 1505 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 2280 m 1609 2340 l 1505 2399 l 1401 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 2340 m 1505 2400 l 1401 2459 l 1297 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 2400 m 1401 2460 l 1297 2519 l 1193 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 2460 m 1297 2520 l 1193 2579 l 1089 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 2520 m 1193 2580 l 1089 2639 l 985 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 2580 m 1089 2640 l 985 2699 l 881 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 2640 m 985 2700 l 881 2759 l 777 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 2700 m 881 2760 l 777 2819 l 673 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 2760 m 777 2820 l 673 2879 l 570 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 2820 m 673 2880 l 570 2939 l 466 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 2880 m 570 2940 l 466 2999 l 362 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 1920 m 2231 1980 l 2127 2039 l 2023 1979 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 2023 2100 m 2127 2160 l 2023 2219 l 1920 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 2160 m 2023 2220 l 1920 2279 l 1817 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 2220 m 1920 2280 l 1817 2339 l 1713 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 2280 m 1817 2340 l 1713 2399 l 1609 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 2340 m 1713 2400 l 1609 2459 l 1505 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 2400 m 1609 2460 l 1505 2519 l 1401 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 2460 m 1505 2520 l 1401 2579 l 1297 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 2520 m 1401 2580 l 1297 2639 l 1193 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 2580 m 1297 2640 l 1193 2699 l 1089 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 2640 m 1193 2700 l 1089 2759 l 985 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 2700 m 1089 2760 l 985 2819 l 881 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 2760 m 985 2820 l 881 2879 l 777 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 2820 m 881 2880 l 777 2939 l 673 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 2880 m 777 2940 l 673 2999 l 570 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 2940 m 673 3000 l 570 3059 l 466 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 2100 m 2335 2160 l 2231 2219 l 2127 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 2160 m 2231 2220 l 2127 2279 l 2023 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 2220 m 2127 2280 l 2023 2339 l 1920 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 2280 m 2023 2340 l 1920 2399 l 1817 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 2340 m 1920 2400 l 1817 2459 l 1713 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 2400 m 1817 2460 l 1713 2519 l 1609 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 2460 m 1713 2520 l 1609 2579 l 1505 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 2520 m 1609 2580 l 1505 2639 l 1401 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 2580 m 1505 2640 l 1401 2699 l 1297 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 2640 m 1401 2700 l 1297 2759 l 1193 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 2700 m 1297 2760 l 1193 2819 l 1089 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 2760 m 1193 2820 l 1089 2879 l 985 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 2820 m 1089 2880 l 985 2939 l 881 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 2880 m 985 2940 l 881 2999 l 777 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 2940 m 881 3000 l 777 3059 l 673 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 3000 m 777 3060 l 673 3119 l 570 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 2160 m 2439 2220 l 2335 2279 l 2231 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 2220 m 2335 2280 l 2231 2339 l 2127 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 2280 m 2231 2340 l 2127 2399 l 2023 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 2340 m 2127 2400 l 2023 2459 l 1920 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 2400 m 2023 2460 l 1920 2519 l 1817 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 2460 m 1920 2520 l 1817 2579 l 1713 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 2520 m 1817 2580 l 1713 2639 l 1609 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 2580 m 1713 2640 l 1609 2699 l 1505 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 2640 m 1609 2700 l 1505 2759 l 1401 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 2700 m 1505 2760 l 1401 2819 l 1297 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 2760 m 1401 2820 l 1297 2879 l 1193 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 2820 m 1297 2880 l 1193 2939 l 1089 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 2880 m 1193 2940 l 1089 2999 l 985 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 2940 m 1089 3000 l 985 3059 l 881 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 3000 m 985 3060 l 881 3119 l 777 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 3060 m 881 3120 l 777 3179 l 673 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 2220 m 2543 2280 l 2439 2339 l 2335 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 2280 m 2439 2340 l 2335 2399 l 2231 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 2340 m 2335 2400 l 2231 2459 l 2127 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 2400 m 2231 2460 l 2127 2519 l 2023 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 2460 m 2127 2520 l 2023 2579 l 1920 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 2520 m 2023 2580 l 1920 2639 l 1817 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 2580 m 1920 2640 l 1817 2699 l 1713 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 2640 m 1817 2700 l 1713 2759 l 1609 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 2700 m 1713 2760 l 1609 2819 l 1505 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 2760 m 1609 2820 l 1505 2879 l 1401 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 2820 m 1505 2880 l 1401 2939 l 1297 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 2880 m 1401 2940 l 1297 2999 l 1193 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 2940 m 1297 3000 l 1193 3059 l 1089 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 3000 m 1193 3060 l 1089 3119 l 985 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 3060 m 1089 3120 l 985 3179 l 881 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 3120 m 985 3180 l 881 3239 l 777 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 2280 m 2647 2340 l 2543 2399 l 2439 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 2340 m 2543 2400 l 2439 2459 l 2335 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 2400 m 2439 2460 l 2335 2519 l 2231 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 2460 m 2335 2520 l 2231 2579 l 2127 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 2520 m 2231 2580 l 2127 2639 l 2023 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 2580 m 2127 2640 l 2023 2699 l 1920 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 2640 m 2023 2700 l 1920 2759 l 1817 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 2700 m 1920 2760 l 1817 2819 l 1713 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 2760 m 1817 2820 l 1713 2879 l 1609 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 2820 m 1713 2880 l 1609 2939 l 1505 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 2880 m 1609 2940 l 1505 2999 l 1401 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 2940 m 1505 3000 l 1401 3059 l 1297 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 3000 m 1401 3060 l 1297 3119 l 1193 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 3060 m 1297 3120 l 1193 3179 l 1089 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 3120 m 1193 3180 l 1089 3239 l 985 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 3180 m 1089 3240 l 985 3299 l 881 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 2340 m 2751 2400 l 2647 2459 l 2543 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 2400 m 2647 2460 l 2543 2519 l 2439 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 2460 m 2543 2520 l 2439 2579 l 2335 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 2520 m 2439 2580 l 2335 2639 l 2231 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 2580 m 2335 2640 l 2231 2699 l 2127 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 2640 m 2231 2700 l 2127 2759 l 2023 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 2700 m 2127 2760 l 2023 2819 l 1920 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 2760 m 2023 2820 l 1920 2879 l 1817 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 2820 m 1920 2880 l 1817 2939 l 1713 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 2880 m 1817 2940 l 1713 2999 l 1609 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 2940 m 1713 3000 l 1609 3059 l 1505 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 3000 m 1609 3060 l 1505 3119 l 1401 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 3060 m 1505 3120 l 1401 3179 l 1297 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 3120 m 1401 3180 l 1297 3239 l 1193 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 3180 m 1297 3240 l 1193 3299 l 1089 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 3240 m 1193 3300 l 1089 3359 l 985 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 2400 m 2855 2460 l 2751 2519 l 2647 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 2460 m 2751 2520 l 2647 2579 l 2543 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 2520 m 2647 2580 l 2543 2639 l 2439 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 2580 m 2543 2640 l 2439 2699 l 2335 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 2640 m 2439 2700 l 2335 2759 l 2231 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 2700 m 2335 2760 l 2231 2819 l 2127 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 2760 m 2231 2820 l 2127 2879 l 2023 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 2820 m 2127 2880 l 2023 2939 l 1920 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 2880 m 2023 2940 l 1920 2999 l 1817 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 2940 m 1920 3000 l 1817 3059 l 1713 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 3000 m 1817 3060 l 1713 3119 l 1609 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 3060 m 1713 3120 l 1609 3179 l 1505 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 3120 m 1609 3180 l 1505 3239 l 1401 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 3180 m 1505 3240 l 1401 3299 l 1297 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 3240 m 1401 3300 l 1297 3359 l 1193 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 3300 m 1297 3360 l 1193 3419 l 1089 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 2460 m 2959 2520 l 2855 2579 l 2751 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 2520 m 2855 2580 l 2751 2639 l 2647 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 2580 m 2751 2640 l 2647 2699 l 2543 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 2640 m 2647 2700 l 2543 2759 l 2439 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 2700 m 2543 2760 l 2439 2819 l 2335 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 2760 m 2439 2820 l 2335 2879 l 2231 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 2820 m 2335 2880 l 2231 2939 l 2127 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 2880 m 2231 2940 l 2127 2999 l 2023 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 2940 m 2127 3000 l 2023 3059 l 1920 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 3000 m 2023 3060 l 1920 3119 l 1817 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 3060 m 1920 3120 l 1817 3179 l 1713 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 3120 m 1817 3180 l 1713 3239 l 1609 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 3180 m 1713 3240 l 1609 3299 l 1505 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 3240 m 1609 3300 l 1505 3359 l 1401 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 3300 m 1505 3360 l 1401 3419 l 1297 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 3360 m 1401 3420 l 1297 3479 l 1193 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 2520 m 3063 2580 l 2959 2639 l 2855 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 2580 m 2959 2640 l 2855 2699 l 2751 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 2640 m 2855 2700 l 2751 2759 l 2647 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 2700 m 2751 2760 l 2647 2819 l 2543 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 2760 m 2647 2820 l 2543 2879 l 2439 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 2820 m 2543 2880 l 2439 2939 l 2335 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 2880 m 2439 2940 l 2335 2999 l 2231 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 2940 m 2335 3000 l 2231 3059 l 2127 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 3000 m 2231 3060 l 2127 3119 l 2023 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 3060 m 2127 3120 l 2023 3179 l 1920 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 3120 m 2023 3180 l 1920 3239 l 1817 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 3180 m 1920 3240 l 1817 3299 l 1713 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 3240 m 1817 3300 l 1713 3359 l 1609 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 3300 m 1713 3360 l 1609 3419 l 1505 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 3360 m 1609 3420 l 1505 3479 l 1401 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 3420 m 1505 3480 l 1401 3539 l 1297 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 2580 m 3167 2640 l 3063 2699 l 2959 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 2640 m 3063 2700 l 2959 2759 l 2855 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 2700 m 2959 2760 l 2855 2819 l 2751 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 2760 m 2855 2820 l 2751 2879 l 2647 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 2820 m 2751 2880 l 2647 2939 l 2543 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 2880 m 2647 2940 l 2543 2999 l 2439 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 2940 m 2543 3000 l 2439 3059 l 2335 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 3000 m 2439 3060 l 2335 3119 l 2231 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 3060 m 2335 3120 l 2231 3179 l 2127 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 3120 m 2231 3180 l 2127 3239 l 2023 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 3180 m 2127 3240 l 2023 3299 l 1920 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 3240 m 2023 3300 l 1920 3359 l 1817 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 3300 m 1920 3360 l 1817 3419 l 1713 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 3360 m 1817 3420 l 1713 3479 l 1609 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 3420 m 1713 3480 l 1609 3539 l 1505 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 3480 m 1609 3540 l 1505 3599 l 1401 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 2640 m 3270 2700 l 3167 2759 l 3063 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 2700 m 3167 2760 l 3063 2819 l 2959 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 2760 m 3063 2820 l 2959 2879 l 2855 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 2820 m 2959 2880 l 2855 2939 l 2751 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 2880 m 2855 2940 l 2751 2999 l 2647 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 2940 m 2751 3000 l 2647 3059 l 2543 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 3000 m 2647 3060 l 2543 3119 l 2439 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 3060 m 2543 3120 l 2439 3179 l 2335 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 3120 m 2439 3180 l 2335 3239 l 2231 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 3180 m 2335 3240 l 2231 3299 l 2127 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 3240 m 2231 3300 l 2127 3359 l 2023 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 3300 m 2127 3360 l 2023 3419 l 1920 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 3360 m 2023 3420 l 1920 3479 l 1817 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 3420 m 1920 3480 l 1817 3539 l 1713 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 3480 m 1817 3540 l 1713 3599 l 1609 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 3540 m 1713 3600 l 1609 3659 l 1505 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 2700 m 3374 2760 l 3270 2819 l 3167 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 2760 m 3270 2820 l 3167 2879 l 3063 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 2820 m 3167 2880 l 3063 2939 l 2959 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 2880 m 3063 2940 l 2959 2999 l 2855 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 2940 m 2959 3000 l 2855 3059 l 2751 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 3000 m 2855 3060 l 2751 3119 l 2647 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 3060 m 2751 3120 l 2647 3179 l 2543 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 3120 m 2647 3180 l 2543 3239 l 2439 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 3180 m 2543 3240 l 2439 3299 l 2335 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 3240 m 2439 3300 l 2335 3359 l 2231 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 3300 m 2335 3360 l 2231 3419 l 2127 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 3360 m 2231 3420 l 2127 3479 l 2023 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 3420 m 2127 3480 l 2023 3539 l 1920 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 3480 m 2023 3540 l 1920 3599 l 1817 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 3540 m 1920 3600 l 1817 3659 l 1713 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 3600 m 1817 3660 l 1713 3719 l 1609 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 2760 m 3478 2820 l 3374 2879 l 3270 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 2820 m 3374 2880 l 3270 2939 l 3167 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 2880 m 3270 2940 l 3167 2999 l 3063 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 2940 m 3167 3000 l 3063 3059 l 2959 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 3000 m 3063 3060 l 2959 3119 l 2855 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 3060 m 2959 3120 l 2855 3179 l 2751 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 3120 m 2855 3180 l 2751 3239 l 2647 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 3180 m 2751 3240 l 2647 3299 l 2543 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 3240 m 2647 3300 l 2543 3359 l 2439 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 3300 m 2543 3360 l 2439 3419 l 2335 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 3360 m 2439 3420 l 2335 3479 l 2231 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 3420 m 2335 3480 l 2231 3539 l 2127 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 3480 m 2231 3540 l 2127 3599 l 2023 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 3540 m 2127 3600 l 2023 3659 l 1920 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 3600 m 2023 3660 l 1920 3719 l 1817 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 3660 m 1920 3720 l 1817 3779 l 1713 3719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 2820 m 3582 2880 l 3478 2939 l 3374 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 2880 m 3478 2940 l 3374 2999 l 3270 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 2940 m 3374 3000 l 3270 3059 l 3167 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 3000 m 3270 3060 l 3167 3119 l 3063 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 3060 m 3167 3120 l 3063 3179 l 2959 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 3120 m 3063 3180 l 2959 3239 l 2855 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 3180 m 2959 3240 l 2855 3299 l 2751 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 3240 m 2855 3300 l 2751 3359 l 2647 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 3300 m 2751 3360 l 2647 3419 l 2543 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 3360 m 2647 3420 l 2543 3479 l 2439 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 3420 m 2543 3480 l 2439 3539 l 2335 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 3480 m 2439 3540 l 2335 3599 l 2231 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 3540 m 2335 3600 l 2231 3659 l 2127 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 3600 m 2231 3660 l 2127 3719 l 2023 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 3660 m 2127 3720 l 2023 3779 l 1920 3719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 3720 m 2023 3780 l 1920 3839 l 1817 3779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 2100 m 5967 2159 l 5967 2039 l 6071 1980 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5967 1920 m 5863 1979 l 5863 1860 l 5967 1801 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5863 1740 m 5760 1800 l 5760 1680 l 5863 1621 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5760 1560 m 5657 1620 l 5657 1500 l 5760 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 1440 m 5657 1500 l 5657 1380 l 5760 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 1320 m 5657 1380 l 5657 1260 l 5760 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 1200 m 5657 1260 l 5657 1140 l 5760 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 1080 m 5657 1140 l 5657 1020 l 5760 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 960 m 5657 1020 l 5657 900 l 5760 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 840 m 5657 900 l 5657 780 l 5760 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 720 m 5657 780 l 5657 660 l 5760 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 600 m 5657 660 l 5657 540 l 5760 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 480 m 5657 540 l 5657 420 l 5760 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 360 m 5657 420 l 5657 300 l 5760 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 240 m 5657 300 l 5657 180 l 5760 121 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 120 m 5657 180 l 5657 60 l 5760 1 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 2100 m 5760 2159 l 5760 2039 l 5863 1980 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5863 1980 m 5760 2039 l 5760 1920 l 5863 1861 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5760 1800 m 5657 1860 l 5657 1740 l 5760 1681 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5657 1620 m 5553 1680 l 5553 1560 l 5657 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 1500 m 5553 1560 l 5553 1440 l 5657 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 1380 m 5553 1440 l 5553 1320 l 5657 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 1260 m 5553 1320 l 5553 1200 l 5657 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 1140 m 5553 1200 l 5553 1080 l 5657 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 1020 m 5553 1080 l 5553 960 l 5657 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 900 m 5553 960 l 5553 840 l 5657 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 780 m 5553 840 l 5553 720 l 5657 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 660 m 5553 720 l 5553 600 l 5657 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 540 m 5553 600 l 5553 480 l 5657 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 420 m 5553 480 l 5553 360 l 5657 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 300 m 5553 360 l 5553 240 l 5657 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 180 m 5553 240 l 5553 120 l 5657 61 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 2160 m 5657 2219 l 5657 2099 l 5760 2040 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5553 1920 m 5449 1979 l 5449 1860 l 5553 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 1800 m 5449 1860 l 5449 1740 l 5553 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 1680 m 5449 1740 l 5449 1620 l 5553 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 1560 m 5449 1620 l 5449 1500 l 5553 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 1440 m 5449 1500 l 5449 1380 l 5553 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 1320 m 5449 1380 l 5449 1260 l 5553 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 1200 m 5449 1260 l 5449 1140 l 5553 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 1080 m 5449 1140 l 5449 1020 l 5553 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 960 m 5449 1020 l 5449 900 l 5553 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 840 m 5449 900 l 5449 780 l 5553 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 720 m 5449 780 l 5449 660 l 5553 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 600 m 5449 660 l 5449 540 l 5553 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 480 m 5449 540 l 5449 420 l 5553 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 360 m 5449 420 l 5449 300 l 5553 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 240 m 5449 300 l 5449 180 l 5553 121 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 2220 m 5553 2279 l 5553 2159 l 5657 2100 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5449 1980 m 5345 2039 l 5345 1920 l 5449 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 1860 m 5345 1920 l 5345 1800 l 5449 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 1740 m 5345 1800 l 5345 1680 l 5449 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 1620 m 5345 1680 l 5345 1560 l 5449 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 1500 m 5345 1560 l 5345 1440 l 5449 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 1380 m 5345 1440 l 5345 1320 l 5449 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 1260 m 5345 1320 l 5345 1200 l 5449 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 1140 m 5345 1200 l 5345 1080 l 5449 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 1020 m 5345 1080 l 5345 960 l 5449 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 900 m 5345 960 l 5345 840 l 5449 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 780 m 5345 840 l 5345 720 l 5449 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 660 m 5345 720 l 5345 600 l 5449 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 540 m 5345 600 l 5345 480 l 5449 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 420 m 5345 480 l 5345 360 l 5449 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 300 m 5345 360 l 5345 240 l 5449 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 2160 m 5241 2219 l 5241 2099 l 5345 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 2040 m 5241 2099 l 5241 1979 l 5345 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 1920 m 5241 1979 l 5241 1860 l 5345 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 1800 m 5241 1860 l 5241 1740 l 5345 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 1680 m 5241 1740 l 5241 1620 l 5345 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 1560 m 5241 1620 l 5241 1500 l 5345 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 1440 m 5241 1500 l 5241 1380 l 5345 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 1320 m 5241 1380 l 5241 1260 l 5345 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 1200 m 5241 1260 l 5241 1140 l 5345 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 1080 m 5241 1140 l 5241 1020 l 5345 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 960 m 5241 1020 l 5241 900 l 5345 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 840 m 5241 900 l 5241 780 l 5345 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 720 m 5241 780 l 5241 660 l 5345 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 600 m 5241 660 l 5241 540 l 5345 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 480 m 5241 540 l 5241 420 l 5345 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 360 m 5241 420 l 5241 300 l 5345 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 2220 m 5137 2279 l 5137 2159 l 5241 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 2100 m 5137 2159 l 5137 2039 l 5241 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 1980 m 5137 2039 l 5137 1920 l 5241 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 1860 m 5137 1920 l 5137 1800 l 5241 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 1740 m 5137 1800 l 5137 1680 l 5241 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 1620 m 5137 1680 l 5137 1560 l 5241 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 1500 m 5137 1560 l 5137 1440 l 5241 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 1380 m 5137 1440 l 5137 1320 l 5241 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 1260 m 5137 1320 l 5137 1200 l 5241 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 1140 m 5137 1200 l 5137 1080 l 5241 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 1020 m 5137 1080 l 5137 960 l 5241 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 900 m 5137 960 l 5137 840 l 5241 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 780 m 5137 840 l 5137 720 l 5241 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 660 m 5137 720 l 5137 600 l 5241 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 540 m 5137 600 l 5137 480 l 5241 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 420 m 5137 480 l 5137 360 l 5241 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 2280 m 5033 2339 l 5033 2219 l 5137 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 2160 m 5033 2219 l 5033 2099 l 5137 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 2040 m 5033 2099 l 5033 1979 l 5137 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 1920 m 5033 1979 l 5033 1860 l 5137 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 1800 m 5033 1860 l 5033 1740 l 5137 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 1680 m 5033 1740 l 5033 1620 l 5137 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 1560 m 5033 1620 l 5033 1500 l 5137 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 1440 m 5033 1500 l 5033 1380 l 5137 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 1320 m 5033 1380 l 5033 1260 l 5137 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 1200 m 5033 1260 l 5033 1140 l 5137 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 1080 m 5033 1140 l 5033 1020 l 5137 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 960 m 5033 1020 l 5033 900 l 5137 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 840 m 5033 900 l 5033 780 l 5137 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 720 m 5033 780 l 5033 660 l 5137 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 600 m 5033 660 l 5033 540 l 5137 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 480 m 5033 540 l 5033 420 l 5137 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 2340 m 4929 2399 l 4929 2279 l 5033 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 2220 m 4929 2279 l 4929 2159 l 5033 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 2100 m 4929 2159 l 4929 2039 l 5033 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 1980 m 4929 2039 l 4929 1920 l 5033 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 1860 m 4929 1920 l 4929 1800 l 5033 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 1740 m 4929 1800 l 4929 1680 l 5033 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 1620 m 4929 1680 l 4929 1560 l 5033 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 1500 m 4929 1560 l 4929 1440 l 5033 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 1380 m 4929 1440 l 4929 1320 l 5033 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 1260 m 4929 1320 l 4929 1200 l 5033 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 1140 m 4929 1200 l 4929 1080 l 5033 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 1020 m 4929 1080 l 4929 960 l 5033 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 900 m 4929 960 l 4929 840 l 5033 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 780 m 4929 840 l 4929 720 l 5033 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 660 m 4929 720 l 4929 600 l 5033 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 540 m 4929 600 l 4929 480 l 5033 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 2400 m 4825 2459 l 4825 2339 l 4929 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 2280 m 4825 2339 l 4825 2219 l 4929 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 2160 m 4825 2219 l 4825 2099 l 4929 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 2040 m 4825 2099 l 4825 1979 l 4929 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 1920 m 4825 1979 l 4825 1860 l 4929 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 1800 m 4825 1860 l 4825 1740 l 4929 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 1680 m 4825 1740 l 4825 1620 l 4929 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 1560 m 4825 1620 l 4825 1500 l 4929 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 1440 m 4825 1500 l 4825 1380 l 4929 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 1320 m 4825 1380 l 4825 1260 l 4929 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 1200 m 4825 1260 l 4825 1140 l 4929 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 1080 m 4825 1140 l 4825 1020 l 4929 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 960 m 4825 1020 l 4825 900 l 4929 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 840 m 4825 900 l 4825 780 l 4929 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 720 m 4825 780 l 4825 660 l 4929 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 600 m 4825 660 l 4825 540 l 4929 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 2460 m 4721 2519 l 4721 2399 l 4825 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 2340 m 4721 2399 l 4721 2279 l 4825 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 2220 m 4721 2279 l 4721 2159 l 4825 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 2100 m 4721 2159 l 4721 2039 l 4825 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 1980 m 4721 2039 l 4721 1920 l 4825 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 1860 m 4721 1920 l 4721 1800 l 4825 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 1740 m 4721 1800 l 4721 1680 l 4825 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 1620 m 4721 1680 l 4721 1560 l 4825 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 1500 m 4721 1560 l 4721 1440 l 4825 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 1380 m 4721 1440 l 4721 1320 l 4825 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 1260 m 4721 1320 l 4721 1200 l 4825 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 1140 m 4721 1200 l 4721 1080 l 4825 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 1020 m 4721 1080 l 4721 960 l 4825 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 900 m 4721 960 l 4721 840 l 4825 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 780 m 4721 840 l 4721 720 l 4825 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 660 m 4721 720 l 4721 600 l 4825 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 2520 m 4617 2579 l 4617 2459 l 4721 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 2400 m 4617 2459 l 4617 2339 l 4721 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 2280 m 4617 2339 l 4617 2219 l 4721 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 2160 m 4617 2219 l 4617 2099 l 4721 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 2040 m 4617 2099 l 4617 1979 l 4721 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 1920 m 4617 1979 l 4617 1860 l 4721 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 1800 m 4617 1860 l 4617 1740 l 4721 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 1680 m 4617 1740 l 4617 1620 l 4721 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 1560 m 4617 1620 l 4617 1500 l 4721 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 1440 m 4617 1500 l 4617 1380 l 4721 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 1320 m 4617 1380 l 4617 1260 l 4721 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 1200 m 4617 1260 l 4617 1140 l 4721 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 1080 m 4617 1140 l 4617 1020 l 4721 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 960 m 4617 1020 l 4617 900 l 4721 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 840 m 4617 900 l 4617 780 l 4721 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 720 m 4617 780 l 4617 660 l 4721 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 2580 m 4513 2639 l 4513 2519 l 4617 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 2460 m 4513 2519 l 4513 2399 l 4617 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 2340 m 4513 2399 l 4513 2279 l 4617 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 2220 m 4513 2279 l 4513 2159 l 4617 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 2100 m 4513 2159 l 4513 2039 l 4617 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 1980 m 4513 2039 l 4513 1920 l 4617 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 1860 m 4513 1920 l 4513 1800 l 4617 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 1740 m 4513 1800 l 4513 1680 l 4617 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 1620 m 4513 1680 l 4513 1560 l 4617 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 1500 m 4513 1560 l 4513 1440 l 4617 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 1380 m 4513 1440 l 4513 1320 l 4617 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 1260 m 4513 1320 l 4513 1200 l 4617 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 1140 m 4513 1200 l 4513 1080 l 4617 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 1020 m 4513 1080 l 4513 960 l 4617 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 900 m 4513 960 l 4513 840 l 4617 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 780 m 4513 840 l 4513 720 l 4617 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 2640 m 4410 2699 l 4410 2579 l 4513 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 2520 m 4410 2579 l 4410 2459 l 4513 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 2400 m 4410 2459 l 4410 2339 l 4513 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 2280 m 4410 2339 l 4410 2219 l 4513 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 2160 m 4410 2219 l 4410 2099 l 4513 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 2040 m 4410 2099 l 4410 1979 l 4513 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 1920 m 4410 1979 l 4410 1860 l 4513 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 1800 m 4410 1860 l 4410 1740 l 4513 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 1680 m 4410 1740 l 4410 1620 l 4513 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 1560 m 4410 1620 l 4410 1500 l 4513 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 1440 m 4410 1500 l 4410 1380 l 4513 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 1320 m 4410 1380 l 4410 1260 l 4513 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 1200 m 4410 1260 l 4410 1140 l 4513 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 1080 m 4410 1140 l 4410 1020 l 4513 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 960 m 4410 1020 l 4410 900 l 4513 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 840 m 4410 900 l 4410 780 l 4513 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 2700 m 4306 2759 l 4306 2639 l 4410 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 2580 m 4306 2639 l 4306 2519 l 4410 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 2460 m 4306 2519 l 4306 2399 l 4410 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 2340 m 4306 2399 l 4306 2279 l 4410 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 2220 m 4306 2279 l 4306 2159 l 4410 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 2100 m 4306 2159 l 4306 2039 l 4410 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 1980 m 4306 2039 l 4306 1920 l 4410 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 1860 m 4306 1920 l 4306 1800 l 4410 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 1740 m 4306 1800 l 4306 1680 l 4410 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 1620 m 4306 1680 l 4306 1560 l 4410 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 1500 m 4306 1560 l 4306 1440 l 4410 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 1380 m 4306 1440 l 4306 1320 l 4410 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 1260 m 4306 1320 l 4306 1200 l 4410 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 1140 m 4306 1200 l 4306 1080 l 4410 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 1020 m 4306 1080 l 4306 960 l 4410 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 900 m 4306 960 l 4306 840 l 4410 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 2760 m 4202 2819 l 4202 2699 l 4306 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 2640 m 4202 2699 l 4202 2579 l 4306 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 2520 m 4202 2579 l 4202 2459 l 4306 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 2400 m 4202 2459 l 4202 2339 l 4306 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 2280 m 4202 2339 l 4202 2219 l 4306 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 2160 m 4202 2219 l 4202 2099 l 4306 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 2040 m 4202 2099 l 4202 1979 l 4306 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 1920 m 4202 1979 l 4202 1860 l 4306 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 1800 m 4202 1860 l 4202 1740 l 4306 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 1680 m 4202 1740 l 4202 1620 l 4306 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 1560 m 4202 1620 l 4202 1500 l 4306 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 1440 m 4202 1500 l 4202 1380 l 4306 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 1320 m 4202 1380 l 4202 1260 l 4306 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 1200 m 4202 1260 l 4202 1140 l 4306 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 1080 m 4202 1140 l 4202 1020 l 4306 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 960 m 4202 1020 l 4202 900 l 4306 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 2820 m 4098 2879 l 4098 2759 l 4202 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 2700 m 4098 2759 l 4098 2639 l 4202 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 2580 m 4098 2639 l 4098 2519 l 4202 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 2460 m 4098 2519 l 4098 2399 l 4202 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 2340 m 4098 2399 l 4098 2279 l 4202 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 2220 m 4098 2279 l 4098 2159 l 4202 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 2100 m 4098 2159 l 4098 2039 l 4202 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 1980 m 4098 2039 l 4098 1920 l 4202 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 1860 m 4098 1920 l 4098 1800 l 4202 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 1740 m 4098 1800 l 4098 1680 l 4202 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 1620 m 4098 1680 l 4098 1560 l 4202 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 1500 m 4098 1560 l 4098 1440 l 4202 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 1380 m 4098 1440 l 4098 1320 l 4202 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 1260 m 4098 1320 l 4098 1200 l 4202 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 1140 m 4098 1200 l 4098 1080 l 4202 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 1020 m 4098 1080 l 4098 960 l 4202 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 2160 m 5345 2040 l 5449 2100 l 5449 2220 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5553 1920 m 5553 1800 l 5657 1861 l 5657 1980 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5553 1800 m 5553 1680 l 5657 1741 l 5657 1861 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5760 1560 m 5760 1440 l 5863 1501 l 5863 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 1440 m 5760 1320 l 5863 1381 l 5863 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 1320 m 5760 1200 l 5863 1261 l 5863 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 1200 m 5760 1080 l 5863 1141 l 5863 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 1080 m 5760 960 l 5863 1021 l 5863 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 960 m 5760 840 l 5863 901 l 5863 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 840 m 5760 720 l 5863 781 l 5863 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 720 m 5760 600 l 5863 661 l 5863 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 600 m 5760 480 l 5863 541 l 5863 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 480 m 5760 360 l 5863 421 l 5863 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 360 m 5760 240 l 5863 301 l 5863 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 240 m 5760 120 l 5863 181 l 5863 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 120 m 5760 0 l 5863 61 l 5863 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 2220 m 5449 2100 l 5553 2160 l 5553 2280 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5657 1980 m 5657 1860 l 5760 1920 l 5760 2040 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5863 1740 m 5863 1620 l 5967 1681 l 5967 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 1620 m 5863 1500 l 5967 1561 l 5967 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 1500 m 5863 1380 l 5967 1441 l 5967 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 1380 m 5863 1260 l 5967 1321 l 5967 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 1260 m 5863 1140 l 5967 1201 l 5967 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 1140 m 5863 1020 l 5967 1081 l 5967 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 1020 m 5863 900 l 5967 961 l 5967 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 900 m 5863 780 l 5967 841 l 5967 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 780 m 5863 660 l 5967 721 l 5967 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 660 m 5863 540 l 5967 601 l 5967 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 540 m 5863 420 l 5967 481 l 5967 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 420 m 5863 300 l 5967 361 l 5967 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 300 m 5863 180 l 5967 241 l 5967 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 180 m 5863 60 l 5967 121 l 5967 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 2100 m 5863 1980 l 5967 2040 l 5967 2160 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5967 1920 m 5967 1800 l 6071 1861 l 6071 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 1800 m 5967 1680 l 6071 1741 l 6071 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 1680 m 5967 1560 l 6071 1621 l 6071 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 1560 m 5967 1440 l 6071 1501 l 6071 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 1440 m 5967 1320 l 6071 1381 l 6071 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 1320 m 5967 1200 l 6071 1261 l 6071 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 1200 m 5967 1080 l 6071 1141 l 6071 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 1080 m 5967 960 l 6071 1021 l 6071 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 960 m 5967 840 l 6071 901 l 6071 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 840 m 5967 720 l 6071 781 l 6071 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 720 m 5967 600 l 6071 661 l 6071 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 600 m 5967 480 l 6071 541 l 6071 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 480 m 5967 360 l 6071 421 l 6071 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 360 m 5967 240 l 6071 301 l 6071 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 240 m 5967 120 l 6071 181 l 6071 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 2100 m 6071 1980 l 6175 2040 l 6175 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 1980 m 6071 1860 l 6175 1920 l 6175 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 1860 m 6071 1740 l 6175 1801 l 6175 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 1740 m 6071 1620 l 6175 1681 l 6175 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 1620 m 6071 1500 l 6175 1561 l 6175 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 1500 m 6071 1380 l 6175 1441 l 6175 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 1380 m 6071 1260 l 6175 1321 l 6175 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 1260 m 6071 1140 l 6175 1201 l 6175 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 1140 m 6071 1020 l 6175 1081 l 6175 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 1020 m 6071 900 l 6175 961 l 6175 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 900 m 6071 780 l 6175 841 l 6175 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 780 m 6071 660 l 6175 721 l 6175 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 660 m 6071 540 l 6175 601 l 6175 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 540 m 6071 420 l 6175 481 l 6175 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 420 m 6071 300 l 6175 361 l 6175 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 300 m 6071 180 l 6175 241 l 6175 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 2160 m 6175 2040 l 6279 2100 l 6279 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 2040 m 6175 1920 l 6279 1980 l 6279 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 1920 m 6175 1800 l 6279 1861 l 6279 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 1800 m 6175 1680 l 6279 1741 l 6279 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 1680 m 6175 1560 l 6279 1621 l 6279 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 1560 m 6175 1440 l 6279 1501 l 6279 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 1440 m 6175 1320 l 6279 1381 l 6279 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 1320 m 6175 1200 l 6279 1261 l 6279 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 1200 m 6175 1080 l 6279 1141 l 6279 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 1080 m 6175 960 l 6279 1021 l 6279 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 960 m 6175 840 l 6279 901 l 6279 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 840 m 6175 720 l 6279 781 l 6279 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 720 m 6175 600 l 6279 661 l 6279 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 600 m 6175 480 l 6279 541 l 6279 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 480 m 6175 360 l 6279 421 l 6279 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 360 m 6175 240 l 6279 301 l 6279 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 2220 m 6279 2100 l 6383 2160 l 6383 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 2100 m 6279 1980 l 6383 2040 l 6383 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 1980 m 6279 1860 l 6383 1920 l 6383 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 1860 m 6279 1740 l 6383 1801 l 6383 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 1740 m 6279 1620 l 6383 1681 l 6383 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 1620 m 6279 1500 l 6383 1561 l 6383 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 1500 m 6279 1380 l 6383 1441 l 6383 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 1380 m 6279 1260 l 6383 1321 l 6383 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 1260 m 6279 1140 l 6383 1201 l 6383 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 1140 m 6279 1020 l 6383 1081 l 6383 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 1020 m 6279 900 l 6383 961 l 6383 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 900 m 6279 780 l 6383 841 l 6383 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 780 m 6279 660 l 6383 721 l 6383 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 660 m 6279 540 l 6383 601 l 6383 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 540 m 6279 420 l 6383 481 l 6383 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 420 m 6279 300 l 6383 361 l 6383 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 2280 m 6383 2160 l 6487 2220 l 6487 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 2160 m 6383 2040 l 6487 2100 l 6487 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 2040 m 6383 1920 l 6487 1980 l 6487 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 1920 m 6383 1800 l 6487 1861 l 6487 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 1800 m 6383 1680 l 6487 1741 l 6487 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 1680 m 6383 1560 l 6487 1621 l 6487 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 1560 m 6383 1440 l 6487 1501 l 6487 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 1440 m 6383 1320 l 6487 1381 l 6487 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 1320 m 6383 1200 l 6487 1261 l 6487 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 1200 m 6383 1080 l 6487 1141 l 6487 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 1080 m 6383 960 l 6487 1021 l 6487 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 960 m 6383 840 l 6487 901 l 6487 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 840 m 6383 720 l 6487 781 l 6487 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 720 m 6383 600 l 6487 661 l 6487 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 600 m 6383 480 l 6487 541 l 6487 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 480 m 6383 360 l 6487 421 l 6487 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 2340 m 6487 2220 l 6591 2280 l 6591 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 2220 m 6487 2100 l 6591 2160 l 6591 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 2100 m 6487 1980 l 6591 2040 l 6591 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 1980 m 6487 1860 l 6591 1920 l 6591 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 1860 m 6487 1740 l 6591 1801 l 6591 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 1740 m 6487 1620 l 6591 1681 l 6591 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 1620 m 6487 1500 l 6591 1561 l 6591 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 1500 m 6487 1380 l 6591 1441 l 6591 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 1380 m 6487 1260 l 6591 1321 l 6591 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 1260 m 6487 1140 l 6591 1201 l 6591 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 1140 m 6487 1020 l 6591 1081 l 6591 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 1020 m 6487 900 l 6591 961 l 6591 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 900 m 6487 780 l 6591 841 l 6591 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 780 m 6487 660 l 6591 721 l 6591 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 660 m 6487 540 l 6591 601 l 6591 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 540 m 6487 420 l 6591 481 l 6591 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 2400 m 6591 2280 l 6695 2340 l 6695 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 2280 m 6591 2160 l 6695 2220 l 6695 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 2160 m 6591 2040 l 6695 2100 l 6695 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 2040 m 6591 1920 l 6695 1980 l 6695 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 1920 m 6591 1800 l 6695 1861 l 6695 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 1800 m 6591 1680 l 6695 1741 l 6695 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 1680 m 6591 1560 l 6695 1621 l 6695 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 1560 m 6591 1440 l 6695 1501 l 6695 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 1440 m 6591 1320 l 6695 1381 l 6695 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 1320 m 6591 1200 l 6695 1261 l 6695 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 1200 m 6591 1080 l 6695 1141 l 6695 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 1080 m 6591 960 l 6695 1021 l 6695 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 960 m 6591 840 l 6695 901 l 6695 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 840 m 6591 720 l 6695 781 l 6695 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 720 m 6591 600 l 6695 661 l 6695 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 600 m 6591 480 l 6695 541 l 6695 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 2460 m 6695 2340 l 6799 2400 l 6799 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 2340 m 6695 2220 l 6799 2280 l 6799 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 2220 m 6695 2100 l 6799 2160 l 6799 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 2100 m 6695 1980 l 6799 2040 l 6799 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 1980 m 6695 1860 l 6799 1920 l 6799 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 1860 m 6695 1740 l 6799 1801 l 6799 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 1740 m 6695 1620 l 6799 1681 l 6799 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 1620 m 6695 1500 l 6799 1561 l 6799 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 1500 m 6695 1380 l 6799 1441 l 6799 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 1380 m 6695 1260 l 6799 1321 l 6799 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 1260 m 6695 1140 l 6799 1201 l 6799 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 1140 m 6695 1020 l 6799 1081 l 6799 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 1020 m 6695 900 l 6799 961 l 6799 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 900 m 6695 780 l 6799 841 l 6799 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 780 m 6695 660 l 6799 721 l 6799 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 660 m 6695 540 l 6799 601 l 6799 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 2520 m 6799 2400 l 6903 2460 l 6903 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 2400 m 6799 2280 l 6903 2340 l 6903 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 2280 m 6799 2160 l 6903 2220 l 6903 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 2160 m 6799 2040 l 6903 2100 l 6903 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 2040 m 6799 1920 l 6903 1980 l 6903 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 1920 m 6799 1800 l 6903 1861 l 6903 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 1800 m 6799 1680 l 6903 1741 l 6903 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 1680 m 6799 1560 l 6903 1621 l 6903 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 1560 m 6799 1440 l 6903 1501 l 6903 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 1440 m 6799 1320 l 6903 1381 l 6903 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 1320 m 6799 1200 l 6903 1261 l 6903 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 1200 m 6799 1080 l 6903 1141 l 6903 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 1080 m 6799 960 l 6903 1021 l 6903 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 960 m 6799 840 l 6903 901 l 6903 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 840 m 6799 720 l 6903 781 l 6903 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 720 m 6799 600 l 6903 661 l 6903 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 2580 m 6903 2460 l 7007 2520 l 7007 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 2460 m 6903 2340 l 7007 2400 l 7007 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 2340 m 6903 2220 l 7007 2280 l 7007 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 2220 m 6903 2100 l 7007 2160 l 7007 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 2100 m 6903 1980 l 7007 2040 l 7007 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 1980 m 6903 1860 l 7007 1920 l 7007 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 1860 m 6903 1740 l 7007 1801 l 7007 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 1740 m 6903 1620 l 7007 1681 l 7007 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 1620 m 6903 1500 l 7007 1561 l 7007 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 1500 m 6903 1380 l 7007 1441 l 7007 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 1380 m 6903 1260 l 7007 1321 l 7007 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 1260 m 6903 1140 l 7007 1201 l 7007 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 1140 m 6903 1020 l 7007 1081 l 7007 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 1020 m 6903 900 l 7007 961 l 7007 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 900 m 6903 780 l 7007 841 l 7007 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 780 m 6903 660 l 7007 721 l 7007 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 2640 m 7007 2520 l 7110 2580 l 7110 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 2520 m 7007 2400 l 7110 2460 l 7110 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 2400 m 7007 2280 l 7110 2340 l 7110 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 2280 m 7007 2160 l 7110 2220 l 7110 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 2160 m 7007 2040 l 7110 2100 l 7110 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 2040 m 7007 1920 l 7110 1980 l 7110 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 1920 m 7007 1800 l 7110 1861 l 7110 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 1800 m 7007 1680 l 7110 1741 l 7110 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 1680 m 7007 1560 l 7110 1621 l 7110 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 1560 m 7007 1440 l 7110 1501 l 7110 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 1440 m 7007 1320 l 7110 1381 l 7110 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 1320 m 7007 1200 l 7110 1261 l 7110 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 1200 m 7007 1080 l 7110 1141 l 7110 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 1080 m 7007 960 l 7110 1021 l 7110 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 960 m 7007 840 l 7110 901 l 7110 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 840 m 7007 720 l 7110 781 l 7110 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 2700 m 7110 2580 l 7214 2640 l 7214 2760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 2580 m 7110 2460 l 7214 2520 l 7214 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 2460 m 7110 2340 l 7214 2400 l 7214 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 2340 m 7110 2220 l 7214 2280 l 7214 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 2220 m 7110 2100 l 7214 2160 l 7214 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 2100 m 7110 1980 l 7214 2040 l 7214 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 1980 m 7110 1860 l 7214 1920 l 7214 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 1860 m 7110 1740 l 7214 1801 l 7214 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 1740 m 7110 1620 l 7214 1681 l 7214 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 1620 m 7110 1500 l 7214 1561 l 7214 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 1500 m 7110 1380 l 7214 1441 l 7214 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 1380 m 7110 1260 l 7214 1321 l 7214 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 1260 m 7110 1140 l 7214 1201 l 7214 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 1140 m 7110 1020 l 7214 1081 l 7214 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 1020 m 7110 900 l 7214 961 l 7214 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 900 m 7110 780 l 7214 841 l 7214 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 2760 m 7214 2640 l 7318 2700 l 7318 2820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 2640 m 7214 2520 l 7318 2580 l 7318 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 2520 m 7214 2400 l 7318 2460 l 7318 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 2400 m 7214 2280 l 7318 2340 l 7318 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 2280 m 7214 2160 l 7318 2220 l 7318 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 2160 m 7214 2040 l 7318 2100 l 7318 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 2040 m 7214 1920 l 7318 1980 l 7318 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 1920 m 7214 1800 l 7318 1861 l 7318 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 1800 m 7214 1680 l 7318 1741 l 7318 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 1680 m 7214 1560 l 7318 1621 l 7318 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 1560 m 7214 1440 l 7318 1501 l 7318 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 1440 m 7214 1320 l 7318 1381 l 7318 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 1320 m 7214 1200 l 7318 1261 l 7318 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 1200 m 7214 1080 l 7318 1141 l 7318 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 1080 m 7214 960 l 7318 1021 l 7318 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 960 m 7214 840 l 7318 901 l 7318 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 2820 m 7318 2700 l 7422 2760 l 7422 2880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 2700 m 7318 2580 l 7422 2640 l 7422 2760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 2580 m 7318 2460 l 7422 2520 l 7422 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 2460 m 7318 2340 l 7422 2400 l 7422 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 2340 m 7318 2220 l 7422 2280 l 7422 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 2220 m 7318 2100 l 7422 2160 l 7422 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 2100 m 7318 1980 l 7422 2040 l 7422 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 1980 m 7318 1860 l 7422 1920 l 7422 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 1860 m 7318 1740 l 7422 1801 l 7422 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 1740 m 7318 1620 l 7422 1681 l 7422 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 1620 m 7318 1500 l 7422 1561 l 7422 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 1500 m 7318 1380 l 7422 1441 l 7422 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 1380 m 7318 1260 l 7422 1321 l 7422 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 1260 m 7318 1140 l 7422 1201 l 7422 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 1140 m 7318 1020 l 7422 1081 l 7422 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 1020 m 7318 900 l 7422 961 l 7422 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 1560 m 5863 1621 l 5760 1680 l 5657 1620 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 5657 1620 m 5760 1681 l 5657 1740 l 5553 1680 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 5553 1920 m 5657 1980 l 5553 2039 l 5449 1979 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 5449 1980 m 5553 2040 l 5449 2099 l 5345 2039 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 5345 2160 m 5449 2220 l 5345 2279 l 5241 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 2220 m 5345 2280 l 5241 2339 l 5137 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 2280 m 5241 2340 l 5137 2399 l 5033 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 2340 m 5137 2400 l 5033 2459 l 4929 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 2400 m 5033 2460 l 4929 2519 l 4825 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 2460 m 4929 2520 l 4825 2579 l 4721 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 2520 m 4825 2580 l 4721 2639 l 4617 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 2580 m 4721 2640 l 4617 2699 l 4513 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 2640 m 4617 2700 l 4513 2759 l 4410 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 2700 m 4513 2760 l 4410 2819 l 4306 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 2760 m 4410 2820 l 4306 2879 l 4202 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 2820 m 4306 2880 l 4202 2939 l 4098 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 1740 m 5967 1801 l 5863 1860 l 5760 1800 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 5760 1800 m 5863 1861 l 5760 1920 l 5657 1860 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 5657 1980 m 5760 2040 l 5657 2099 l 5553 2039 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 5553 2040 m 5657 2100 l 5553 2159 l 5449 2099 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 5449 2220 m 5553 2280 l 5449 2339 l 5345 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 2280 m 5449 2340 l 5345 2399 l 5241 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 2340 m 5345 2400 l 5241 2459 l 5137 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 2400 m 5241 2460 l 5137 2519 l 5033 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 2460 m 5137 2520 l 5033 2579 l 4929 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 2520 m 5033 2580 l 4929 2639 l 4825 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 2580 m 4929 2640 l 4825 2699 l 4721 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 2640 m 4825 2700 l 4721 2759 l 4617 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 2700 m 4721 2760 l 4617 2819 l 4513 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 2760 m 4617 2820 l 4513 2879 l 4410 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 2820 m 4513 2880 l 4410 2939 l 4306 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 2880 m 4410 2940 l 4306 2999 l 4202 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 1920 m 6071 1980 l 5967 2039 l 5863 1979 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 5863 2100 m 5967 2160 l 5863 2219 l 5760 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 2160 m 5863 2220 l 5760 2279 l 5657 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 2220 m 5760 2280 l 5657 2339 l 5553 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 2280 m 5657 2340 l 5553 2399 l 5449 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 2340 m 5553 2400 l 5449 2459 l 5345 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 2400 m 5449 2460 l 5345 2519 l 5241 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 2460 m 5345 2520 l 5241 2579 l 5137 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 2520 m 5241 2580 l 5137 2639 l 5033 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 2580 m 5137 2640 l 5033 2699 l 4929 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 2640 m 5033 2700 l 4929 2759 l 4825 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 2700 m 4929 2760 l 4825 2819 l 4721 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 2760 m 4825 2820 l 4721 2879 l 4617 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 2820 m 4721 2880 l 4617 2939 l 4513 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 2880 m 4617 2940 l 4513 2999 l 4410 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 2940 m 4513 3000 l 4410 3059 l 4306 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 2100 m 6175 2160 l 6071 2219 l 5967 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 2160 m 6071 2220 l 5967 2279 l 5863 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 2220 m 5967 2280 l 5863 2339 l 5760 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 2280 m 5863 2340 l 5760 2399 l 5657 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 2340 m 5760 2400 l 5657 2459 l 5553 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 2400 m 5657 2460 l 5553 2519 l 5449 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 2460 m 5553 2520 l 5449 2579 l 5345 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 2520 m 5449 2580 l 5345 2639 l 5241 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 2580 m 5345 2640 l 5241 2699 l 5137 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 2640 m 5241 2700 l 5137 2759 l 5033 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 2700 m 5137 2760 l 5033 2819 l 4929 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 2760 m 5033 2820 l 4929 2879 l 4825 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 2820 m 4929 2880 l 4825 2939 l 4721 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 2880 m 4825 2940 l 4721 2999 l 4617 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 2940 m 4721 3000 l 4617 3059 l 4513 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 3000 m 4617 3060 l 4513 3119 l 4410 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 2160 m 6279 2220 l 6175 2279 l 6071 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 2220 m 6175 2280 l 6071 2339 l 5967 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 2280 m 6071 2340 l 5967 2399 l 5863 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 2340 m 5967 2400 l 5863 2459 l 5760 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 2400 m 5863 2460 l 5760 2519 l 5657 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 2460 m 5760 2520 l 5657 2579 l 5553 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 2520 m 5657 2580 l 5553 2639 l 5449 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 2580 m 5553 2640 l 5449 2699 l 5345 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 2640 m 5449 2700 l 5345 2759 l 5241 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 2700 m 5345 2760 l 5241 2819 l 5137 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 2760 m 5241 2820 l 5137 2879 l 5033 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 2820 m 5137 2880 l 5033 2939 l 4929 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 2880 m 5033 2940 l 4929 2999 l 4825 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 2940 m 4929 3000 l 4825 3059 l 4721 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 3000 m 4825 3060 l 4721 3119 l 4617 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 3060 m 4721 3120 l 4617 3179 l 4513 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 2220 m 6383 2280 l 6279 2339 l 6175 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 2280 m 6279 2340 l 6175 2399 l 6071 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 2340 m 6175 2400 l 6071 2459 l 5967 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 2400 m 6071 2460 l 5967 2519 l 5863 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 2460 m 5967 2520 l 5863 2579 l 5760 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 2520 m 5863 2580 l 5760 2639 l 5657 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 2580 m 5760 2640 l 5657 2699 l 5553 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 2640 m 5657 2700 l 5553 2759 l 5449 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 2700 m 5553 2760 l 5449 2819 l 5345 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 2760 m 5449 2820 l 5345 2879 l 5241 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 2820 m 5345 2880 l 5241 2939 l 5137 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 2880 m 5241 2940 l 5137 2999 l 5033 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 2940 m 5137 3000 l 5033 3059 l 4929 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 3000 m 5033 3060 l 4929 3119 l 4825 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 3060 m 4929 3120 l 4825 3179 l 4721 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 3120 m 4825 3180 l 4721 3239 l 4617 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 2280 m 6487 2340 l 6383 2399 l 6279 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 2340 m 6383 2400 l 6279 2459 l 6175 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 2400 m 6279 2460 l 6175 2519 l 6071 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 2460 m 6175 2520 l 6071 2579 l 5967 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 2520 m 6071 2580 l 5967 2639 l 5863 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 2580 m 5967 2640 l 5863 2699 l 5760 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 2640 m 5863 2700 l 5760 2759 l 5657 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 2700 m 5760 2760 l 5657 2819 l 5553 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 2760 m 5657 2820 l 5553 2879 l 5449 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 2820 m 5553 2880 l 5449 2939 l 5345 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 2880 m 5449 2940 l 5345 2999 l 5241 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 2940 m 5345 3000 l 5241 3059 l 5137 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 3000 m 5241 3060 l 5137 3119 l 5033 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 3060 m 5137 3120 l 5033 3179 l 4929 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 3120 m 5033 3180 l 4929 3239 l 4825 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 3180 m 4929 3240 l 4825 3299 l 4721 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 2340 m 6591 2400 l 6487 2459 l 6383 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 2400 m 6487 2460 l 6383 2519 l 6279 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 2460 m 6383 2520 l 6279 2579 l 6175 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 2520 m 6279 2580 l 6175 2639 l 6071 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 2580 m 6175 2640 l 6071 2699 l 5967 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 2640 m 6071 2700 l 5967 2759 l 5863 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 2700 m 5967 2760 l 5863 2819 l 5760 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 2760 m 5863 2820 l 5760 2879 l 5657 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 2820 m 5760 2880 l 5657 2939 l 5553 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 2880 m 5657 2940 l 5553 2999 l 5449 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 2940 m 5553 3000 l 5449 3059 l 5345 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 3000 m 5449 3060 l 5345 3119 l 5241 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 3060 m 5345 3120 l 5241 3179 l 5137 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 3120 m 5241 3180 l 5137 3239 l 5033 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 3180 m 5137 3240 l 5033 3299 l 4929 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 3240 m 5033 3300 l 4929 3359 l 4825 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 2400 m 6695 2460 l 6591 2519 l 6487 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 2460 m 6591 2520 l 6487 2579 l 6383 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 2520 m 6487 2580 l 6383 2639 l 6279 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 2580 m 6383 2640 l 6279 2699 l 6175 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 2640 m 6279 2700 l 6175 2759 l 6071 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 2700 m 6175 2760 l 6071 2819 l 5967 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 2760 m 6071 2820 l 5967 2879 l 5863 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 2820 m 5967 2880 l 5863 2939 l 5760 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 2880 m 5863 2940 l 5760 2999 l 5657 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 2940 m 5760 3000 l 5657 3059 l 5553 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 3000 m 5657 3060 l 5553 3119 l 5449 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 3060 m 5553 3120 l 5449 3179 l 5345 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 3120 m 5449 3180 l 5345 3239 l 5241 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 3180 m 5345 3240 l 5241 3299 l 5137 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 3240 m 5241 3300 l 5137 3359 l 5033 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 3300 m 5137 3360 l 5033 3419 l 4929 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 2460 m 6799 2520 l 6695 2579 l 6591 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 2520 m 6695 2580 l 6591 2639 l 6487 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 2580 m 6591 2640 l 6487 2699 l 6383 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 2640 m 6487 2700 l 6383 2759 l 6279 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 2700 m 6383 2760 l 6279 2819 l 6175 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 2760 m 6279 2820 l 6175 2879 l 6071 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 2820 m 6175 2880 l 6071 2939 l 5967 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 2880 m 6071 2940 l 5967 2999 l 5863 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 2940 m 5967 3000 l 5863 3059 l 5760 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 3000 m 5863 3060 l 5760 3119 l 5657 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 3060 m 5760 3120 l 5657 3179 l 5553 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 3120 m 5657 3180 l 5553 3239 l 5449 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 3180 m 5553 3240 l 5449 3299 l 5345 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 3240 m 5449 3300 l 5345 3359 l 5241 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 3300 m 5345 3360 l 5241 3419 l 5137 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 3360 m 5241 3420 l 5137 3479 l 5033 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 2520 m 6903 2580 l 6799 2639 l 6695 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 2580 m 6799 2640 l 6695 2699 l 6591 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 2640 m 6695 2700 l 6591 2759 l 6487 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 2700 m 6591 2760 l 6487 2819 l 6383 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 2760 m 6487 2820 l 6383 2879 l 6279 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 2820 m 6383 2880 l 6279 2939 l 6175 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 2880 m 6279 2940 l 6175 2999 l 6071 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 2940 m 6175 3000 l 6071 3059 l 5967 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 3000 m 6071 3060 l 5967 3119 l 5863 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 3060 m 5967 3120 l 5863 3179 l 5760 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 3120 m 5863 3180 l 5760 3239 l 5657 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 3180 m 5760 3240 l 5657 3299 l 5553 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 3240 m 5657 3300 l 5553 3359 l 5449 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 3300 m 5553 3360 l 5449 3419 l 5345 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 3360 m 5449 3420 l 5345 3479 l 5241 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 3420 m 5345 3480 l 5241 3539 l 5137 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 2580 m 7007 2640 l 6903 2699 l 6799 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 2640 m 6903 2700 l 6799 2759 l 6695 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 2700 m 6799 2760 l 6695 2819 l 6591 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 2760 m 6695 2820 l 6591 2879 l 6487 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 2820 m 6591 2880 l 6487 2939 l 6383 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 2880 m 6487 2940 l 6383 2999 l 6279 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 2940 m 6383 3000 l 6279 3059 l 6175 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 3000 m 6279 3060 l 6175 3119 l 6071 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 3060 m 6175 3120 l 6071 3179 l 5967 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 3120 m 6071 3180 l 5967 3239 l 5863 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 3180 m 5967 3240 l 5863 3299 l 5760 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 3240 m 5863 3300 l 5760 3359 l 5657 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 3300 m 5760 3360 l 5657 3419 l 5553 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 3360 m 5657 3420 l 5553 3479 l 5449 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 3420 m 5553 3480 l 5449 3539 l 5345 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 3480 m 5449 3540 l 5345 3599 l 5241 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 2640 m 7110 2700 l 7007 2759 l 6903 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 2700 m 7007 2760 l 6903 2819 l 6799 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 2760 m 6903 2820 l 6799 2879 l 6695 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 2820 m 6799 2880 l 6695 2939 l 6591 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 2880 m 6695 2940 l 6591 2999 l 6487 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 2940 m 6591 3000 l 6487 3059 l 6383 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 3000 m 6487 3060 l 6383 3119 l 6279 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 3060 m 6383 3120 l 6279 3179 l 6175 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 3120 m 6279 3180 l 6175 3239 l 6071 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 3180 m 6175 3240 l 6071 3299 l 5967 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 3240 m 6071 3300 l 5967 3359 l 5863 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 3300 m 5967 3360 l 5863 3419 l 5760 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 3360 m 5863 3420 l 5760 3479 l 5657 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 3420 m 5760 3480 l 5657 3539 l 5553 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 3480 m 5657 3540 l 5553 3599 l 5449 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 3540 m 5553 3600 l 5449 3659 l 5345 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 2700 m 7214 2760 l 7110 2819 l 7007 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 2760 m 7110 2820 l 7007 2879 l 6903 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 2820 m 7007 2880 l 6903 2939 l 6799 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 2880 m 6903 2940 l 6799 2999 l 6695 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 2940 m 6799 3000 l 6695 3059 l 6591 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 3000 m 6695 3060 l 6591 3119 l 6487 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 3060 m 6591 3120 l 6487 3179 l 6383 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 3120 m 6487 3180 l 6383 3239 l 6279 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 3180 m 6383 3240 l 6279 3299 l 6175 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 3240 m 6279 3300 l 6175 3359 l 6071 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 3300 m 6175 3360 l 6071 3419 l 5967 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 3360 m 6071 3420 l 5967 3479 l 5863 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 3420 m 5967 3480 l 5863 3539 l 5760 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 3480 m 5863 3540 l 5760 3599 l 5657 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 3540 m 5760 3600 l 5657 3659 l 5553 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 3600 m 5657 3660 l 5553 3719 l 5449 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 2760 m 7318 2820 l 7214 2879 l 7110 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 2820 m 7214 2880 l 7110 2939 l 7007 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 2880 m 7110 2940 l 7007 2999 l 6903 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 2940 m 7007 3000 l 6903 3059 l 6799 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 3000 m 6903 3060 l 6799 3119 l 6695 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 3060 m 6799 3120 l 6695 3179 l 6591 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 3120 m 6695 3180 l 6591 3239 l 6487 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 3180 m 6591 3240 l 6487 3299 l 6383 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 3240 m 6487 3300 l 6383 3359 l 6279 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 3300 m 6383 3360 l 6279 3419 l 6175 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 3360 m 6279 3420 l 6175 3479 l 6071 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 3420 m 6175 3480 l 6071 3539 l 5967 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 3480 m 6071 3540 l 5967 3599 l 5863 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 3540 m 5967 3600 l 5863 3659 l 5760 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 3600 m 5863 3660 l 5760 3719 l 5657 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 3660 m 5760 3720 l 5657 3779 l 5553 3719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 2820 m 7422 2880 l 7318 2939 l 7214 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 2880 m 7318 2940 l 7214 2999 l 7110 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 2940 m 7214 3000 l 7110 3059 l 7007 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 3000 m 7110 3060 l 7007 3119 l 6903 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 3060 m 7007 3120 l 6903 3179 l 6799 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 3120 m 6903 3180 l 6799 3239 l 6695 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 3180 m 6799 3240 l 6695 3299 l 6591 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 3240 m 6695 3300 l 6591 3359 l 6487 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 3300 m 6591 3360 l 6487 3419 l 6383 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 3360 m 6487 3420 l 6383 3479 l 6279 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 3420 m 6383 3480 l 6279 3539 l 6175 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 3480 m 6279 3540 l 6175 3599 l 6071 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 3540 m 6175 3600 l 6071 3659 l 5967 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 3600 m 6071 3660 l 5967 3719 l 5863 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 3660 m 5967 3720 l 5863 3779 l 5760 3719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 3720 m 5863 3780 l 5760 3839 l 5657 3779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 2040 m 9703 2099 l 9703 1979 l 9807 1920 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9807 1920 m 9703 1979 l 9703 1860 l 9807 1801 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9703 1740 m 9600 1800 l 9600 1680 l 9703 1621 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9703 1620 m 9600 1680 l 9600 1560 l 9703 1501 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9703 1500 m 9600 1560 l 9600 1440 l 9703 1381 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9600 1320 m 9497 1380 l 9497 1260 l 9600 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 1200 m 9497 1260 l 9497 1140 l 9600 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 1080 m 9497 1140 l 9497 1020 l 9600 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 960 m 9497 1020 l 9497 900 l 9600 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 840 m 9497 900 l 9497 780 l 9600 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 720 m 9497 780 l 9497 660 l 9600 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 600 m 9497 660 l 9497 540 l 9600 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 480 m 9497 540 l 9497 420 l 9600 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 360 m 9497 420 l 9497 300 l 9600 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 240 m 9497 300 l 9497 180 l 9600 121 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 120 m 9497 180 l 9497 60 l 9600 1 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 2100 m 9600 2159 l 9600 2039 l 9703 1980 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9703 1980 m 9600 2039 l 9600 1920 l 9703 1861 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9600 1800 m 9497 1860 l 9497 1740 l 9600 1681 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9600 1680 m 9497 1740 l 9497 1620 l 9600 1561 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9497 1500 m 9393 1560 l 9393 1440 l 9497 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 1380 m 9393 1440 l 9393 1320 l 9497 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 1260 m 9393 1320 l 9393 1200 l 9497 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 1140 m 9393 1200 l 9393 1080 l 9497 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 1020 m 9393 1080 l 9393 960 l 9497 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 900 m 9393 960 l 9393 840 l 9497 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 780 m 9393 840 l 9393 720 l 9497 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 660 m 9393 720 l 9393 600 l 9497 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 540 m 9393 600 l 9393 480 l 9497 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 420 m 9393 480 l 9393 360 l 9497 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 300 m 9393 360 l 9393 240 l 9497 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 180 m 9393 240 l 9393 120 l 9497 61 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 2100 m 9393 2159 l 9393 2039 l 9497 1980 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9393 1920 m 9289 1979 l 9289 1860 l 9393 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 1800 m 9289 1860 l 9289 1740 l 9393 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 1680 m 9289 1740 l 9289 1620 l 9393 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 1560 m 9289 1620 l 9289 1500 l 9393 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 1440 m 9289 1500 l 9289 1380 l 9393 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 1320 m 9289 1380 l 9289 1260 l 9393 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 1200 m 9289 1260 l 9289 1140 l 9393 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 1080 m 9289 1140 l 9289 1020 l 9393 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 960 m 9289 1020 l 9289 900 l 9393 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 840 m 9289 900 l 9289 780 l 9393 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 720 m 9289 780 l 9289 660 l 9393 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 600 m 9289 660 l 9289 540 l 9393 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 480 m 9289 540 l 9289 420 l 9393 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 360 m 9289 420 l 9289 300 l 9393 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 240 m 9289 300 l 9289 180 l 9393 121 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 2160 m 9289 2219 l 9289 2099 l 9393 2040 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9289 1980 m 9185 2039 l 9185 1920 l 9289 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 1860 m 9185 1920 l 9185 1800 l 9289 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 1740 m 9185 1800 l 9185 1680 l 9289 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 1620 m 9185 1680 l 9185 1560 l 9289 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 1500 m 9185 1560 l 9185 1440 l 9289 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 1380 m 9185 1440 l 9185 1320 l 9289 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 1260 m 9185 1320 l 9185 1200 l 9289 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 1140 m 9185 1200 l 9185 1080 l 9289 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 1020 m 9185 1080 l 9185 960 l 9289 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 900 m 9185 960 l 9185 840 l 9289 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 780 m 9185 840 l 9185 720 l 9289 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 660 m 9185 720 l 9185 600 l 9289 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 540 m 9185 600 l 9185 480 l 9289 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 420 m 9185 480 l 9185 360 l 9289 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 300 m 9185 360 l 9185 240 l 9289 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 2160 m 9081 2219 l 9081 2099 l 9185 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 2040 m 9081 2099 l 9081 1979 l 9185 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 1920 m 9081 1979 l 9081 1860 l 9185 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 1800 m 9081 1860 l 9081 1740 l 9185 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 1680 m 9081 1740 l 9081 1620 l 9185 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 1560 m 9081 1620 l 9081 1500 l 9185 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 1440 m 9081 1500 l 9081 1380 l 9185 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 1320 m 9081 1380 l 9081 1260 l 9185 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 1200 m 9081 1260 l 9081 1140 l 9185 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 1080 m 9081 1140 l 9081 1020 l 9185 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 960 m 9081 1020 l 9081 900 l 9185 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 840 m 9081 900 l 9081 780 l 9185 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 720 m 9081 780 l 9081 660 l 9185 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 600 m 9081 660 l 9081 540 l 9185 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 480 m 9081 540 l 9081 420 l 9185 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 360 m 9081 420 l 9081 300 l 9185 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 2220 m 8977 2279 l 8977 2159 l 9081 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 2100 m 8977 2159 l 8977 2039 l 9081 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 1980 m 8977 2039 l 8977 1920 l 9081 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 1860 m 8977 1920 l 8977 1800 l 9081 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 1740 m 8977 1800 l 8977 1680 l 9081 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 1620 m 8977 1680 l 8977 1560 l 9081 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 1500 m 8977 1560 l 8977 1440 l 9081 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 1380 m 8977 1440 l 8977 1320 l 9081 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 1260 m 8977 1320 l 8977 1200 l 9081 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 1140 m 8977 1200 l 8977 1080 l 9081 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 1020 m 8977 1080 l 8977 960 l 9081 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 900 m 8977 960 l 8977 840 l 9081 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 780 m 8977 840 l 8977 720 l 9081 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 660 m 8977 720 l 8977 600 l 9081 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 540 m 8977 600 l 8977 480 l 9081 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 420 m 8977 480 l 8977 360 l 9081 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 2280 m 8873 2339 l 8873 2219 l 8977 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 2160 m 8873 2219 l 8873 2099 l 8977 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 2040 m 8873 2099 l 8873 1979 l 8977 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 1920 m 8873 1979 l 8873 1860 l 8977 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 1800 m 8873 1860 l 8873 1740 l 8977 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 1680 m 8873 1740 l 8873 1620 l 8977 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 1560 m 8873 1620 l 8873 1500 l 8977 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 1440 m 8873 1500 l 8873 1380 l 8977 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 1320 m 8873 1380 l 8873 1260 l 8977 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 1200 m 8873 1260 l 8873 1140 l 8977 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 1080 m 8873 1140 l 8873 1020 l 8977 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 960 m 8873 1020 l 8873 900 l 8977 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 840 m 8873 900 l 8873 780 l 8977 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 720 m 8873 780 l 8873 660 l 8977 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 600 m 8873 660 l 8873 540 l 8977 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 480 m 8873 540 l 8873 420 l 8977 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 2340 m 8769 2399 l 8769 2279 l 8873 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 2220 m 8769 2279 l 8769 2159 l 8873 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 2100 m 8769 2159 l 8769 2039 l 8873 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 1980 m 8769 2039 l 8769 1920 l 8873 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 1860 m 8769 1920 l 8769 1800 l 8873 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 1740 m 8769 1800 l 8769 1680 l 8873 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 1620 m 8769 1680 l 8769 1560 l 8873 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 1500 m 8769 1560 l 8769 1440 l 8873 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 1380 m 8769 1440 l 8769 1320 l 8873 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 1260 m 8769 1320 l 8769 1200 l 8873 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 1140 m 8769 1200 l 8769 1080 l 8873 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 1020 m 8769 1080 l 8769 960 l 8873 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 900 m 8769 960 l 8769 840 l 8873 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 780 m 8769 840 l 8769 720 l 8873 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 660 m 8769 720 l 8769 600 l 8873 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 540 m 8769 600 l 8769 480 l 8873 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 2400 m 8665 2459 l 8665 2339 l 8769 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 2280 m 8665 2339 l 8665 2219 l 8769 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 2160 m 8665 2219 l 8665 2099 l 8769 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 2040 m 8665 2099 l 8665 1979 l 8769 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 1920 m 8665 1979 l 8665 1860 l 8769 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 1800 m 8665 1860 l 8665 1740 l 8769 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 1680 m 8665 1740 l 8665 1620 l 8769 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 1560 m 8665 1620 l 8665 1500 l 8769 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 1440 m 8665 1500 l 8665 1380 l 8769 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 1320 m 8665 1380 l 8665 1260 l 8769 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 1200 m 8665 1260 l 8665 1140 l 8769 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 1080 m 8665 1140 l 8665 1020 l 8769 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 960 m 8665 1020 l 8665 900 l 8769 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 840 m 8665 900 l 8665 780 l 8769 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 720 m 8665 780 l 8665 660 l 8769 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 600 m 8665 660 l 8665 540 l 8769 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 2460 m 8561 2519 l 8561 2399 l 8665 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 2340 m 8561 2399 l 8561 2279 l 8665 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 2220 m 8561 2279 l 8561 2159 l 8665 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 2100 m 8561 2159 l 8561 2039 l 8665 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 1980 m 8561 2039 l 8561 1920 l 8665 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 1860 m 8561 1920 l 8561 1800 l 8665 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 1740 m 8561 1800 l 8561 1680 l 8665 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 1620 m 8561 1680 l 8561 1560 l 8665 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 1500 m 8561 1560 l 8561 1440 l 8665 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 1380 m 8561 1440 l 8561 1320 l 8665 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 1260 m 8561 1320 l 8561 1200 l 8665 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 1140 m 8561 1200 l 8561 1080 l 8665 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 1020 m 8561 1080 l 8561 960 l 8665 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 900 m 8561 960 l 8561 840 l 8665 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 780 m 8561 840 l 8561 720 l 8665 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 660 m 8561 720 l 8561 600 l 8665 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 2520 m 8457 2579 l 8457 2459 l 8561 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 2400 m 8457 2459 l 8457 2339 l 8561 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 2280 m 8457 2339 l 8457 2219 l 8561 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 2160 m 8457 2219 l 8457 2099 l 8561 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 2040 m 8457 2099 l 8457 1979 l 8561 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 1920 m 8457 1979 l 8457 1860 l 8561 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 1800 m 8457 1860 l 8457 1740 l 8561 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 1680 m 8457 1740 l 8457 1620 l 8561 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 1560 m 8457 1620 l 8457 1500 l 8561 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 1440 m 8457 1500 l 8457 1380 l 8561 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 1320 m 8457 1380 l 8457 1260 l 8561 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 1200 m 8457 1260 l 8457 1140 l 8561 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 1080 m 8457 1140 l 8457 1020 l 8561 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 960 m 8457 1020 l 8457 900 l 8561 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 840 m 8457 900 l 8457 780 l 8561 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 720 m 8457 780 l 8457 660 l 8561 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 2580 m 8353 2639 l 8353 2519 l 8457 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 2460 m 8353 2519 l 8353 2399 l 8457 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 2340 m 8353 2399 l 8353 2279 l 8457 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 2220 m 8353 2279 l 8353 2159 l 8457 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 2100 m 8353 2159 l 8353 2039 l 8457 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 1980 m 8353 2039 l 8353 1920 l 8457 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 1860 m 8353 1920 l 8353 1800 l 8457 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 1740 m 8353 1800 l 8353 1680 l 8457 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 1620 m 8353 1680 l 8353 1560 l 8457 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 1500 m 8353 1560 l 8353 1440 l 8457 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 1380 m 8353 1440 l 8353 1320 l 8457 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 1260 m 8353 1320 l 8353 1200 l 8457 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 1140 m 8353 1200 l 8353 1080 l 8457 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 1020 m 8353 1080 l 8353 960 l 8457 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 900 m 8353 960 l 8353 840 l 8457 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 780 m 8353 840 l 8353 720 l 8457 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 2640 m 8250 2699 l 8250 2579 l 8353 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 2520 m 8250 2579 l 8250 2459 l 8353 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 2400 m 8250 2459 l 8250 2339 l 8353 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 2280 m 8250 2339 l 8250 2219 l 8353 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 2160 m 8250 2219 l 8250 2099 l 8353 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 2040 m 8250 2099 l 8250 1979 l 8353 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 1920 m 8250 1979 l 8250 1860 l 8353 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 1800 m 8250 1860 l 8250 1740 l 8353 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 1680 m 8250 1740 l 8250 1620 l 8353 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 1560 m 8250 1620 l 8250 1500 l 8353 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 1440 m 8250 1500 l 8250 1380 l 8353 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 1320 m 8250 1380 l 8250 1260 l 8353 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 1200 m 8250 1260 l 8250 1140 l 8353 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 1080 m 8250 1140 l 8250 1020 l 8353 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 960 m 8250 1020 l 8250 900 l 8353 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 840 m 8250 900 l 8250 780 l 8353 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 2700 m 8146 2759 l 8146 2639 l 8250 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 2580 m 8146 2639 l 8146 2519 l 8250 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 2460 m 8146 2519 l 8146 2399 l 8250 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 2340 m 8146 2399 l 8146 2279 l 8250 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 2220 m 8146 2279 l 8146 2159 l 8250 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 2100 m 8146 2159 l 8146 2039 l 8250 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 1980 m 8146 2039 l 8146 1920 l 8250 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 1860 m 8146 1920 l 8146 1800 l 8250 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 1740 m 8146 1800 l 8146 1680 l 8250 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 1620 m 8146 1680 l 8146 1560 l 8250 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 1500 m 8146 1560 l 8146 1440 l 8250 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 1380 m 8146 1440 l 8146 1320 l 8250 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 1260 m 8146 1320 l 8146 1200 l 8250 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 1140 m 8146 1200 l 8146 1080 l 8250 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 1020 m 8146 1080 l 8146 960 l 8250 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 900 m 8146 960 l 8146 840 l 8250 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 2760 m 8042 2819 l 8042 2699 l 8146 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 2640 m 8042 2699 l 8042 2579 l 8146 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 2520 m 8042 2579 l 8042 2459 l 8146 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 2400 m 8042 2459 l 8042 2339 l 8146 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 2280 m 8042 2339 l 8042 2219 l 8146 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 2160 m 8042 2219 l 8042 2099 l 8146 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 2040 m 8042 2099 l 8042 1979 l 8146 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 1920 m 8042 1979 l 8042 1860 l 8146 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 1800 m 8042 1860 l 8042 1740 l 8146 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 1680 m 8042 1740 l 8042 1620 l 8146 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 1560 m 8042 1620 l 8042 1500 l 8146 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 1440 m 8042 1500 l 8042 1380 l 8146 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 1320 m 8042 1380 l 8042 1260 l 8146 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 1200 m 8042 1260 l 8042 1140 l 8146 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 1080 m 8042 1140 l 8042 1020 l 8146 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 960 m 8042 1020 l 8042 900 l 8146 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 2820 m 7938 2879 l 7938 2759 l 8042 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 2700 m 7938 2759 l 7938 2639 l 8042 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 2580 m 7938 2639 l 7938 2519 l 8042 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 2460 m 7938 2519 l 7938 2399 l 8042 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 2340 m 7938 2399 l 7938 2279 l 8042 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 2220 m 7938 2279 l 7938 2159 l 8042 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 2100 m 7938 2159 l 7938 2039 l 8042 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 1980 m 7938 2039 l 7938 1920 l 8042 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 1860 m 7938 1920 l 7938 1800 l 8042 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 1740 m 7938 1800 l 7938 1680 l 8042 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 1620 m 7938 1680 l 7938 1560 l 8042 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 1500 m 7938 1560 l 7938 1440 l 8042 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 1380 m 7938 1440 l 7938 1320 l 8042 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 1260 m 7938 1320 l 7938 1200 l 8042 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 1140 m 7938 1200 l 7938 1080 l 8042 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 1020 m 7938 1080 l 7938 960 l 8042 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 2160 m 9185 2040 l 9289 2100 l 9289 2220 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 9393 1920 m 9393 1800 l 9497 1861 l 9497 1980 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 9393 1800 m 9393 1680 l 9497 1741 l 9497 1861 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 9393 1680 m 9393 1560 l 9497 1621 l 9497 1741 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 9497 1500 m 9497 1380 l 9600 1441 l 9600 1561 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 9600 1320 m 9600 1200 l 9703 1261 l 9703 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 1200 m 9600 1080 l 9703 1141 l 9703 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 1080 m 9600 960 l 9703 1021 l 9703 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 960 m 9600 840 l 9703 901 l 9703 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 840 m 9600 720 l 9703 781 l 9703 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 720 m 9600 600 l 9703 661 l 9703 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 600 m 9600 480 l 9703 541 l 9703 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 480 m 9600 360 l 9703 421 l 9703 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 360 m 9600 240 l 9703 301 l 9703 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 240 m 9600 120 l 9703 181 l 9703 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 120 m 9600 0 l 9703 61 l 9703 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 2100 m 9497 1980 l 9600 2040 l 9600 2160 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 9497 1980 m 9497 1860 l 9600 1920 l 9600 2040 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 9703 1740 m 9703 1620 l 9807 1681 l 9807 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 1620 m 9703 1500 l 9807 1561 l 9807 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 1500 m 9703 1380 l 9807 1441 l 9807 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 1380 m 9703 1260 l 9807 1321 l 9807 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 1260 m 9703 1140 l 9807 1201 l 9807 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 1140 m 9703 1020 l 9807 1081 l 9807 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 1020 m 9703 900 l 9807 961 l 9807 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 900 m 9703 780 l 9807 841 l 9807 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 780 m 9703 660 l 9807 721 l 9807 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 660 m 9703 540 l 9807 601 l 9807 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 540 m 9703 420 l 9807 481 l 9807 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 420 m 9703 300 l 9807 361 l 9807 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 300 m 9703 180 l 9807 241 l 9807 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 180 m 9703 60 l 9807 121 l 9807 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 2040 m 9807 1920 l 9911 1980 l 9911 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 1920 m 9807 1800 l 9911 1861 l 9911 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 1800 m 9807 1680 l 9911 1741 l 9911 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 1680 m 9807 1560 l 9911 1621 l 9911 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 1560 m 9807 1440 l 9911 1501 l 9911 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 1440 m 9807 1320 l 9911 1381 l 9911 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 1320 m 9807 1200 l 9911 1261 l 9911 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 1200 m 9807 1080 l 9911 1141 l 9911 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 1080 m 9807 960 l 9911 1021 l 9911 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 960 m 9807 840 l 9911 901 l 9911 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 840 m 9807 720 l 9911 781 l 9911 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 720 m 9807 600 l 9911 661 l 9911 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 600 m 9807 480 l 9911 541 l 9911 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 480 m 9807 360 l 9911 421 l 9911 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 360 m 9807 240 l 9911 301 l 9911 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 240 m 9807 120 l 9911 181 l 9911 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 2100 m 9911 1980 l 10015 2040 l 10015 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 1980 m 9911 1860 l 10015 1920 l 10015 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 1860 m 9911 1740 l 10015 1801 l 10015 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 1740 m 9911 1620 l 10015 1681 l 10015 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 1620 m 9911 1500 l 10015 1561 l 10015 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 1500 m 9911 1380 l 10015 1441 l 10015 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 1380 m 9911 1260 l 10015 1321 l 10015 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 1260 m 9911 1140 l 10015 1201 l 10015 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 1140 m 9911 1020 l 10015 1081 l 10015 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 1020 m 9911 900 l 10015 961 l 10015 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 900 m 9911 780 l 10015 841 l 10015 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 780 m 9911 660 l 10015 721 l 10015 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 660 m 9911 540 l 10015 601 l 10015 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 540 m 9911 420 l 10015 481 l 10015 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 420 m 9911 300 l 10015 361 l 10015 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 300 m 9911 180 l 10015 241 l 10015 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 2160 m 10015 2040 l 10119 2100 l 10119 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 2040 m 10015 1920 l 10119 1980 l 10119 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 1920 m 10015 1800 l 10119 1861 l 10119 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 1800 m 10015 1680 l 10119 1741 l 10119 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 1680 m 10015 1560 l 10119 1621 l 10119 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 1560 m 10015 1440 l 10119 1501 l 10119 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 1440 m 10015 1320 l 10119 1381 l 10119 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 1320 m 10015 1200 l 10119 1261 l 10119 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 1200 m 10015 1080 l 10119 1141 l 10119 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 1080 m 10015 960 l 10119 1021 l 10119 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 960 m 10015 840 l 10119 901 l 10119 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 840 m 10015 720 l 10119 781 l 10119 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 720 m 10015 600 l 10119 661 l 10119 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 600 m 10015 480 l 10119 541 l 10119 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 480 m 10015 360 l 10119 421 l 10119 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 360 m 10015 240 l 10119 301 l 10119 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 2220 m 10119 2100 l 10223 2160 l 10223 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 2100 m 10119 1980 l 10223 2040 l 10223 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 1980 m 10119 1860 l 10223 1920 l 10223 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 1860 m 10119 1740 l 10223 1801 l 10223 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 1740 m 10119 1620 l 10223 1681 l 10223 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 1620 m 10119 1500 l 10223 1561 l 10223 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 1500 m 10119 1380 l 10223 1441 l 10223 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 1380 m 10119 1260 l 10223 1321 l 10223 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 1260 m 10119 1140 l 10223 1201 l 10223 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 1140 m 10119 1020 l 10223 1081 l 10223 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 1020 m 10119 900 l 10223 961 l 10223 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 900 m 10119 780 l 10223 841 l 10223 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 780 m 10119 660 l 10223 721 l 10223 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 660 m 10119 540 l 10223 601 l 10223 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 540 m 10119 420 l 10223 481 l 10223 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 420 m 10119 300 l 10223 361 l 10223 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 2280 m 10223 2160 l 10327 2220 l 10327 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 2160 m 10223 2040 l 10327 2100 l 10327 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 2040 m 10223 1920 l 10327 1980 l 10327 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 1920 m 10223 1800 l 10327 1861 l 10327 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 1800 m 10223 1680 l 10327 1741 l 10327 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 1680 m 10223 1560 l 10327 1621 l 10327 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 1560 m 10223 1440 l 10327 1501 l 10327 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 1440 m 10223 1320 l 10327 1381 l 10327 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 1320 m 10223 1200 l 10327 1261 l 10327 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 1200 m 10223 1080 l 10327 1141 l 10327 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 1080 m 10223 960 l 10327 1021 l 10327 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 960 m 10223 840 l 10327 901 l 10327 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 840 m 10223 720 l 10327 781 l 10327 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 720 m 10223 600 l 10327 661 l 10327 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 600 m 10223 480 l 10327 541 l 10327 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 480 m 10223 360 l 10327 421 l 10327 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 2340 m 10327 2220 l 10431 2280 l 10431 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 2220 m 10327 2100 l 10431 2160 l 10431 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 2100 m 10327 1980 l 10431 2040 l 10431 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 1980 m 10327 1860 l 10431 1920 l 10431 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 1860 m 10327 1740 l 10431 1801 l 10431 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 1740 m 10327 1620 l 10431 1681 l 10431 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 1620 m 10327 1500 l 10431 1561 l 10431 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 1500 m 10327 1380 l 10431 1441 l 10431 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 1380 m 10327 1260 l 10431 1321 l 10431 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 1260 m 10327 1140 l 10431 1201 l 10431 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 1140 m 10327 1020 l 10431 1081 l 10431 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 1020 m 10327 900 l 10431 961 l 10431 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 900 m 10327 780 l 10431 841 l 10431 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 780 m 10327 660 l 10431 721 l 10431 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 660 m 10327 540 l 10431 601 l 10431 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 540 m 10327 420 l 10431 481 l 10431 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 2400 m 10431 2280 l 10535 2340 l 10535 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 2280 m 10431 2160 l 10535 2220 l 10535 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 2160 m 10431 2040 l 10535 2100 l 10535 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 2040 m 10431 1920 l 10535 1980 l 10535 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 1920 m 10431 1800 l 10535 1861 l 10535 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 1800 m 10431 1680 l 10535 1741 l 10535 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 1680 m 10431 1560 l 10535 1621 l 10535 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 1560 m 10431 1440 l 10535 1501 l 10535 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 1440 m 10431 1320 l 10535 1381 l 10535 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 1320 m 10431 1200 l 10535 1261 l 10535 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 1200 m 10431 1080 l 10535 1141 l 10535 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 1080 m 10431 960 l 10535 1021 l 10535 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 960 m 10431 840 l 10535 901 l 10535 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 840 m 10431 720 l 10535 781 l 10535 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 720 m 10431 600 l 10535 661 l 10535 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 600 m 10431 480 l 10535 541 l 10535 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 2460 m 10535 2340 l 10639 2400 l 10639 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 2340 m 10535 2220 l 10639 2280 l 10639 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 2220 m 10535 2100 l 10639 2160 l 10639 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 2100 m 10535 1980 l 10639 2040 l 10639 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 1980 m 10535 1860 l 10639 1920 l 10639 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 1860 m 10535 1740 l 10639 1801 l 10639 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 1740 m 10535 1620 l 10639 1681 l 10639 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 1620 m 10535 1500 l 10639 1561 l 10639 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 1500 m 10535 1380 l 10639 1441 l 10639 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 1380 m 10535 1260 l 10639 1321 l 10639 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 1260 m 10535 1140 l 10639 1201 l 10639 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 1140 m 10535 1020 l 10639 1081 l 10639 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 1020 m 10535 900 l 10639 961 l 10639 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 900 m 10535 780 l 10639 841 l 10639 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 780 m 10535 660 l 10639 721 l 10639 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 660 m 10535 540 l 10639 601 l 10639 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 2520 m 10639 2400 l 10743 2460 l 10743 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 2400 m 10639 2280 l 10743 2340 l 10743 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 2280 m 10639 2160 l 10743 2220 l 10743 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 2160 m 10639 2040 l 10743 2100 l 10743 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 2040 m 10639 1920 l 10743 1980 l 10743 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 1920 m 10639 1800 l 10743 1861 l 10743 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 1800 m 10639 1680 l 10743 1741 l 10743 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 1680 m 10639 1560 l 10743 1621 l 10743 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 1560 m 10639 1440 l 10743 1501 l 10743 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 1440 m 10639 1320 l 10743 1381 l 10743 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 1320 m 10639 1200 l 10743 1261 l 10743 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 1200 m 10639 1080 l 10743 1141 l 10743 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 1080 m 10639 960 l 10743 1021 l 10743 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 960 m 10639 840 l 10743 901 l 10743 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 840 m 10639 720 l 10743 781 l 10743 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 720 m 10639 600 l 10743 661 l 10743 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 2580 m 10743 2460 l 10847 2520 l 10847 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 2460 m 10743 2340 l 10847 2400 l 10847 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 2340 m 10743 2220 l 10847 2280 l 10847 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 2220 m 10743 2100 l 10847 2160 l 10847 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 2100 m 10743 1980 l 10847 2040 l 10847 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 1980 m 10743 1860 l 10847 1920 l 10847 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 1860 m 10743 1740 l 10847 1801 l 10847 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 1740 m 10743 1620 l 10847 1681 l 10847 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 1620 m 10743 1500 l 10847 1561 l 10847 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 1500 m 10743 1380 l 10847 1441 l 10847 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 1380 m 10743 1260 l 10847 1321 l 10847 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 1260 m 10743 1140 l 10847 1201 l 10847 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 1140 m 10743 1020 l 10847 1081 l 10847 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 1020 m 10743 900 l 10847 961 l 10847 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 900 m 10743 780 l 10847 841 l 10847 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 780 m 10743 660 l 10847 721 l 10847 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 2640 m 10847 2520 l 10950 2580 l 10950 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 2520 m 10847 2400 l 10950 2460 l 10950 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 2400 m 10847 2280 l 10950 2340 l 10950 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 2280 m 10847 2160 l 10950 2220 l 10950 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 2160 m 10847 2040 l 10950 2100 l 10950 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 2040 m 10847 1920 l 10950 1980 l 10950 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 1920 m 10847 1800 l 10950 1861 l 10950 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 1800 m 10847 1680 l 10950 1741 l 10950 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 1680 m 10847 1560 l 10950 1621 l 10950 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 1560 m 10847 1440 l 10950 1501 l 10950 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 1440 m 10847 1320 l 10950 1381 l 10950 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 1320 m 10847 1200 l 10950 1261 l 10950 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 1200 m 10847 1080 l 10950 1141 l 10950 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 1080 m 10847 960 l 10950 1021 l 10950 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 960 m 10847 840 l 10950 901 l 10950 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 840 m 10847 720 l 10950 781 l 10950 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 2700 m 10950 2580 l 11054 2640 l 11054 2760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 2580 m 10950 2460 l 11054 2520 l 11054 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 2460 m 10950 2340 l 11054 2400 l 11054 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 2340 m 10950 2220 l 11054 2280 l 11054 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 2220 m 10950 2100 l 11054 2160 l 11054 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 2100 m 10950 1980 l 11054 2040 l 11054 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 1980 m 10950 1860 l 11054 1920 l 11054 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 1860 m 10950 1740 l 11054 1801 l 11054 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 1740 m 10950 1620 l 11054 1681 l 11054 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 1620 m 10950 1500 l 11054 1561 l 11054 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 1500 m 10950 1380 l 11054 1441 l 11054 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 1380 m 10950 1260 l 11054 1321 l 11054 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 1260 m 10950 1140 l 11054 1201 l 11054 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 1140 m 10950 1020 l 11054 1081 l 11054 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 1020 m 10950 900 l 11054 961 l 11054 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 900 m 10950 780 l 11054 841 l 11054 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 2760 m 11054 2640 l 11158 2700 l 11158 2820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 2640 m 11054 2520 l 11158 2580 l 11158 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 2520 m 11054 2400 l 11158 2460 l 11158 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 2400 m 11054 2280 l 11158 2340 l 11158 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 2280 m 11054 2160 l 11158 2220 l 11158 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 2160 m 11054 2040 l 11158 2100 l 11158 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 2040 m 11054 1920 l 11158 1980 l 11158 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 1920 m 11054 1800 l 11158 1861 l 11158 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 1800 m 11054 1680 l 11158 1741 l 11158 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 1680 m 11054 1560 l 11158 1621 l 11158 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 1560 m 11054 1440 l 11158 1501 l 11158 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 1440 m 11054 1320 l 11158 1381 l 11158 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 1320 m 11054 1200 l 11158 1261 l 11158 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 1200 m 11054 1080 l 11158 1141 l 11158 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 1080 m 11054 960 l 11158 1021 l 11158 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 960 m 11054 840 l 11158 901 l 11158 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 2820 m 11158 2700 l 11262 2760 l 11262 2880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 2700 m 11158 2580 l 11262 2640 l 11262 2760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 2580 m 11158 2460 l 11262 2520 l 11262 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 2460 m 11158 2340 l 11262 2400 l 11262 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 2340 m 11158 2220 l 11262 2280 l 11262 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 2220 m 11158 2100 l 11262 2160 l 11262 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 2100 m 11158 1980 l 11262 2040 l 11262 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 1980 m 11158 1860 l 11262 1920 l 11262 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 1860 m 11158 1740 l 11262 1801 l 11262 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 1740 m 11158 1620 l 11262 1681 l 11262 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 1620 m 11158 1500 l 11262 1561 l 11262 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 1500 m 11158 1380 l 11262 1441 l 11262 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 1380 m 11158 1260 l 11262 1321 l 11262 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 1260 m 11158 1140 l 11262 1201 l 11262 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 1140 m 11158 1020 l 11262 1081 l 11262 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 1020 m 11158 900 l 11262 961 l 11262 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 1320 m 9703 1381 l 9600 1440 l 9497 1380 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9497 1500 m 9600 1561 l 9497 1620 l 9393 1560 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9393 1920 m 9497 1980 l 9393 2039 l 9289 1979 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9289 1980 m 9393 2040 l 9289 2099 l 9185 2039 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9185 2160 m 9289 2220 l 9185 2279 l 9081 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 2220 m 9185 2280 l 9081 2339 l 8977 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 2280 m 9081 2340 l 8977 2399 l 8873 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 2340 m 8977 2400 l 8873 2459 l 8769 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 2400 m 8873 2460 l 8769 2519 l 8665 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 2460 m 8769 2520 l 8665 2579 l 8561 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 2520 m 8665 2580 l 8561 2639 l 8457 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 2580 m 8561 2640 l 8457 2699 l 8353 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 2640 m 8457 2700 l 8353 2759 l 8250 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 2700 m 8353 2760 l 8250 2819 l 8146 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 2760 m 8250 2820 l 8146 2879 l 8042 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 2820 m 8146 2880 l 8042 2939 l 7938 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 1740 m 9807 1801 l 9703 1860 l 9600 1800 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9600 1800 m 9703 1861 l 9600 1920 l 9497 1860 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9497 2100 m 9600 2160 l 9497 2219 l 9393 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 2160 m 9497 2220 l 9393 2279 l 9289 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 2220 m 9393 2280 l 9289 2339 l 9185 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 2280 m 9289 2340 l 9185 2399 l 9081 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 2340 m 9185 2400 l 9081 2459 l 8977 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 2400 m 9081 2460 l 8977 2519 l 8873 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 2460 m 8977 2520 l 8873 2579 l 8769 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 2520 m 8873 2580 l 8769 2639 l 8665 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 2580 m 8769 2640 l 8665 2699 l 8561 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 2640 m 8665 2700 l 8561 2759 l 8457 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 2700 m 8561 2760 l 8457 2819 l 8353 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 2760 m 8457 2820 l 8353 2879 l 8250 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 2820 m 8353 2880 l 8250 2939 l 8146 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 2880 m 8250 2940 l 8146 2999 l 8042 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 2040 m 9911 2100 l 9807 2159 l 9703 2099 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 2100 m 9807 2160 l 9703 2219 l 9600 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 2160 m 9703 2220 l 9600 2279 l 9497 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 2220 m 9600 2280 l 9497 2339 l 9393 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 2280 m 9497 2340 l 9393 2399 l 9289 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 2340 m 9393 2400 l 9289 2459 l 9185 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 2400 m 9289 2460 l 9185 2519 l 9081 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 2460 m 9185 2520 l 9081 2579 l 8977 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 2520 m 9081 2580 l 8977 2639 l 8873 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 2580 m 8977 2640 l 8873 2699 l 8769 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 2640 m 8873 2700 l 8769 2759 l 8665 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 2700 m 8769 2760 l 8665 2819 l 8561 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 2760 m 8665 2820 l 8561 2879 l 8457 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 2820 m 8561 2880 l 8457 2939 l 8353 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 2880 m 8457 2940 l 8353 2999 l 8250 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 2940 m 8353 3000 l 8250 3059 l 8146 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 2100 m 10015 2160 l 9911 2219 l 9807 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 2160 m 9911 2220 l 9807 2279 l 9703 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 2220 m 9807 2280 l 9703 2339 l 9600 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 2280 m 9703 2340 l 9600 2399 l 9497 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 2340 m 9600 2400 l 9497 2459 l 9393 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 2400 m 9497 2460 l 9393 2519 l 9289 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 2460 m 9393 2520 l 9289 2579 l 9185 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 2520 m 9289 2580 l 9185 2639 l 9081 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 2580 m 9185 2640 l 9081 2699 l 8977 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 2640 m 9081 2700 l 8977 2759 l 8873 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 2700 m 8977 2760 l 8873 2819 l 8769 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 2760 m 8873 2820 l 8769 2879 l 8665 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 2820 m 8769 2880 l 8665 2939 l 8561 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 2880 m 8665 2940 l 8561 2999 l 8457 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 2940 m 8561 3000 l 8457 3059 l 8353 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 3000 m 8457 3060 l 8353 3119 l 8250 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 2160 m 10119 2220 l 10015 2279 l 9911 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 2220 m 10015 2280 l 9911 2339 l 9807 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 2280 m 9911 2340 l 9807 2399 l 9703 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 2340 m 9807 2400 l 9703 2459 l 9600 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 2400 m 9703 2460 l 9600 2519 l 9497 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 2460 m 9600 2520 l 9497 2579 l 9393 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 2520 m 9497 2580 l 9393 2639 l 9289 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 2580 m 9393 2640 l 9289 2699 l 9185 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 2640 m 9289 2700 l 9185 2759 l 9081 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 2700 m 9185 2760 l 9081 2819 l 8977 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 2760 m 9081 2820 l 8977 2879 l 8873 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 2820 m 8977 2880 l 8873 2939 l 8769 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 2880 m 8873 2940 l 8769 2999 l 8665 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 2940 m 8769 3000 l 8665 3059 l 8561 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 3000 m 8665 3060 l 8561 3119 l 8457 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 3060 m 8561 3120 l 8457 3179 l 8353 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 2220 m 10223 2280 l 10119 2339 l 10015 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 2280 m 10119 2340 l 10015 2399 l 9911 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 2340 m 10015 2400 l 9911 2459 l 9807 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 2400 m 9911 2460 l 9807 2519 l 9703 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 2460 m 9807 2520 l 9703 2579 l 9600 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 2520 m 9703 2580 l 9600 2639 l 9497 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 2580 m 9600 2640 l 9497 2699 l 9393 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 2640 m 9497 2700 l 9393 2759 l 9289 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 2700 m 9393 2760 l 9289 2819 l 9185 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 2760 m 9289 2820 l 9185 2879 l 9081 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 2820 m 9185 2880 l 9081 2939 l 8977 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 2880 m 9081 2940 l 8977 2999 l 8873 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 2940 m 8977 3000 l 8873 3059 l 8769 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 3000 m 8873 3060 l 8769 3119 l 8665 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 3060 m 8769 3120 l 8665 3179 l 8561 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 3120 m 8665 3180 l 8561 3239 l 8457 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 2280 m 10327 2340 l 10223 2399 l 10119 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 2340 m 10223 2400 l 10119 2459 l 10015 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 2400 m 10119 2460 l 10015 2519 l 9911 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 2460 m 10015 2520 l 9911 2579 l 9807 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 2520 m 9911 2580 l 9807 2639 l 9703 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 2580 m 9807 2640 l 9703 2699 l 9600 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 2640 m 9703 2700 l 9600 2759 l 9497 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 2700 m 9600 2760 l 9497 2819 l 9393 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 2760 m 9497 2820 l 9393 2879 l 9289 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 2820 m 9393 2880 l 9289 2939 l 9185 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 2880 m 9289 2940 l 9185 2999 l 9081 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 2940 m 9185 3000 l 9081 3059 l 8977 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 3000 m 9081 3060 l 8977 3119 l 8873 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 3060 m 8977 3120 l 8873 3179 l 8769 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 3120 m 8873 3180 l 8769 3239 l 8665 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 3180 m 8769 3240 l 8665 3299 l 8561 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 2340 m 10431 2400 l 10327 2459 l 10223 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 2400 m 10327 2460 l 10223 2519 l 10119 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 2460 m 10223 2520 l 10119 2579 l 10015 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 2520 m 10119 2580 l 10015 2639 l 9911 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 2580 m 10015 2640 l 9911 2699 l 9807 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 2640 m 9911 2700 l 9807 2759 l 9703 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 2700 m 9807 2760 l 9703 2819 l 9600 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 2760 m 9703 2820 l 9600 2879 l 9497 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 2820 m 9600 2880 l 9497 2939 l 9393 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 2880 m 9497 2940 l 9393 2999 l 9289 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 2940 m 9393 3000 l 9289 3059 l 9185 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 3000 m 9289 3060 l 9185 3119 l 9081 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 3060 m 9185 3120 l 9081 3179 l 8977 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 3120 m 9081 3180 l 8977 3239 l 8873 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 3180 m 8977 3240 l 8873 3299 l 8769 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 3240 m 8873 3300 l 8769 3359 l 8665 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 2400 m 10535 2460 l 10431 2519 l 10327 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 2460 m 10431 2520 l 10327 2579 l 10223 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 2520 m 10327 2580 l 10223 2639 l 10119 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 2580 m 10223 2640 l 10119 2699 l 10015 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 2640 m 10119 2700 l 10015 2759 l 9911 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 2700 m 10015 2760 l 9911 2819 l 9807 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 2760 m 9911 2820 l 9807 2879 l 9703 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 2820 m 9807 2880 l 9703 2939 l 9600 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 2880 m 9703 2940 l 9600 2999 l 9497 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 2940 m 9600 3000 l 9497 3059 l 9393 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 3000 m 9497 3060 l 9393 3119 l 9289 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 3060 m 9393 3120 l 9289 3179 l 9185 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 3120 m 9289 3180 l 9185 3239 l 9081 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 3180 m 9185 3240 l 9081 3299 l 8977 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 3240 m 9081 3300 l 8977 3359 l 8873 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 3300 m 8977 3360 l 8873 3419 l 8769 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 2460 m 10639 2520 l 10535 2579 l 10431 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 2520 m 10535 2580 l 10431 2639 l 10327 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 2580 m 10431 2640 l 10327 2699 l 10223 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 2640 m 10327 2700 l 10223 2759 l 10119 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 2700 m 10223 2760 l 10119 2819 l 10015 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 2760 m 10119 2820 l 10015 2879 l 9911 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 2820 m 10015 2880 l 9911 2939 l 9807 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 2880 m 9911 2940 l 9807 2999 l 9703 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 2940 m 9807 3000 l 9703 3059 l 9600 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 3000 m 9703 3060 l 9600 3119 l 9497 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 3060 m 9600 3120 l 9497 3179 l 9393 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 3120 m 9497 3180 l 9393 3239 l 9289 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 3180 m 9393 3240 l 9289 3299 l 9185 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 3240 m 9289 3300 l 9185 3359 l 9081 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 3300 m 9185 3360 l 9081 3419 l 8977 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 3360 m 9081 3420 l 8977 3479 l 8873 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 2520 m 10743 2580 l 10639 2639 l 10535 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 2580 m 10639 2640 l 10535 2699 l 10431 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 2640 m 10535 2700 l 10431 2759 l 10327 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 2700 m 10431 2760 l 10327 2819 l 10223 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 2760 m 10327 2820 l 10223 2879 l 10119 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 2820 m 10223 2880 l 10119 2939 l 10015 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 2880 m 10119 2940 l 10015 2999 l 9911 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 2940 m 10015 3000 l 9911 3059 l 9807 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 3000 m 9911 3060 l 9807 3119 l 9703 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 3060 m 9807 3120 l 9703 3179 l 9600 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 3120 m 9703 3180 l 9600 3239 l 9497 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 3180 m 9600 3240 l 9497 3299 l 9393 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 3240 m 9497 3300 l 9393 3359 l 9289 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 3300 m 9393 3360 l 9289 3419 l 9185 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 3360 m 9289 3420 l 9185 3479 l 9081 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 3420 m 9185 3480 l 9081 3539 l 8977 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 2580 m 10847 2640 l 10743 2699 l 10639 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 2640 m 10743 2700 l 10639 2759 l 10535 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 2700 m 10639 2760 l 10535 2819 l 10431 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 2760 m 10535 2820 l 10431 2879 l 10327 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 2820 m 10431 2880 l 10327 2939 l 10223 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 2880 m 10327 2940 l 10223 2999 l 10119 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 2940 m 10223 3000 l 10119 3059 l 10015 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 3000 m 10119 3060 l 10015 3119 l 9911 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 3060 m 10015 3120 l 9911 3179 l 9807 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 3120 m 9911 3180 l 9807 3239 l 9703 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 3180 m 9807 3240 l 9703 3299 l 9600 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 3240 m 9703 3300 l 9600 3359 l 9497 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 3300 m 9600 3360 l 9497 3419 l 9393 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 3360 m 9497 3420 l 9393 3479 l 9289 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 3420 m 9393 3480 l 9289 3539 l 9185 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 3480 m 9289 3540 l 9185 3599 l 9081 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 2640 m 10950 2700 l 10847 2759 l 10743 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 2700 m 10847 2760 l 10743 2819 l 10639 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 2760 m 10743 2820 l 10639 2879 l 10535 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 2820 m 10639 2880 l 10535 2939 l 10431 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 2880 m 10535 2940 l 10431 2999 l 10327 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 2940 m 10431 3000 l 10327 3059 l 10223 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 3000 m 10327 3060 l 10223 3119 l 10119 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 3060 m 10223 3120 l 10119 3179 l 10015 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 3120 m 10119 3180 l 10015 3239 l 9911 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 3180 m 10015 3240 l 9911 3299 l 9807 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 3240 m 9911 3300 l 9807 3359 l 9703 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 3300 m 9807 3360 l 9703 3419 l 9600 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 3360 m 9703 3420 l 9600 3479 l 9497 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 3420 m 9600 3480 l 9497 3539 l 9393 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 3480 m 9497 3540 l 9393 3599 l 9289 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 3540 m 9393 3600 l 9289 3659 l 9185 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 2700 m 11054 2760 l 10950 2819 l 10847 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 2760 m 10950 2820 l 10847 2879 l 10743 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 2820 m 10847 2880 l 10743 2939 l 10639 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 2880 m 10743 2940 l 10639 2999 l 10535 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 2940 m 10639 3000 l 10535 3059 l 10431 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 3000 m 10535 3060 l 10431 3119 l 10327 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 3060 m 10431 3120 l 10327 3179 l 10223 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 3120 m 10327 3180 l 10223 3239 l 10119 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 3180 m 10223 3240 l 10119 3299 l 10015 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 3240 m 10119 3300 l 10015 3359 l 9911 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 3300 m 10015 3360 l 9911 3419 l 9807 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 3360 m 9911 3420 l 9807 3479 l 9703 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 3420 m 9807 3480 l 9703 3539 l 9600 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 3480 m 9703 3540 l 9600 3599 l 9497 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 3540 m 9600 3600 l 9497 3659 l 9393 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 3600 m 9497 3660 l 9393 3719 l 9289 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 2760 m 11158 2820 l 11054 2879 l 10950 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 2820 m 11054 2880 l 10950 2939 l 10847 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 2880 m 10950 2940 l 10847 2999 l 10743 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 2940 m 10847 3000 l 10743 3059 l 10639 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 3000 m 10743 3060 l 10639 3119 l 10535 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 3060 m 10639 3120 l 10535 3179 l 10431 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 3120 m 10535 3180 l 10431 3239 l 10327 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 3180 m 10431 3240 l 10327 3299 l 10223 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 3240 m 10327 3300 l 10223 3359 l 10119 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 3300 m 10223 3360 l 10119 3419 l 10015 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 3360 m 10119 3420 l 10015 3479 l 9911 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 3420 m 10015 3480 l 9911 3539 l 9807 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 3480 m 9911 3540 l 9807 3599 l 9703 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 3540 m 9807 3600 l 9703 3659 l 9600 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 3600 m 9703 3660 l 9600 3719 l 9497 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 3660 m 9600 3720 l 9497 3779 l 9393 3719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 2820 m 11262 2880 l 11158 2939 l 11054 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 2880 m 11158 2940 l 11054 2999 l 10950 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 2940 m 11054 3000 l 10950 3059 l 10847 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 3000 m 10950 3060 l 10847 3119 l 10743 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 3060 m 10847 3120 l 10743 3179 l 10639 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 3120 m 10743 3180 l 10639 3239 l 10535 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 3180 m 10639 3240 l 10535 3299 l 10431 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 3240 m 10535 3300 l 10431 3359 l 10327 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 3300 m 10431 3360 l 10327 3419 l 10223 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 3360 m 10327 3420 l 10223 3479 l 10119 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 3420 m 10223 3480 l 10119 3539 l 10015 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 3480 m 10119 3540 l 10015 3599 l 9911 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 3540 m 10015 3600 l 9911 3659 l 9807 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 3600 m 9911 3660 l 9807 3719 l 9703 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 3660 m 9807 3720 l 9703 3779 l 9600 3719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 3720 m 9703 3780 l 9600 3839 l 9497 3779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 2100 m 13647 2159 l 13647 2039 l 13751 1980 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 13647 1920 m 13543 1979 l 13543 1860 l 13647 1801 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 13440 1680 m 13337 1740 l 13337 1620 l 13440 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 1560 m 13337 1620 l 13337 1500 l 13440 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 1440 m 13337 1500 l 13337 1380 l 13440 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 1320 m 13337 1380 l 13337 1260 l 13440 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 1200 m 13337 1260 l 13337 1140 l 13440 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 1080 m 13337 1140 l 13337 1020 l 13440 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 960 m 13337 1020 l 13337 900 l 13440 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 840 m 13337 900 l 13337 780 l 13440 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 720 m 13337 780 l 13337 660 l 13440 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 600 m 13337 660 l 13337 540 l 13440 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 480 m 13337 540 l 13337 420 l 13440 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 360 m 13337 420 l 13337 300 l 13440 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 240 m 13337 300 l 13337 180 l 13440 121 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 120 m 13337 180 l 13337 60 l 13440 1 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 2100 m 13440 2159 l 13440 2039 l 13543 1980 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 13543 1980 m 13440 2039 l 13440 1920 l 13543 1861 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 13337 1740 m 13233 1800 l 13233 1680 l 13337 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 1620 m 13233 1680 l 13233 1560 l 13337 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 1500 m 13233 1560 l 13233 1440 l 13337 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 1380 m 13233 1440 l 13233 1320 l 13337 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 1260 m 13233 1320 l 13233 1200 l 13337 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 1140 m 13233 1200 l 13233 1080 l 13337 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 1020 m 13233 1080 l 13233 960 l 13337 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 900 m 13233 960 l 13233 840 l 13337 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 780 m 13233 840 l 13233 720 l 13337 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 660 m 13233 720 l 13233 600 l 13337 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 540 m 13233 600 l 13233 480 l 13337 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 420 m 13233 480 l 13233 360 l 13337 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 300 m 13233 360 l 13233 240 l 13337 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 180 m 13233 240 l 13233 120 l 13337 61 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 2160 m 13337 2219 l 13337 2099 l 13440 2040 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 13233 1920 m 13129 1979 l 13129 1860 l 13233 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 1800 m 13129 1860 l 13129 1740 l 13233 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 1680 m 13129 1740 l 13129 1620 l 13233 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 1560 m 13129 1620 l 13129 1500 l 13233 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 1440 m 13129 1500 l 13129 1380 l 13233 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 1320 m 13129 1380 l 13129 1260 l 13233 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 1200 m 13129 1260 l 13129 1140 l 13233 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 1080 m 13129 1140 l 13129 1020 l 13233 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 960 m 13129 1020 l 13129 900 l 13233 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 840 m 13129 900 l 13129 780 l 13233 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 720 m 13129 780 l 13129 660 l 13233 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 600 m 13129 660 l 13129 540 l 13233 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 480 m 13129 540 l 13129 420 l 13233 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 360 m 13129 420 l 13129 300 l 13233 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 240 m 13129 300 l 13129 180 l 13233 121 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 2220 m 13233 2279 l 13233 2159 l 13337 2100 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 13129 1980 m 13025 2039 l 13025 1920 l 13129 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 1860 m 13025 1920 l 13025 1800 l 13129 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 1740 m 13025 1800 l 13025 1680 l 13129 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 1620 m 13025 1680 l 13025 1560 l 13129 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 1500 m 13025 1560 l 13025 1440 l 13129 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 1380 m 13025 1440 l 13025 1320 l 13129 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 1260 m 13025 1320 l 13025 1200 l 13129 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 1140 m 13025 1200 l 13025 1080 l 13129 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 1020 m 13025 1080 l 13025 960 l 13129 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 900 m 13025 960 l 13025 840 l 13129 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 780 m 13025 840 l 13025 720 l 13129 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 660 m 13025 720 l 13025 600 l 13129 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 540 m 13025 600 l 13025 480 l 13129 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 420 m 13025 480 l 13025 360 l 13129 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 300 m 13025 360 l 13025 240 l 13129 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 2220 m 13025 2279 l 13025 2159 l 13129 2100 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 13025 2040 m 12921 2099 l 12921 1979 l 13025 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 1920 m 12921 1979 l 12921 1860 l 13025 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 1800 m 12921 1860 l 12921 1740 l 13025 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 1680 m 12921 1740 l 12921 1620 l 13025 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 1560 m 12921 1620 l 12921 1500 l 13025 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 1440 m 12921 1500 l 12921 1380 l 13025 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 1320 m 12921 1380 l 12921 1260 l 13025 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 1200 m 12921 1260 l 12921 1140 l 13025 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 1080 m 12921 1140 l 12921 1020 l 13025 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 960 m 12921 1020 l 12921 900 l 13025 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 840 m 12921 900 l 12921 780 l 13025 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 720 m 12921 780 l 12921 660 l 13025 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 600 m 12921 660 l 12921 540 l 13025 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 480 m 12921 540 l 12921 420 l 13025 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 360 m 12921 420 l 12921 300 l 13025 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 2280 m 12921 2339 l 12921 2219 l 13025 2160 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 12921 2100 m 12817 2159 l 12817 2039 l 12921 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 1980 m 12817 2039 l 12817 1920 l 12921 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 1860 m 12817 1920 l 12817 1800 l 12921 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 1740 m 12817 1800 l 12817 1680 l 12921 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 1620 m 12817 1680 l 12817 1560 l 12921 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 1500 m 12817 1560 l 12817 1440 l 12921 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 1380 m 12817 1440 l 12817 1320 l 12921 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 1260 m 12817 1320 l 12817 1200 l 12921 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 1140 m 12817 1200 l 12817 1080 l 12921 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 1020 m 12817 1080 l 12817 960 l 12921 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 900 m 12817 960 l 12817 840 l 12921 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 780 m 12817 840 l 12817 720 l 12921 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 660 m 12817 720 l 12817 600 l 12921 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 540 m 12817 600 l 12817 480 l 12921 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 420 m 12817 480 l 12817 360 l 12921 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 2280 m 12713 2339 l 12713 2219 l 12817 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 2160 m 12713 2219 l 12713 2099 l 12817 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 2040 m 12713 2099 l 12713 1979 l 12817 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 1920 m 12713 1979 l 12713 1860 l 12817 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 1800 m 12713 1860 l 12713 1740 l 12817 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 1680 m 12713 1740 l 12713 1620 l 12817 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 1560 m 12713 1620 l 12713 1500 l 12817 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 1440 m 12713 1500 l 12713 1380 l 12817 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 1320 m 12713 1380 l 12713 1260 l 12817 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 1200 m 12713 1260 l 12713 1140 l 12817 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 1080 m 12713 1140 l 12713 1020 l 12817 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 960 m 12713 1020 l 12713 900 l 12817 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 840 m 12713 900 l 12713 780 l 12817 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 720 m 12713 780 l 12713 660 l 12817 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 600 m 12713 660 l 12713 540 l 12817 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 480 m 12713 540 l 12713 420 l 12817 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 2340 m 12609 2399 l 12609 2279 l 12713 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 2220 m 12609 2279 l 12609 2159 l 12713 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 2100 m 12609 2159 l 12609 2039 l 12713 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 1980 m 12609 2039 l 12609 1920 l 12713 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 1860 m 12609 1920 l 12609 1800 l 12713 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 1740 m 12609 1800 l 12609 1680 l 12713 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 1620 m 12609 1680 l 12609 1560 l 12713 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 1500 m 12609 1560 l 12609 1440 l 12713 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 1380 m 12609 1440 l 12609 1320 l 12713 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 1260 m 12609 1320 l 12609 1200 l 12713 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 1140 m 12609 1200 l 12609 1080 l 12713 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 1020 m 12609 1080 l 12609 960 l 12713 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 900 m 12609 960 l 12609 840 l 12713 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 780 m 12609 840 l 12609 720 l 12713 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 660 m 12609 720 l 12609 600 l 12713 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 540 m 12609 600 l 12609 480 l 12713 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 2400 m 12505 2459 l 12505 2339 l 12609 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 2280 m 12505 2339 l 12505 2219 l 12609 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 2160 m 12505 2219 l 12505 2099 l 12609 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 2040 m 12505 2099 l 12505 1979 l 12609 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 1920 m 12505 1979 l 12505 1860 l 12609 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 1800 m 12505 1860 l 12505 1740 l 12609 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 1680 m 12505 1740 l 12505 1620 l 12609 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 1560 m 12505 1620 l 12505 1500 l 12609 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 1440 m 12505 1500 l 12505 1380 l 12609 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 1320 m 12505 1380 l 12505 1260 l 12609 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 1200 m 12505 1260 l 12505 1140 l 12609 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 1080 m 12505 1140 l 12505 1020 l 12609 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 960 m 12505 1020 l 12505 900 l 12609 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 840 m 12505 900 l 12505 780 l 12609 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 720 m 12505 780 l 12505 660 l 12609 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 600 m 12505 660 l 12505 540 l 12609 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 2460 m 12401 2519 l 12401 2399 l 12505 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 2340 m 12401 2399 l 12401 2279 l 12505 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 2220 m 12401 2279 l 12401 2159 l 12505 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 2100 m 12401 2159 l 12401 2039 l 12505 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 1980 m 12401 2039 l 12401 1920 l 12505 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 1860 m 12401 1920 l 12401 1800 l 12505 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 1740 m 12401 1800 l 12401 1680 l 12505 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 1620 m 12401 1680 l 12401 1560 l 12505 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 1500 m 12401 1560 l 12401 1440 l 12505 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 1380 m 12401 1440 l 12401 1320 l 12505 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 1260 m 12401 1320 l 12401 1200 l 12505 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 1140 m 12401 1200 l 12401 1080 l 12505 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 1020 m 12401 1080 l 12401 960 l 12505 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 900 m 12401 960 l 12401 840 l 12505 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 780 m 12401 840 l 12401 720 l 12505 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 660 m 12401 720 l 12401 600 l 12505 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 2520 m 12297 2579 l 12297 2459 l 12401 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 2400 m 12297 2459 l 12297 2339 l 12401 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 2280 m 12297 2339 l 12297 2219 l 12401 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 2160 m 12297 2219 l 12297 2099 l 12401 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 2040 m 12297 2099 l 12297 1979 l 12401 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 1920 m 12297 1979 l 12297 1860 l 12401 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 1800 m 12297 1860 l 12297 1740 l 12401 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 1680 m 12297 1740 l 12297 1620 l 12401 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 1560 m 12297 1620 l 12297 1500 l 12401 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 1440 m 12297 1500 l 12297 1380 l 12401 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 1320 m 12297 1380 l 12297 1260 l 12401 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 1200 m 12297 1260 l 12297 1140 l 12401 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 1080 m 12297 1140 l 12297 1020 l 12401 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 960 m 12297 1020 l 12297 900 l 12401 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 840 m 12297 900 l 12297 780 l 12401 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 720 m 12297 780 l 12297 660 l 12401 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 2580 m 12193 2639 l 12193 2519 l 12297 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 2460 m 12193 2519 l 12193 2399 l 12297 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 2340 m 12193 2399 l 12193 2279 l 12297 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 2220 m 12193 2279 l 12193 2159 l 12297 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 2100 m 12193 2159 l 12193 2039 l 12297 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 1980 m 12193 2039 l 12193 1920 l 12297 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 1860 m 12193 1920 l 12193 1800 l 12297 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 1740 m 12193 1800 l 12193 1680 l 12297 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 1620 m 12193 1680 l 12193 1560 l 12297 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 1500 m 12193 1560 l 12193 1440 l 12297 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 1380 m 12193 1440 l 12193 1320 l 12297 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 1260 m 12193 1320 l 12193 1200 l 12297 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 1140 m 12193 1200 l 12193 1080 l 12297 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 1020 m 12193 1080 l 12193 960 l 12297 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 900 m 12193 960 l 12193 840 l 12297 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 780 m 12193 840 l 12193 720 l 12297 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 2640 m 12090 2699 l 12090 2579 l 12193 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 2520 m 12090 2579 l 12090 2459 l 12193 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 2400 m 12090 2459 l 12090 2339 l 12193 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 2280 m 12090 2339 l 12090 2219 l 12193 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 2160 m 12090 2219 l 12090 2099 l 12193 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 2040 m 12090 2099 l 12090 1979 l 12193 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 1920 m 12090 1979 l 12090 1860 l 12193 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 1800 m 12090 1860 l 12090 1740 l 12193 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 1680 m 12090 1740 l 12090 1620 l 12193 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 1560 m 12090 1620 l 12090 1500 l 12193 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 1440 m 12090 1500 l 12090 1380 l 12193 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 1320 m 12090 1380 l 12090 1260 l 12193 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 1200 m 12090 1260 l 12090 1140 l 12193 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 1080 m 12090 1140 l 12090 1020 l 12193 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 960 m 12090 1020 l 12090 900 l 12193 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 840 m 12090 900 l 12090 780 l 12193 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 2700 m 11986 2759 l 11986 2639 l 12090 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 2580 m 11986 2639 l 11986 2519 l 12090 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 2460 m 11986 2519 l 11986 2399 l 12090 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 2340 m 11986 2399 l 11986 2279 l 12090 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 2220 m 11986 2279 l 11986 2159 l 12090 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 2100 m 11986 2159 l 11986 2039 l 12090 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 1980 m 11986 2039 l 11986 1920 l 12090 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 1860 m 11986 1920 l 11986 1800 l 12090 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 1740 m 11986 1800 l 11986 1680 l 12090 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 1620 m 11986 1680 l 11986 1560 l 12090 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 1500 m 11986 1560 l 11986 1440 l 12090 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 1380 m 11986 1440 l 11986 1320 l 12090 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 1260 m 11986 1320 l 11986 1200 l 12090 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 1140 m 11986 1200 l 11986 1080 l 12090 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 1020 m 11986 1080 l 11986 960 l 12090 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 900 m 11986 960 l 11986 840 l 12090 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 2760 m 11882 2819 l 11882 2699 l 11986 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 2640 m 11882 2699 l 11882 2579 l 11986 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 2520 m 11882 2579 l 11882 2459 l 11986 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 2400 m 11882 2459 l 11882 2339 l 11986 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 2280 m 11882 2339 l 11882 2219 l 11986 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 2160 m 11882 2219 l 11882 2099 l 11986 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 2040 m 11882 2099 l 11882 1979 l 11986 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 1920 m 11882 1979 l 11882 1860 l 11986 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 1800 m 11882 1860 l 11882 1740 l 11986 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 1680 m 11882 1740 l 11882 1620 l 11986 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 1560 m 11882 1620 l 11882 1500 l 11986 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 1440 m 11882 1500 l 11882 1380 l 11986 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 1320 m 11882 1380 l 11882 1260 l 11986 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 1200 m 11882 1260 l 11882 1140 l 11986 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 1080 m 11882 1140 l 11882 1020 l 11986 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 960 m 11882 1020 l 11882 900 l 11986 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 2820 m 11778 2879 l 11778 2759 l 11882 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 2700 m 11778 2759 l 11778 2639 l 11882 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 2580 m 11778 2639 l 11778 2519 l 11882 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 2460 m 11778 2519 l 11778 2399 l 11882 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 2340 m 11778 2399 l 11778 2279 l 11882 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 2220 m 11778 2279 l 11778 2159 l 11882 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 2100 m 11778 2159 l 11778 2039 l 11882 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 1980 m 11778 2039 l 11778 1920 l 11882 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 1860 m 11778 1920 l 11778 1800 l 11882 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 1740 m 11778 1800 l 11778 1680 l 11882 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 1620 m 11778 1680 l 11778 1560 l 11882 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 1500 m 11778 1560 l 11778 1440 l 11882 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 1380 m 11778 1440 l 11778 1320 l 11882 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 1260 m 11778 1320 l 11778 1200 l 11882 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 1140 m 11778 1200 l 11778 1080 l 11882 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 1020 m 11778 1080 l 11778 960 l 11882 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 2280 m 12817 2160 l 12921 2220 l 12921 2340 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 13233 1920 m 13233 1800 l 13337 1861 l 13337 1980 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 13440 1680 m 13440 1560 l 13543 1621 l 13543 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 1560 m 13440 1440 l 13543 1501 l 13543 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 1440 m 13440 1320 l 13543 1381 l 13543 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 1320 m 13440 1200 l 13543 1261 l 13543 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 1200 m 13440 1080 l 13543 1141 l 13543 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 1080 m 13440 960 l 13543 1021 l 13543 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 960 m 13440 840 l 13543 901 l 13543 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 840 m 13440 720 l 13543 781 l 13543 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 720 m 13440 600 l 13543 661 l 13543 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 600 m 13440 480 l 13543 541 l 13543 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 480 m 13440 360 l 13543 421 l 13543 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 360 m 13440 240 l 13543 301 l 13543 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 240 m 13440 120 l 13543 181 l 13543 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 120 m 13440 0 l 13543 61 l 13543 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 2220 m 13129 2100 l 13233 2160 l 13233 2280 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 13337 1980 m 13337 1860 l 13440 1920 l 13440 2040 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 13543 1740 m 13543 1620 l 13647 1681 l 13647 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 1620 m 13543 1500 l 13647 1561 l 13647 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 1500 m 13543 1380 l 13647 1441 l 13647 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 1380 m 13543 1260 l 13647 1321 l 13647 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 1260 m 13543 1140 l 13647 1201 l 13647 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 1140 m 13543 1020 l 13647 1081 l 13647 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 1020 m 13543 900 l 13647 961 l 13647 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 900 m 13543 780 l 13647 841 l 13647 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 780 m 13543 660 l 13647 721 l 13647 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 660 m 13543 540 l 13647 601 l 13647 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 540 m 13543 420 l 13647 481 l 13647 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 420 m 13543 300 l 13647 361 l 13647 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 300 m 13543 180 l 13647 241 l 13647 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 180 m 13543 60 l 13647 121 l 13647 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 2100 m 13543 1980 l 13647 2040 l 13647 2160 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 13647 1920 m 13647 1800 l 13751 1861 l 13751 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 1800 m 13647 1680 l 13751 1741 l 13751 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 1680 m 13647 1560 l 13751 1621 l 13751 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 1560 m 13647 1440 l 13751 1501 l 13751 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 1440 m 13647 1320 l 13751 1381 l 13751 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 1320 m 13647 1200 l 13751 1261 l 13751 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 1200 m 13647 1080 l 13751 1141 l 13751 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 1080 m 13647 960 l 13751 1021 l 13751 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 960 m 13647 840 l 13751 901 l 13751 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 840 m 13647 720 l 13751 781 l 13751 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 720 m 13647 600 l 13751 661 l 13751 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 600 m 13647 480 l 13751 541 l 13751 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 480 m 13647 360 l 13751 421 l 13751 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 360 m 13647 240 l 13751 301 l 13751 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 240 m 13647 120 l 13751 181 l 13751 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 2100 m 13751 1980 l 13855 2040 l 13855 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 1980 m 13751 1860 l 13855 1920 l 13855 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 1860 m 13751 1740 l 13855 1801 l 13855 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 1740 m 13751 1620 l 13855 1681 l 13855 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 1620 m 13751 1500 l 13855 1561 l 13855 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 1500 m 13751 1380 l 13855 1441 l 13855 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 1380 m 13751 1260 l 13855 1321 l 13855 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 1260 m 13751 1140 l 13855 1201 l 13855 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 1140 m 13751 1020 l 13855 1081 l 13855 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 1020 m 13751 900 l 13855 961 l 13855 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 900 m 13751 780 l 13855 841 l 13855 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 780 m 13751 660 l 13855 721 l 13855 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 660 m 13751 540 l 13855 601 l 13855 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 540 m 13751 420 l 13855 481 l 13855 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 420 m 13751 300 l 13855 361 l 13855 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 300 m 13751 180 l 13855 241 l 13855 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 2160 m 13855 2040 l 13959 2100 l 13959 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 2040 m 13855 1920 l 13959 1980 l 13959 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 1920 m 13855 1800 l 13959 1861 l 13959 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 1800 m 13855 1680 l 13959 1741 l 13959 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 1680 m 13855 1560 l 13959 1621 l 13959 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 1560 m 13855 1440 l 13959 1501 l 13959 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 1440 m 13855 1320 l 13959 1381 l 13959 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 1320 m 13855 1200 l 13959 1261 l 13959 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 1200 m 13855 1080 l 13959 1141 l 13959 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 1080 m 13855 960 l 13959 1021 l 13959 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 960 m 13855 840 l 13959 901 l 13959 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 840 m 13855 720 l 13959 781 l 13959 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 720 m 13855 600 l 13959 661 l 13959 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 600 m 13855 480 l 13959 541 l 13959 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 480 m 13855 360 l 13959 421 l 13959 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 360 m 13855 240 l 13959 301 l 13959 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 2220 m 13959 2100 l 14063 2160 l 14063 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 2100 m 13959 1980 l 14063 2040 l 14063 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 1980 m 13959 1860 l 14063 1920 l 14063 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 1860 m 13959 1740 l 14063 1801 l 14063 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 1740 m 13959 1620 l 14063 1681 l 14063 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 1620 m 13959 1500 l 14063 1561 l 14063 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 1500 m 13959 1380 l 14063 1441 l 14063 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 1380 m 13959 1260 l 14063 1321 l 14063 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 1260 m 13959 1140 l 14063 1201 l 14063 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 1140 m 13959 1020 l 14063 1081 l 14063 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 1020 m 13959 900 l 14063 961 l 14063 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 900 m 13959 780 l 14063 841 l 14063 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 780 m 13959 660 l 14063 721 l 14063 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 660 m 13959 540 l 14063 601 l 14063 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 540 m 13959 420 l 14063 481 l 14063 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 420 m 13959 300 l 14063 361 l 14063 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 2280 m 14063 2160 l 14167 2220 l 14167 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 2160 m 14063 2040 l 14167 2100 l 14167 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 2040 m 14063 1920 l 14167 1980 l 14167 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 1920 m 14063 1800 l 14167 1861 l 14167 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 1800 m 14063 1680 l 14167 1741 l 14167 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 1680 m 14063 1560 l 14167 1621 l 14167 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 1560 m 14063 1440 l 14167 1501 l 14167 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 1440 m 14063 1320 l 14167 1381 l 14167 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 1320 m 14063 1200 l 14167 1261 l 14167 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 1200 m 14063 1080 l 14167 1141 l 14167 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 1080 m 14063 960 l 14167 1021 l 14167 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 960 m 14063 840 l 14167 901 l 14167 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 840 m 14063 720 l 14167 781 l 14167 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 720 m 14063 600 l 14167 661 l 14167 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 600 m 14063 480 l 14167 541 l 14167 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 480 m 14063 360 l 14167 421 l 14167 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 2340 m 14167 2220 l 14271 2280 l 14271 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 2220 m 14167 2100 l 14271 2160 l 14271 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 2100 m 14167 1980 l 14271 2040 l 14271 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 1980 m 14167 1860 l 14271 1920 l 14271 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 1860 m 14167 1740 l 14271 1801 l 14271 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 1740 m 14167 1620 l 14271 1681 l 14271 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 1620 m 14167 1500 l 14271 1561 l 14271 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 1500 m 14167 1380 l 14271 1441 l 14271 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 1380 m 14167 1260 l 14271 1321 l 14271 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 1260 m 14167 1140 l 14271 1201 l 14271 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 1140 m 14167 1020 l 14271 1081 l 14271 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 1020 m 14167 900 l 14271 961 l 14271 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 900 m 14167 780 l 14271 841 l 14271 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 780 m 14167 660 l 14271 721 l 14271 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 660 m 14167 540 l 14271 601 l 14271 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 540 m 14167 420 l 14271 481 l 14271 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 2400 m 14271 2280 l 14375 2340 l 14375 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 2280 m 14271 2160 l 14375 2220 l 14375 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 2160 m 14271 2040 l 14375 2100 l 14375 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 2040 m 14271 1920 l 14375 1980 l 14375 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 1920 m 14271 1800 l 14375 1861 l 14375 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 1800 m 14271 1680 l 14375 1741 l 14375 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 1680 m 14271 1560 l 14375 1621 l 14375 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 1560 m 14271 1440 l 14375 1501 l 14375 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 1440 m 14271 1320 l 14375 1381 l 14375 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 1320 m 14271 1200 l 14375 1261 l 14375 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 1200 m 14271 1080 l 14375 1141 l 14375 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 1080 m 14271 960 l 14375 1021 l 14375 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 960 m 14271 840 l 14375 901 l 14375 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 840 m 14271 720 l 14375 781 l 14375 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 720 m 14271 600 l 14375 661 l 14375 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 600 m 14271 480 l 14375 541 l 14375 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 2460 m 14375 2340 l 14479 2400 l 14479 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 2340 m 14375 2220 l 14479 2280 l 14479 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 2220 m 14375 2100 l 14479 2160 l 14479 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 2100 m 14375 1980 l 14479 2040 l 14479 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 1980 m 14375 1860 l 14479 1920 l 14479 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 1860 m 14375 1740 l 14479 1801 l 14479 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 1740 m 14375 1620 l 14479 1681 l 14479 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 1620 m 14375 1500 l 14479 1561 l 14479 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 1500 m 14375 1380 l 14479 1441 l 14479 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 1380 m 14375 1260 l 14479 1321 l 14479 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 1260 m 14375 1140 l 14479 1201 l 14479 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 1140 m 14375 1020 l 14479 1081 l 14479 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 1020 m 14375 900 l 14479 961 l 14479 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 900 m 14375 780 l 14479 841 l 14479 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 780 m 14375 660 l 14479 721 l 14479 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 660 m 14375 540 l 14479 601 l 14479 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 2520 m 14479 2400 l 14583 2460 l 14583 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 2400 m 14479 2280 l 14583 2340 l 14583 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 2280 m 14479 2160 l 14583 2220 l 14583 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 2160 m 14479 2040 l 14583 2100 l 14583 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 2040 m 14479 1920 l 14583 1980 l 14583 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 1920 m 14479 1800 l 14583 1861 l 14583 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 1800 m 14479 1680 l 14583 1741 l 14583 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 1680 m 14479 1560 l 14583 1621 l 14583 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 1560 m 14479 1440 l 14583 1501 l 14583 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 1440 m 14479 1320 l 14583 1381 l 14583 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 1320 m 14479 1200 l 14583 1261 l 14583 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 1200 m 14479 1080 l 14583 1141 l 14583 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 1080 m 14479 960 l 14583 1021 l 14583 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 960 m 14479 840 l 14583 901 l 14583 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 840 m 14479 720 l 14583 781 l 14583 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 720 m 14479 600 l 14583 661 l 14583 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 2580 m 14583 2460 l 14687 2520 l 14687 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 2460 m 14583 2340 l 14687 2400 l 14687 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 2340 m 14583 2220 l 14687 2280 l 14687 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 2220 m 14583 2100 l 14687 2160 l 14687 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 2100 m 14583 1980 l 14687 2040 l 14687 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 1980 m 14583 1860 l 14687 1920 l 14687 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 1860 m 14583 1740 l 14687 1801 l 14687 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 1740 m 14583 1620 l 14687 1681 l 14687 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 1620 m 14583 1500 l 14687 1561 l 14687 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 1500 m 14583 1380 l 14687 1441 l 14687 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 1380 m 14583 1260 l 14687 1321 l 14687 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 1260 m 14583 1140 l 14687 1201 l 14687 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 1140 m 14583 1020 l 14687 1081 l 14687 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 1020 m 14583 900 l 14687 961 l 14687 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 900 m 14583 780 l 14687 841 l 14687 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 780 m 14583 660 l 14687 721 l 14687 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 2640 m 14687 2520 l 14790 2580 l 14790 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 2520 m 14687 2400 l 14790 2460 l 14790 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 2400 m 14687 2280 l 14790 2340 l 14790 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 2280 m 14687 2160 l 14790 2220 l 14790 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 2160 m 14687 2040 l 14790 2100 l 14790 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 2040 m 14687 1920 l 14790 1980 l 14790 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 1920 m 14687 1800 l 14790 1861 l 14790 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 1800 m 14687 1680 l 14790 1741 l 14790 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 1680 m 14687 1560 l 14790 1621 l 14790 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 1560 m 14687 1440 l 14790 1501 l 14790 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 1440 m 14687 1320 l 14790 1381 l 14790 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 1320 m 14687 1200 l 14790 1261 l 14790 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 1200 m 14687 1080 l 14790 1141 l 14790 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 1080 m 14687 960 l 14790 1021 l 14790 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 960 m 14687 840 l 14790 901 l 14790 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 840 m 14687 720 l 14790 781 l 14790 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 2700 m 14790 2580 l 14894 2640 l 14894 2760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 2580 m 14790 2460 l 14894 2520 l 14894 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 2460 m 14790 2340 l 14894 2400 l 14894 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 2340 m 14790 2220 l 14894 2280 l 14894 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 2220 m 14790 2100 l 14894 2160 l 14894 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 2100 m 14790 1980 l 14894 2040 l 14894 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 1980 m 14790 1860 l 14894 1920 l 14894 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 1860 m 14790 1740 l 14894 1801 l 14894 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 1740 m 14790 1620 l 14894 1681 l 14894 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 1620 m 14790 1500 l 14894 1561 l 14894 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 1500 m 14790 1380 l 14894 1441 l 14894 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 1380 m 14790 1260 l 14894 1321 l 14894 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 1260 m 14790 1140 l 14894 1201 l 14894 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 1140 m 14790 1020 l 14894 1081 l 14894 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 1020 m 14790 900 l 14894 961 l 14894 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 900 m 14790 780 l 14894 841 l 14894 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 2760 m 14894 2640 l 14998 2700 l 14998 2820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 2640 m 14894 2520 l 14998 2580 l 14998 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 2520 m 14894 2400 l 14998 2460 l 14998 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 2400 m 14894 2280 l 14998 2340 l 14998 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 2280 m 14894 2160 l 14998 2220 l 14998 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 2160 m 14894 2040 l 14998 2100 l 14998 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 2040 m 14894 1920 l 14998 1980 l 14998 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 1920 m 14894 1800 l 14998 1861 l 14998 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 1800 m 14894 1680 l 14998 1741 l 14998 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 1680 m 14894 1560 l 14998 1621 l 14998 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 1560 m 14894 1440 l 14998 1501 l 14998 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 1440 m 14894 1320 l 14998 1381 l 14998 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 1320 m 14894 1200 l 14998 1261 l 14998 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 1200 m 14894 1080 l 14998 1141 l 14998 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 1080 m 14894 960 l 14998 1021 l 14998 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 960 m 14894 840 l 14998 901 l 14998 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 2820 m 14998 2700 l 15102 2760 l 15102 2880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 2700 m 14998 2580 l 15102 2640 l 15102 2760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 2580 m 14998 2460 l 15102 2520 l 15102 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 2460 m 14998 2340 l 15102 2400 l 15102 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 2340 m 14998 2220 l 15102 2280 l 15102 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 2220 m 14998 2100 l 15102 2160 l 15102 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 2100 m 14998 1980 l 15102 2040 l 15102 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 1980 m 14998 1860 l 15102 1920 l 15102 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 1860 m 14998 1740 l 15102 1801 l 15102 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 1740 m 14998 1620 l 15102 1681 l 15102 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 1620 m 14998 1500 l 15102 1561 l 15102 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 1500 m 14998 1380 l 15102 1441 l 15102 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 1380 m 14998 1260 l 15102 1321 l 15102 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 1260 m 14998 1140 l 15102 1201 l 15102 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 1140 m 14998 1020 l 15102 1081 l 15102 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 1020 m 14998 900 l 15102 961 l 15102 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 1680 m 13543 1741 l 13440 1800 l 13337 1740 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13337 1740 m 13440 1801 l 13337 1860 l 13233 1800 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13233 1920 m 13337 1980 l 13233 2039 l 13129 1979 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13129 1980 m 13233 2040 l 13129 2099 l 13025 2039 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13025 2040 m 13129 2100 l 13025 2159 l 12921 2099 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 12921 2100 m 13025 2160 l 12921 2219 l 12817 2159 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 12817 2280 m 12921 2340 l 12817 2399 l 12713 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 2340 m 12817 2400 l 12713 2459 l 12609 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 2400 m 12713 2460 l 12609 2519 l 12505 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 2460 m 12609 2520 l 12505 2579 l 12401 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 2520 m 12505 2580 l 12401 2639 l 12297 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 2580 m 12401 2640 l 12297 2699 l 12193 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 2640 m 12297 2700 l 12193 2759 l 12090 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 2700 m 12193 2760 l 12090 2819 l 11986 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 2760 m 12090 2820 l 11986 2879 l 11882 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 2820 m 11986 2880 l 11882 2939 l 11778 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 1740 m 13647 1801 l 13543 1860 l 13440 1800 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13440 1800 m 13543 1861 l 13440 1920 l 13337 1860 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13337 1980 m 13440 2040 l 13337 2099 l 13233 2039 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13233 2040 m 13337 2100 l 13233 2159 l 13129 2099 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13129 2220 m 13233 2280 l 13129 2339 l 13025 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 2280 m 13129 2340 l 13025 2399 l 12921 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 2340 m 13025 2400 l 12921 2459 l 12817 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 2400 m 12921 2460 l 12817 2519 l 12713 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 2460 m 12817 2520 l 12713 2579 l 12609 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 2520 m 12713 2580 l 12609 2639 l 12505 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 2580 m 12609 2640 l 12505 2699 l 12401 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 2640 m 12505 2700 l 12401 2759 l 12297 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 2700 m 12401 2760 l 12297 2819 l 12193 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 2760 m 12297 2820 l 12193 2879 l 12090 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 2820 m 12193 2880 l 12090 2939 l 11986 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 2880 m 12090 2940 l 11986 2999 l 11882 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 1920 m 13751 1980 l 13647 2039 l 13543 1979 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13543 2100 m 13647 2160 l 13543 2219 l 13440 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 2160 m 13543 2220 l 13440 2279 l 13337 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 2220 m 13440 2280 l 13337 2339 l 13233 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 2280 m 13337 2340 l 13233 2399 l 13129 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 2340 m 13233 2400 l 13129 2459 l 13025 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 2400 m 13129 2460 l 13025 2519 l 12921 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 2460 m 13025 2520 l 12921 2579 l 12817 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 2520 m 12921 2580 l 12817 2639 l 12713 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 2580 m 12817 2640 l 12713 2699 l 12609 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 2640 m 12713 2700 l 12609 2759 l 12505 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 2700 m 12609 2760 l 12505 2819 l 12401 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 2760 m 12505 2820 l 12401 2879 l 12297 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 2820 m 12401 2880 l 12297 2939 l 12193 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 2880 m 12297 2940 l 12193 2999 l 12090 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 2940 m 12193 3000 l 12090 3059 l 11986 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 2100 m 13855 2160 l 13751 2219 l 13647 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 2160 m 13751 2220 l 13647 2279 l 13543 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 2220 m 13647 2280 l 13543 2339 l 13440 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 2280 m 13543 2340 l 13440 2399 l 13337 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 2340 m 13440 2400 l 13337 2459 l 13233 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 2400 m 13337 2460 l 13233 2519 l 13129 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 2460 m 13233 2520 l 13129 2579 l 13025 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 2520 m 13129 2580 l 13025 2639 l 12921 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 2580 m 13025 2640 l 12921 2699 l 12817 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 2640 m 12921 2700 l 12817 2759 l 12713 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 2700 m 12817 2760 l 12713 2819 l 12609 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 2760 m 12713 2820 l 12609 2879 l 12505 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 2820 m 12609 2880 l 12505 2939 l 12401 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 2880 m 12505 2940 l 12401 2999 l 12297 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 2940 m 12401 3000 l 12297 3059 l 12193 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 3000 m 12297 3060 l 12193 3119 l 12090 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 2160 m 13959 2220 l 13855 2279 l 13751 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 2220 m 13855 2280 l 13751 2339 l 13647 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 2280 m 13751 2340 l 13647 2399 l 13543 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 2340 m 13647 2400 l 13543 2459 l 13440 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 2400 m 13543 2460 l 13440 2519 l 13337 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 2460 m 13440 2520 l 13337 2579 l 13233 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 2520 m 13337 2580 l 13233 2639 l 13129 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 2580 m 13233 2640 l 13129 2699 l 13025 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 2640 m 13129 2700 l 13025 2759 l 12921 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 2700 m 13025 2760 l 12921 2819 l 12817 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 2760 m 12921 2820 l 12817 2879 l 12713 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 2820 m 12817 2880 l 12713 2939 l 12609 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 2880 m 12713 2940 l 12609 2999 l 12505 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 2940 m 12609 3000 l 12505 3059 l 12401 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 3000 m 12505 3060 l 12401 3119 l 12297 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 3060 m 12401 3120 l 12297 3179 l 12193 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 2220 m 14063 2280 l 13959 2339 l 13855 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 2280 m 13959 2340 l 13855 2399 l 13751 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 2340 m 13855 2400 l 13751 2459 l 13647 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 2400 m 13751 2460 l 13647 2519 l 13543 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 2460 m 13647 2520 l 13543 2579 l 13440 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 2520 m 13543 2580 l 13440 2639 l 13337 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 2580 m 13440 2640 l 13337 2699 l 13233 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 2640 m 13337 2700 l 13233 2759 l 13129 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 2700 m 13233 2760 l 13129 2819 l 13025 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 2760 m 13129 2820 l 13025 2879 l 12921 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 2820 m 13025 2880 l 12921 2939 l 12817 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 2880 m 12921 2940 l 12817 2999 l 12713 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 2940 m 12817 3000 l 12713 3059 l 12609 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 3000 m 12713 3060 l 12609 3119 l 12505 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 3060 m 12609 3120 l 12505 3179 l 12401 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 3120 m 12505 3180 l 12401 3239 l 12297 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 2280 m 14167 2340 l 14063 2399 l 13959 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 2340 m 14063 2400 l 13959 2459 l 13855 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 2400 m 13959 2460 l 13855 2519 l 13751 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 2460 m 13855 2520 l 13751 2579 l 13647 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 2520 m 13751 2580 l 13647 2639 l 13543 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 2580 m 13647 2640 l 13543 2699 l 13440 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 2640 m 13543 2700 l 13440 2759 l 13337 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 2700 m 13440 2760 l 13337 2819 l 13233 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 2760 m 13337 2820 l 13233 2879 l 13129 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 2820 m 13233 2880 l 13129 2939 l 13025 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 2880 m 13129 2940 l 13025 2999 l 12921 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 2940 m 13025 3000 l 12921 3059 l 12817 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 3000 m 12921 3060 l 12817 3119 l 12713 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 3060 m 12817 3120 l 12713 3179 l 12609 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 3120 m 12713 3180 l 12609 3239 l 12505 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 3180 m 12609 3240 l 12505 3299 l 12401 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 2340 m 14271 2400 l 14167 2459 l 14063 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 2400 m 14167 2460 l 14063 2519 l 13959 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 2460 m 14063 2520 l 13959 2579 l 13855 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 2520 m 13959 2580 l 13855 2639 l 13751 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 2580 m 13855 2640 l 13751 2699 l 13647 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 2640 m 13751 2700 l 13647 2759 l 13543 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 2700 m 13647 2760 l 13543 2819 l 13440 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 2760 m 13543 2820 l 13440 2879 l 13337 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 2820 m 13440 2880 l 13337 2939 l 13233 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 2880 m 13337 2940 l 13233 2999 l 13129 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 2940 m 13233 3000 l 13129 3059 l 13025 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 3000 m 13129 3060 l 13025 3119 l 12921 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 3060 m 13025 3120 l 12921 3179 l 12817 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 3120 m 12921 3180 l 12817 3239 l 12713 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 3180 m 12817 3240 l 12713 3299 l 12609 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 3240 m 12713 3300 l 12609 3359 l 12505 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 2400 m 14375 2460 l 14271 2519 l 14167 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 2460 m 14271 2520 l 14167 2579 l 14063 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 2520 m 14167 2580 l 14063 2639 l 13959 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 2580 m 14063 2640 l 13959 2699 l 13855 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 2640 m 13959 2700 l 13855 2759 l 13751 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 2700 m 13855 2760 l 13751 2819 l 13647 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 2760 m 13751 2820 l 13647 2879 l 13543 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 2820 m 13647 2880 l 13543 2939 l 13440 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 2880 m 13543 2940 l 13440 2999 l 13337 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 2940 m 13440 3000 l 13337 3059 l 13233 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 3000 m 13337 3060 l 13233 3119 l 13129 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 3060 m 13233 3120 l 13129 3179 l 13025 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 3120 m 13129 3180 l 13025 3239 l 12921 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 3180 m 13025 3240 l 12921 3299 l 12817 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 3240 m 12921 3300 l 12817 3359 l 12713 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 3300 m 12817 3360 l 12713 3419 l 12609 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 2460 m 14479 2520 l 14375 2579 l 14271 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 2520 m 14375 2580 l 14271 2639 l 14167 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 2580 m 14271 2640 l 14167 2699 l 14063 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 2640 m 14167 2700 l 14063 2759 l 13959 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 2700 m 14063 2760 l 13959 2819 l 13855 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 2760 m 13959 2820 l 13855 2879 l 13751 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 2820 m 13855 2880 l 13751 2939 l 13647 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 2880 m 13751 2940 l 13647 2999 l 13543 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 2940 m 13647 3000 l 13543 3059 l 13440 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 3000 m 13543 3060 l 13440 3119 l 13337 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 3060 m 13440 3120 l 13337 3179 l 13233 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 3120 m 13337 3180 l 13233 3239 l 13129 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 3180 m 13233 3240 l 13129 3299 l 13025 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 3240 m 13129 3300 l 13025 3359 l 12921 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 3300 m 13025 3360 l 12921 3419 l 12817 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 3360 m 12921 3420 l 12817 3479 l 12713 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 2520 m 14583 2580 l 14479 2639 l 14375 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 2580 m 14479 2640 l 14375 2699 l 14271 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 2640 m 14375 2700 l 14271 2759 l 14167 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 2700 m 14271 2760 l 14167 2819 l 14063 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 2760 m 14167 2820 l 14063 2879 l 13959 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 2820 m 14063 2880 l 13959 2939 l 13855 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 2880 m 13959 2940 l 13855 2999 l 13751 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 2940 m 13855 3000 l 13751 3059 l 13647 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 3000 m 13751 3060 l 13647 3119 l 13543 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 3060 m 13647 3120 l 13543 3179 l 13440 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 3120 m 13543 3180 l 13440 3239 l 13337 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 3180 m 13440 3240 l 13337 3299 l 13233 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 3240 m 13337 3300 l 13233 3359 l 13129 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 3300 m 13233 3360 l 13129 3419 l 13025 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 3360 m 13129 3420 l 13025 3479 l 12921 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 3420 m 13025 3480 l 12921 3539 l 12817 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 2580 m 14687 2640 l 14583 2699 l 14479 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 2640 m 14583 2700 l 14479 2759 l 14375 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 2700 m 14479 2760 l 14375 2819 l 14271 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 2760 m 14375 2820 l 14271 2879 l 14167 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 2820 m 14271 2880 l 14167 2939 l 14063 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 2880 m 14167 2940 l 14063 2999 l 13959 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 2940 m 14063 3000 l 13959 3059 l 13855 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 3000 m 13959 3060 l 13855 3119 l 13751 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 3060 m 13855 3120 l 13751 3179 l 13647 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 3120 m 13751 3180 l 13647 3239 l 13543 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 3180 m 13647 3240 l 13543 3299 l 13440 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 3240 m 13543 3300 l 13440 3359 l 13337 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 3300 m 13440 3360 l 13337 3419 l 13233 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 3360 m 13337 3420 l 13233 3479 l 13129 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 3420 m 13233 3480 l 13129 3539 l 13025 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 3480 m 13129 3540 l 13025 3599 l 12921 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 2640 m 14790 2700 l 14687 2759 l 14583 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 2700 m 14687 2760 l 14583 2819 l 14479 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 2760 m 14583 2820 l 14479 2879 l 14375 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 2820 m 14479 2880 l 14375 2939 l 14271 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 2880 m 14375 2940 l 14271 2999 l 14167 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 2940 m 14271 3000 l 14167 3059 l 14063 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 3000 m 14167 3060 l 14063 3119 l 13959 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 3060 m 14063 3120 l 13959 3179 l 13855 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 3120 m 13959 3180 l 13855 3239 l 13751 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 3180 m 13855 3240 l 13751 3299 l 13647 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 3240 m 13751 3300 l 13647 3359 l 13543 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 3300 m 13647 3360 l 13543 3419 l 13440 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 3360 m 13543 3420 l 13440 3479 l 13337 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 3420 m 13440 3480 l 13337 3539 l 13233 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 3480 m 13337 3540 l 13233 3599 l 13129 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 3540 m 13233 3600 l 13129 3659 l 13025 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 2700 m 14894 2760 l 14790 2819 l 14687 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 2760 m 14790 2820 l 14687 2879 l 14583 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 2820 m 14687 2880 l 14583 2939 l 14479 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 2880 m 14583 2940 l 14479 2999 l 14375 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 2940 m 14479 3000 l 14375 3059 l 14271 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 3000 m 14375 3060 l 14271 3119 l 14167 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 3060 m 14271 3120 l 14167 3179 l 14063 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 3120 m 14167 3180 l 14063 3239 l 13959 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 3180 m 14063 3240 l 13959 3299 l 13855 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 3240 m 13959 3300 l 13855 3359 l 13751 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 3300 m 13855 3360 l 13751 3419 l 13647 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 3360 m 13751 3420 l 13647 3479 l 13543 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 3420 m 13647 3480 l 13543 3539 l 13440 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 3480 m 13543 3540 l 13440 3599 l 13337 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 3540 m 13440 3600 l 13337 3659 l 13233 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 3600 m 13337 3660 l 13233 3719 l 13129 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 2760 m 14998 2820 l 14894 2879 l 14790 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 2820 m 14894 2880 l 14790 2939 l 14687 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 2880 m 14790 2940 l 14687 2999 l 14583 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 2940 m 14687 3000 l 14583 3059 l 14479 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 3000 m 14583 3060 l 14479 3119 l 14375 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 3060 m 14479 3120 l 14375 3179 l 14271 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 3120 m 14375 3180 l 14271 3239 l 14167 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 3180 m 14271 3240 l 14167 3299 l 14063 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 3240 m 14167 3300 l 14063 3359 l 13959 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 3300 m 14063 3360 l 13959 3419 l 13855 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 3360 m 13959 3420 l 13855 3479 l 13751 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 3420 m 13855 3480 l 13751 3539 l 13647 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 3480 m 13751 3540 l 13647 3599 l 13543 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 3540 m 13647 3600 l 13543 3659 l 13440 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 3600 m 13543 3660 l 13440 3719 l 13337 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 3660 m 13440 3720 l 13337 3779 l 13233 3719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 2820 m 15102 2880 l 14998 2939 l 14894 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 2880 m 14998 2940 l 14894 2999 l 14790 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 2940 m 14894 3000 l 14790 3059 l 14687 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 3000 m 14790 3060 l 14687 3119 l 14583 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 3060 m 14687 3120 l 14583 3179 l 14479 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 3120 m 14583 3180 l 14479 3239 l 14375 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 3180 m 14479 3240 l 14375 3299 l 14271 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 3240 m 14375 3300 l 14271 3359 l 14167 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 3300 m 14271 3360 l 14167 3419 l 14063 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 3360 m 14167 3420 l 14063 3479 l 13959 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 3420 m 14063 3480 l 13959 3539 l 13855 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 3480 m 13959 3540 l 13855 3599 l 13751 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 3540 m 13855 3600 l 13751 3659 l 13647 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 3600 m 13751 3660 l 13647 3719 l 13543 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 3660 m 13647 3720 l 13543 3779 l 13440 3719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 3720 m 13543 3780 l 13440 3839 l 13337 3779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 1980 m 17280 2039 l 17280 1920 l 17383 1861 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 1860 m 17280 1920 l 17280 1800 l 17383 1741 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 1740 m 17280 1800 l 17280 1680 l 17383 1621 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 1620 m 17280 1680 l 17280 1560 l 17383 1501 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 1500 m 17280 1560 l 17280 1440 l 17383 1381 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17280 1320 m 17177 1380 l 17177 1260 l 17280 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 1200 m 17177 1260 l 17177 1140 l 17280 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 1080 m 17177 1140 l 17177 1020 l 17280 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 960 m 17177 1020 l 17177 900 l 17280 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 840 m 17177 900 l 17177 780 l 17280 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 720 m 17177 780 l 17177 660 l 17280 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 600 m 17177 660 l 17177 540 l 17280 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 480 m 17177 540 l 17177 420 l 17280 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 360 m 17177 420 l 17177 300 l 17280 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 240 m 17177 300 l 17177 180 l 17280 121 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 120 m 17177 180 l 17177 60 l 17280 1 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 2040 m 17177 2099 l 17177 1979 l 17280 1920 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17280 1920 m 17177 1979 l 17177 1860 l 17280 1801 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17280 1800 m 17177 1860 l 17177 1740 l 17280 1681 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17280 1680 m 17177 1740 l 17177 1620 l 17280 1561 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17177 1500 m 17073 1560 l 17073 1440 l 17177 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 1380 m 17073 1440 l 17073 1320 l 17177 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 1260 m 17073 1320 l 17073 1200 l 17177 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 1140 m 17073 1200 l 17073 1080 l 17177 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 1020 m 17073 1080 l 17073 960 l 17177 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 900 m 17073 960 l 17073 840 l 17177 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 780 m 17073 840 l 17073 720 l 17177 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 660 m 17073 720 l 17073 600 l 17177 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 540 m 17073 600 l 17073 480 l 17177 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 420 m 17073 480 l 17073 360 l 17177 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 300 m 17073 360 l 17073 240 l 17177 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 180 m 17073 240 l 17073 120 l 17177 61 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 2100 m 17073 2159 l 17073 2039 l 17177 1980 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17177 1980 m 17073 2039 l 17073 1920 l 17177 1861 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17177 1860 m 17073 1920 l 17073 1800 l 17177 1741 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17073 1680 m 16969 1740 l 16969 1620 l 17073 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 1560 m 16969 1620 l 16969 1500 l 17073 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 1440 m 16969 1500 l 16969 1380 l 17073 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 1320 m 16969 1380 l 16969 1260 l 17073 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 1200 m 16969 1260 l 16969 1140 l 17073 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 1080 m 16969 1140 l 16969 1020 l 17073 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 960 m 16969 1020 l 16969 900 l 17073 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 840 m 16969 900 l 16969 780 l 17073 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 720 m 16969 780 l 16969 660 l 17073 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 600 m 16969 660 l 16969 540 l 17073 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 480 m 16969 540 l 16969 420 l 17073 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 360 m 16969 420 l 16969 300 l 17073 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 240 m 16969 300 l 16969 180 l 17073 121 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 2160 m 16969 2219 l 16969 2099 l 17073 2040 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17073 2040 m 16969 2099 l 16969 1979 l 17073 1920 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17073 1920 m 16969 1979 l 16969 1860 l 17073 1801 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 16969 1740 m 16865 1800 l 16865 1680 l 16969 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 1620 m 16865 1680 l 16865 1560 l 16969 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 1500 m 16865 1560 l 16865 1440 l 16969 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 1380 m 16865 1440 l 16865 1320 l 16969 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 1260 m 16865 1320 l 16865 1200 l 16969 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 1140 m 16865 1200 l 16865 1080 l 16969 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 1020 m 16865 1080 l 16865 960 l 16969 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 900 m 16865 960 l 16865 840 l 16969 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 780 m 16865 840 l 16865 720 l 16969 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 660 m 16865 720 l 16865 600 l 16969 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 540 m 16865 600 l 16865 480 l 16969 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 420 m 16865 480 l 16865 360 l 16969 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 300 m 16865 360 l 16865 240 l 16969 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 2160 m 16761 2219 l 16761 2099 l 16865 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 2040 m 16761 2099 l 16761 1979 l 16865 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 1920 m 16761 1979 l 16761 1860 l 16865 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 1800 m 16761 1860 l 16761 1740 l 16865 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 1680 m 16761 1740 l 16761 1620 l 16865 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 1560 m 16761 1620 l 16761 1500 l 16865 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 1440 m 16761 1500 l 16761 1380 l 16865 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 1320 m 16761 1380 l 16761 1260 l 16865 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 1200 m 16761 1260 l 16761 1140 l 16865 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 1080 m 16761 1140 l 16761 1020 l 16865 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 960 m 16761 1020 l 16761 900 l 16865 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 840 m 16761 900 l 16761 780 l 16865 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 720 m 16761 780 l 16761 660 l 16865 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 600 m 16761 660 l 16761 540 l 16865 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 480 m 16761 540 l 16761 420 l 16865 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 360 m 16761 420 l 16761 300 l 16865 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 2220 m 16657 2279 l 16657 2159 l 16761 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 2100 m 16657 2159 l 16657 2039 l 16761 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 1980 m 16657 2039 l 16657 1920 l 16761 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 1860 m 16657 1920 l 16657 1800 l 16761 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 1740 m 16657 1800 l 16657 1680 l 16761 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 1620 m 16657 1680 l 16657 1560 l 16761 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 1500 m 16657 1560 l 16657 1440 l 16761 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 1380 m 16657 1440 l 16657 1320 l 16761 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 1260 m 16657 1320 l 16657 1200 l 16761 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 1140 m 16657 1200 l 16657 1080 l 16761 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 1020 m 16657 1080 l 16657 960 l 16761 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 900 m 16657 960 l 16657 840 l 16761 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 780 m 16657 840 l 16657 720 l 16761 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 660 m 16657 720 l 16657 600 l 16761 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 540 m 16657 600 l 16657 480 l 16761 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 420 m 16657 480 l 16657 360 l 16761 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 2280 m 16553 2339 l 16553 2219 l 16657 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 2160 m 16553 2219 l 16553 2099 l 16657 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 2040 m 16553 2099 l 16553 1979 l 16657 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 1920 m 16553 1979 l 16553 1860 l 16657 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 1800 m 16553 1860 l 16553 1740 l 16657 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 1680 m 16553 1740 l 16553 1620 l 16657 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 1560 m 16553 1620 l 16553 1500 l 16657 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 1440 m 16553 1500 l 16553 1380 l 16657 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 1320 m 16553 1380 l 16553 1260 l 16657 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 1200 m 16553 1260 l 16553 1140 l 16657 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 1080 m 16553 1140 l 16553 1020 l 16657 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 960 m 16553 1020 l 16553 900 l 16657 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 840 m 16553 900 l 16553 780 l 16657 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 720 m 16553 780 l 16553 660 l 16657 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 600 m 16553 660 l 16553 540 l 16657 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 480 m 16553 540 l 16553 420 l 16657 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 2340 m 16449 2399 l 16449 2279 l 16553 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 2220 m 16449 2279 l 16449 2159 l 16553 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 2100 m 16449 2159 l 16449 2039 l 16553 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 1980 m 16449 2039 l 16449 1920 l 16553 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 1860 m 16449 1920 l 16449 1800 l 16553 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 1740 m 16449 1800 l 16449 1680 l 16553 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 1620 m 16449 1680 l 16449 1560 l 16553 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 1500 m 16449 1560 l 16449 1440 l 16553 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 1380 m 16449 1440 l 16449 1320 l 16553 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 1260 m 16449 1320 l 16449 1200 l 16553 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 1140 m 16449 1200 l 16449 1080 l 16553 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 1020 m 16449 1080 l 16449 960 l 16553 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 900 m 16449 960 l 16449 840 l 16553 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 780 m 16449 840 l 16449 720 l 16553 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 660 m 16449 720 l 16449 600 l 16553 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 540 m 16449 600 l 16449 480 l 16553 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 2400 m 16345 2459 l 16345 2339 l 16449 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 2280 m 16345 2339 l 16345 2219 l 16449 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 2160 m 16345 2219 l 16345 2099 l 16449 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 2040 m 16345 2099 l 16345 1979 l 16449 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 1920 m 16345 1979 l 16345 1860 l 16449 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 1800 m 16345 1860 l 16345 1740 l 16449 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 1680 m 16345 1740 l 16345 1620 l 16449 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 1560 m 16345 1620 l 16345 1500 l 16449 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 1440 m 16345 1500 l 16345 1380 l 16449 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 1320 m 16345 1380 l 16345 1260 l 16449 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 1200 m 16345 1260 l 16345 1140 l 16449 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 1080 m 16345 1140 l 16345 1020 l 16449 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 960 m 16345 1020 l 16345 900 l 16449 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 840 m 16345 900 l 16345 780 l 16449 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 720 m 16345 780 l 16345 660 l 16449 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 600 m 16345 660 l 16345 540 l 16449 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 2460 m 16241 2519 l 16241 2399 l 16345 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 2340 m 16241 2399 l 16241 2279 l 16345 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 2220 m 16241 2279 l 16241 2159 l 16345 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 2100 m 16241 2159 l 16241 2039 l 16345 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 1980 m 16241 2039 l 16241 1920 l 16345 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 1860 m 16241 1920 l 16241 1800 l 16345 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 1740 m 16241 1800 l 16241 1680 l 16345 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 1620 m 16241 1680 l 16241 1560 l 16345 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 1500 m 16241 1560 l 16241 1440 l 16345 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 1380 m 16241 1440 l 16241 1320 l 16345 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 1260 m 16241 1320 l 16241 1200 l 16345 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 1140 m 16241 1200 l 16241 1080 l 16345 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 1020 m 16241 1080 l 16241 960 l 16345 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 900 m 16241 960 l 16241 840 l 16345 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 780 m 16241 840 l 16241 720 l 16345 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 660 m 16241 720 l 16241 600 l 16345 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 2520 m 16137 2579 l 16137 2459 l 16241 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 2400 m 16137 2459 l 16137 2339 l 16241 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 2280 m 16137 2339 l 16137 2219 l 16241 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 2160 m 16137 2219 l 16137 2099 l 16241 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 2040 m 16137 2099 l 16137 1979 l 16241 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 1920 m 16137 1979 l 16137 1860 l 16241 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 1800 m 16137 1860 l 16137 1740 l 16241 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 1680 m 16137 1740 l 16137 1620 l 16241 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 1560 m 16137 1620 l 16137 1500 l 16241 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 1440 m 16137 1500 l 16137 1380 l 16241 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 1320 m 16137 1380 l 16137 1260 l 16241 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 1200 m 16137 1260 l 16137 1140 l 16241 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 1080 m 16137 1140 l 16137 1020 l 16241 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 960 m 16137 1020 l 16137 900 l 16241 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 840 m 16137 900 l 16137 780 l 16241 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 720 m 16137 780 l 16137 660 l 16241 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 2580 m 16033 2639 l 16033 2519 l 16137 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 2460 m 16033 2519 l 16033 2399 l 16137 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 2340 m 16033 2399 l 16033 2279 l 16137 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 2220 m 16033 2279 l 16033 2159 l 16137 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 2100 m 16033 2159 l 16033 2039 l 16137 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 1980 m 16033 2039 l 16033 1920 l 16137 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 1860 m 16033 1920 l 16033 1800 l 16137 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 1740 m 16033 1800 l 16033 1680 l 16137 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 1620 m 16033 1680 l 16033 1560 l 16137 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 1500 m 16033 1560 l 16033 1440 l 16137 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 1380 m 16033 1440 l 16033 1320 l 16137 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 1260 m 16033 1320 l 16033 1200 l 16137 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 1140 m 16033 1200 l 16033 1080 l 16137 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 1020 m 16033 1080 l 16033 960 l 16137 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 900 m 16033 960 l 16033 840 l 16137 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 780 m 16033 840 l 16033 720 l 16137 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 2640 m 15930 2699 l 15930 2579 l 16033 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 2520 m 15930 2579 l 15930 2459 l 16033 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 2400 m 15930 2459 l 15930 2339 l 16033 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 2280 m 15930 2339 l 15930 2219 l 16033 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 2160 m 15930 2219 l 15930 2099 l 16033 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 2040 m 15930 2099 l 15930 1979 l 16033 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 1920 m 15930 1979 l 15930 1860 l 16033 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 1800 m 15930 1860 l 15930 1740 l 16033 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 1680 m 15930 1740 l 15930 1620 l 16033 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 1560 m 15930 1620 l 15930 1500 l 16033 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 1440 m 15930 1500 l 15930 1380 l 16033 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 1320 m 15930 1380 l 15930 1260 l 16033 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 1200 m 15930 1260 l 15930 1140 l 16033 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 1080 m 15930 1140 l 15930 1020 l 16033 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 960 m 15930 1020 l 15930 900 l 16033 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 840 m 15930 900 l 15930 780 l 16033 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 2700 m 15826 2759 l 15826 2639 l 15930 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 2580 m 15826 2639 l 15826 2519 l 15930 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 2460 m 15826 2519 l 15826 2399 l 15930 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 2340 m 15826 2399 l 15826 2279 l 15930 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 2220 m 15826 2279 l 15826 2159 l 15930 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 2100 m 15826 2159 l 15826 2039 l 15930 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 1980 m 15826 2039 l 15826 1920 l 15930 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 1860 m 15826 1920 l 15826 1800 l 15930 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 1740 m 15826 1800 l 15826 1680 l 15930 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 1620 m 15826 1680 l 15826 1560 l 15930 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 1500 m 15826 1560 l 15826 1440 l 15930 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 1380 m 15826 1440 l 15826 1320 l 15930 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 1260 m 15826 1320 l 15826 1200 l 15930 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 1140 m 15826 1200 l 15826 1080 l 15930 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 1020 m 15826 1080 l 15826 960 l 15930 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 900 m 15826 960 l 15826 840 l 15930 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 2760 m 15722 2819 l 15722 2699 l 15826 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 2640 m 15722 2699 l 15722 2579 l 15826 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 2520 m 15722 2579 l 15722 2459 l 15826 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 2400 m 15722 2459 l 15722 2339 l 15826 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 2280 m 15722 2339 l 15722 2219 l 15826 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 2160 m 15722 2219 l 15722 2099 l 15826 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 2040 m 15722 2099 l 15722 1979 l 15826 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 1920 m 15722 1979 l 15722 1860 l 15826 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 1800 m 15722 1860 l 15722 1740 l 15826 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 1680 m 15722 1740 l 15722 1620 l 15826 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 1560 m 15722 1620 l 15722 1500 l 15826 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 1440 m 15722 1500 l 15722 1380 l 15826 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 1320 m 15722 1380 l 15722 1260 l 15826 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 1200 m 15722 1260 l 15722 1140 l 15826 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 1080 m 15722 1140 l 15722 1020 l 15826 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 960 m 15722 1020 l 15722 900 l 15826 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 2820 m 15618 2879 l 15618 2759 l 15722 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 2700 m 15618 2759 l 15618 2639 l 15722 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 2580 m 15618 2639 l 15618 2519 l 15722 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 2460 m 15618 2519 l 15618 2399 l 15722 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 2340 m 15618 2399 l 15618 2279 l 15722 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 2220 m 15618 2279 l 15618 2159 l 15722 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 2100 m 15618 2159 l 15618 2039 l 15722 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 1980 m 15618 2039 l 15618 1920 l 15722 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 1860 m 15618 1920 l 15618 1800 l 15722 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 1740 m 15618 1800 l 15618 1680 l 15722 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 1620 m 15618 1680 l 15618 1560 l 15722 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 1500 m 15618 1560 l 15618 1440 l 15722 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 1380 m 15618 1440 l 15618 1320 l 15722 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 1260 m 15618 1320 l 15618 1200 l 15722 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 1140 m 15618 1200 l 15618 1080 l 15722 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 1020 m 15618 1080 l 15618 960 l 15722 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 2160 m 16865 2040 l 16969 2100 l 16969 2220 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 16865 2040 m 16865 1920 l 16969 1980 l 16969 2100 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 16865 1920 m 16865 1800 l 16969 1861 l 16969 1980 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17073 1680 m 17073 1560 l 17177 1621 l 17177 1741 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17177 1500 m 17177 1380 l 17280 1441 l 17280 1561 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17280 1320 m 17280 1200 l 17383 1261 l 17383 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 1200 m 17280 1080 l 17383 1141 l 17383 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 1080 m 17280 960 l 17383 1021 l 17383 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 960 m 17280 840 l 17383 901 l 17383 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 840 m 17280 720 l 17383 781 l 17383 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 720 m 17280 600 l 17383 661 l 17383 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 600 m 17280 480 l 17383 541 l 17383 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 480 m 17280 360 l 17383 421 l 17383 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 360 m 17280 240 l 17383 301 l 17383 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 240 m 17280 120 l 17383 181 l 17383 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 120 m 17280 0 l 17383 61 l 17383 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 1980 m 17383 1860 l 17487 1920 l 17487 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 1860 m 17383 1740 l 17487 1801 l 17487 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 1740 m 17383 1620 l 17487 1681 l 17487 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 1620 m 17383 1500 l 17487 1561 l 17487 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 1500 m 17383 1380 l 17487 1441 l 17487 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 1380 m 17383 1260 l 17487 1321 l 17487 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 1260 m 17383 1140 l 17487 1201 l 17487 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 1140 m 17383 1020 l 17487 1081 l 17487 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 1020 m 17383 900 l 17487 961 l 17487 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 900 m 17383 780 l 17487 841 l 17487 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 780 m 17383 660 l 17487 721 l 17487 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 660 m 17383 540 l 17487 601 l 17487 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 540 m 17383 420 l 17487 481 l 17487 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 420 m 17383 300 l 17487 361 l 17487 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 300 m 17383 180 l 17487 241 l 17487 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 180 m 17383 60 l 17487 121 l 17487 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 2040 m 17487 1920 l 17591 1980 l 17591 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 1920 m 17487 1800 l 17591 1861 l 17591 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 1800 m 17487 1680 l 17591 1741 l 17591 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 1680 m 17487 1560 l 17591 1621 l 17591 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 1560 m 17487 1440 l 17591 1501 l 17591 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 1440 m 17487 1320 l 17591 1381 l 17591 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 1320 m 17487 1200 l 17591 1261 l 17591 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 1200 m 17487 1080 l 17591 1141 l 17591 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 1080 m 17487 960 l 17591 1021 l 17591 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 960 m 17487 840 l 17591 901 l 17591 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 840 m 17487 720 l 17591 781 l 17591 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 720 m 17487 600 l 17591 661 l 17591 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 600 m 17487 480 l 17591 541 l 17591 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 480 m 17487 360 l 17591 421 l 17591 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 360 m 17487 240 l 17591 301 l 17591 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 240 m 17487 120 l 17591 181 l 17591 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 2100 m 17591 1980 l 17695 2040 l 17695 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 1980 m 17591 1860 l 17695 1920 l 17695 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 1860 m 17591 1740 l 17695 1801 l 17695 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 1740 m 17591 1620 l 17695 1681 l 17695 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 1620 m 17591 1500 l 17695 1561 l 17695 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 1500 m 17591 1380 l 17695 1441 l 17695 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 1380 m 17591 1260 l 17695 1321 l 17695 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 1260 m 17591 1140 l 17695 1201 l 17695 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 1140 m 17591 1020 l 17695 1081 l 17695 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 1020 m 17591 900 l 17695 961 l 17695 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 900 m 17591 780 l 17695 841 l 17695 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 780 m 17591 660 l 17695 721 l 17695 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 660 m 17591 540 l 17695 601 l 17695 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 540 m 17591 420 l 17695 481 l 17695 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 420 m 17591 300 l 17695 361 l 17695 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 300 m 17591 180 l 17695 241 l 17695 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 2160 m 17695 2040 l 17799 2100 l 17799 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 2040 m 17695 1920 l 17799 1980 l 17799 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 1920 m 17695 1800 l 17799 1861 l 17799 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 1800 m 17695 1680 l 17799 1741 l 17799 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 1680 m 17695 1560 l 17799 1621 l 17799 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 1560 m 17695 1440 l 17799 1501 l 17799 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 1440 m 17695 1320 l 17799 1381 l 17799 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 1320 m 17695 1200 l 17799 1261 l 17799 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 1200 m 17695 1080 l 17799 1141 l 17799 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 1080 m 17695 960 l 17799 1021 l 17799 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 960 m 17695 840 l 17799 901 l 17799 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 840 m 17695 720 l 17799 781 l 17799 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 720 m 17695 600 l 17799 661 l 17799 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 600 m 17695 480 l 17799 541 l 17799 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 480 m 17695 360 l 17799 421 l 17799 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 360 m 17695 240 l 17799 301 l 17799 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 2220 m 17799 2100 l 17903 2160 l 17903 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 2100 m 17799 1980 l 17903 2040 l 17903 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 1980 m 17799 1860 l 17903 1920 l 17903 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 1860 m 17799 1740 l 17903 1801 l 17903 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 1740 m 17799 1620 l 17903 1681 l 17903 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 1620 m 17799 1500 l 17903 1561 l 17903 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 1500 m 17799 1380 l 17903 1441 l 17903 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 1380 m 17799 1260 l 17903 1321 l 17903 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 1260 m 17799 1140 l 17903 1201 l 17903 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 1140 m 17799 1020 l 17903 1081 l 17903 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 1020 m 17799 900 l 17903 961 l 17903 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 900 m 17799 780 l 17903 841 l 17903 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 780 m 17799 660 l 17903 721 l 17903 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 660 m 17799 540 l 17903 601 l 17903 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 540 m 17799 420 l 17903 481 l 17903 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 420 m 17799 300 l 17903 361 l 17903 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 2280 m 17903 2160 l 18007 2220 l 18007 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 2160 m 17903 2040 l 18007 2100 l 18007 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 2040 m 17903 1920 l 18007 1980 l 18007 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 1920 m 17903 1800 l 18007 1861 l 18007 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 1800 m 17903 1680 l 18007 1741 l 18007 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 1680 m 17903 1560 l 18007 1621 l 18007 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 1560 m 17903 1440 l 18007 1501 l 18007 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 1440 m 17903 1320 l 18007 1381 l 18007 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 1320 m 17903 1200 l 18007 1261 l 18007 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 1200 m 17903 1080 l 18007 1141 l 18007 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 1080 m 17903 960 l 18007 1021 l 18007 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 960 m 17903 840 l 18007 901 l 18007 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 840 m 17903 720 l 18007 781 l 18007 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 720 m 17903 600 l 18007 661 l 18007 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 600 m 17903 480 l 18007 541 l 18007 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 480 m 17903 360 l 18007 421 l 18007 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 2340 m 18007 2220 l 18111 2280 l 18111 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 2220 m 18007 2100 l 18111 2160 l 18111 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 2100 m 18007 1980 l 18111 2040 l 18111 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 1980 m 18007 1860 l 18111 1920 l 18111 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 1860 m 18007 1740 l 18111 1801 l 18111 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 1740 m 18007 1620 l 18111 1681 l 18111 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 1620 m 18007 1500 l 18111 1561 l 18111 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 1500 m 18007 1380 l 18111 1441 l 18111 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 1380 m 18007 1260 l 18111 1321 l 18111 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 1260 m 18007 1140 l 18111 1201 l 18111 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 1140 m 18007 1020 l 18111 1081 l 18111 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 1020 m 18007 900 l 18111 961 l 18111 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 900 m 18007 780 l 18111 841 l 18111 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 780 m 18007 660 l 18111 721 l 18111 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 660 m 18007 540 l 18111 601 l 18111 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 540 m 18007 420 l 18111 481 l 18111 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 2400 m 18111 2280 l 18215 2340 l 18215 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 2280 m 18111 2160 l 18215 2220 l 18215 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 2160 m 18111 2040 l 18215 2100 l 18215 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 2040 m 18111 1920 l 18215 1980 l 18215 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 1920 m 18111 1800 l 18215 1861 l 18215 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 1800 m 18111 1680 l 18215 1741 l 18215 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 1680 m 18111 1560 l 18215 1621 l 18215 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 1560 m 18111 1440 l 18215 1501 l 18215 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 1440 m 18111 1320 l 18215 1381 l 18215 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 1320 m 18111 1200 l 18215 1261 l 18215 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 1200 m 18111 1080 l 18215 1141 l 18215 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 1080 m 18111 960 l 18215 1021 l 18215 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 960 m 18111 840 l 18215 901 l 18215 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 840 m 18111 720 l 18215 781 l 18215 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 720 m 18111 600 l 18215 661 l 18215 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 600 m 18111 480 l 18215 541 l 18215 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 2460 m 18215 2340 l 18319 2400 l 18319 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 2340 m 18215 2220 l 18319 2280 l 18319 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 2220 m 18215 2100 l 18319 2160 l 18319 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 2100 m 18215 1980 l 18319 2040 l 18319 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 1980 m 18215 1860 l 18319 1920 l 18319 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 1860 m 18215 1740 l 18319 1801 l 18319 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 1740 m 18215 1620 l 18319 1681 l 18319 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 1620 m 18215 1500 l 18319 1561 l 18319 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 1500 m 18215 1380 l 18319 1441 l 18319 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 1380 m 18215 1260 l 18319 1321 l 18319 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 1260 m 18215 1140 l 18319 1201 l 18319 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 1140 m 18215 1020 l 18319 1081 l 18319 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 1020 m 18215 900 l 18319 961 l 18319 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 900 m 18215 780 l 18319 841 l 18319 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 780 m 18215 660 l 18319 721 l 18319 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 660 m 18215 540 l 18319 601 l 18319 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 2520 m 18319 2400 l 18423 2460 l 18423 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 2400 m 18319 2280 l 18423 2340 l 18423 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 2280 m 18319 2160 l 18423 2220 l 18423 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 2160 m 18319 2040 l 18423 2100 l 18423 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 2040 m 18319 1920 l 18423 1980 l 18423 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 1920 m 18319 1800 l 18423 1861 l 18423 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 1800 m 18319 1680 l 18423 1741 l 18423 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 1680 m 18319 1560 l 18423 1621 l 18423 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 1560 m 18319 1440 l 18423 1501 l 18423 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 1440 m 18319 1320 l 18423 1381 l 18423 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 1320 m 18319 1200 l 18423 1261 l 18423 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 1200 m 18319 1080 l 18423 1141 l 18423 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 1080 m 18319 960 l 18423 1021 l 18423 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 960 m 18319 840 l 18423 901 l 18423 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 840 m 18319 720 l 18423 781 l 18423 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 720 m 18319 600 l 18423 661 l 18423 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 2580 m 18423 2460 l 18527 2520 l 18527 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 2460 m 18423 2340 l 18527 2400 l 18527 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 2340 m 18423 2220 l 18527 2280 l 18527 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 2220 m 18423 2100 l 18527 2160 l 18527 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 2100 m 18423 1980 l 18527 2040 l 18527 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 1980 m 18423 1860 l 18527 1920 l 18527 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 1860 m 18423 1740 l 18527 1801 l 18527 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 1740 m 18423 1620 l 18527 1681 l 18527 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 1620 m 18423 1500 l 18527 1561 l 18527 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 1500 m 18423 1380 l 18527 1441 l 18527 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 1380 m 18423 1260 l 18527 1321 l 18527 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 1260 m 18423 1140 l 18527 1201 l 18527 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 1140 m 18423 1020 l 18527 1081 l 18527 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 1020 m 18423 900 l 18527 961 l 18527 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 900 m 18423 780 l 18527 841 l 18527 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 780 m 18423 660 l 18527 721 l 18527 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 2640 m 18527 2520 l 18630 2580 l 18630 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 2520 m 18527 2400 l 18630 2460 l 18630 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 2400 m 18527 2280 l 18630 2340 l 18630 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 2280 m 18527 2160 l 18630 2220 l 18630 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 2160 m 18527 2040 l 18630 2100 l 18630 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 2040 m 18527 1920 l 18630 1980 l 18630 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 1920 m 18527 1800 l 18630 1861 l 18630 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 1800 m 18527 1680 l 18630 1741 l 18630 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 1680 m 18527 1560 l 18630 1621 l 18630 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 1560 m 18527 1440 l 18630 1501 l 18630 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 1440 m 18527 1320 l 18630 1381 l 18630 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 1320 m 18527 1200 l 18630 1261 l 18630 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 1200 m 18527 1080 l 18630 1141 l 18630 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 1080 m 18527 960 l 18630 1021 l 18630 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 960 m 18527 840 l 18630 901 l 18630 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 840 m 18527 720 l 18630 781 l 18630 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 2700 m 18630 2580 l 18734 2640 l 18734 2760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 2580 m 18630 2460 l 18734 2520 l 18734 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 2460 m 18630 2340 l 18734 2400 l 18734 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 2340 m 18630 2220 l 18734 2280 l 18734 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 2220 m 18630 2100 l 18734 2160 l 18734 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 2100 m 18630 1980 l 18734 2040 l 18734 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 1980 m 18630 1860 l 18734 1920 l 18734 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 1860 m 18630 1740 l 18734 1801 l 18734 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 1740 m 18630 1620 l 18734 1681 l 18734 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 1620 m 18630 1500 l 18734 1561 l 18734 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 1500 m 18630 1380 l 18734 1441 l 18734 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 1380 m 18630 1260 l 18734 1321 l 18734 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 1260 m 18630 1140 l 18734 1201 l 18734 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 1140 m 18630 1020 l 18734 1081 l 18734 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 1020 m 18630 900 l 18734 961 l 18734 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 900 m 18630 780 l 18734 841 l 18734 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 2760 m 18734 2640 l 18838 2700 l 18838 2820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 2640 m 18734 2520 l 18838 2580 l 18838 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 2520 m 18734 2400 l 18838 2460 l 18838 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 2400 m 18734 2280 l 18838 2340 l 18838 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 2280 m 18734 2160 l 18838 2220 l 18838 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 2160 m 18734 2040 l 18838 2100 l 18838 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 2040 m 18734 1920 l 18838 1980 l 18838 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 1920 m 18734 1800 l 18838 1861 l 18838 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 1800 m 18734 1680 l 18838 1741 l 18838 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 1680 m 18734 1560 l 18838 1621 l 18838 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 1560 m 18734 1440 l 18838 1501 l 18838 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 1440 m 18734 1320 l 18838 1381 l 18838 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 1320 m 18734 1200 l 18838 1261 l 18838 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 1200 m 18734 1080 l 18838 1141 l 18838 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 1080 m 18734 960 l 18838 1021 l 18838 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 960 m 18734 840 l 18838 901 l 18838 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 2820 m 18838 2700 l 18942 2760 l 18942 2880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 2700 m 18838 2580 l 18942 2640 l 18942 2760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 2580 m 18838 2460 l 18942 2520 l 18942 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 2460 m 18838 2340 l 18942 2400 l 18942 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 2340 m 18838 2220 l 18942 2280 l 18942 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 2220 m 18838 2100 l 18942 2160 l 18942 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 2100 m 18838 1980 l 18942 2040 l 18942 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 1980 m 18838 1860 l 18942 1920 l 18942 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 1860 m 18838 1740 l 18942 1801 l 18942 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 1740 m 18838 1620 l 18942 1681 l 18942 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 1620 m 18838 1500 l 18942 1561 l 18942 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 1500 m 18838 1380 l 18942 1441 l 18942 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 1380 m 18838 1260 l 18942 1321 l 18942 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 1260 m 18838 1140 l 18942 1201 l 18942 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 1140 m 18838 1020 l 18942 1081 l 18942 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 1020 m 18838 900 l 18942 961 l 18942 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 1320 m 17383 1381 l 17280 1440 l 17177 1380 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 17177 1500 m 17280 1561 l 17177 1620 l 17073 1560 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 17073 1680 m 17177 1741 l 17073 1800 l 16969 1740 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 16969 1740 m 17073 1801 l 16969 1860 l 16865 1800 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 16865 2160 m 16969 2220 l 16865 2279 l 16761 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 2220 m 16865 2280 l 16761 2339 l 16657 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 2280 m 16761 2340 l 16657 2399 l 16553 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 2340 m 16657 2400 l 16553 2459 l 16449 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 2400 m 16553 2460 l 16449 2519 l 16345 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 2460 m 16449 2520 l 16345 2579 l 16241 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 2520 m 16345 2580 l 16241 2639 l 16137 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 2580 m 16241 2640 l 16137 2699 l 16033 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 2640 m 16137 2700 l 16033 2759 l 15930 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 2700 m 16033 2760 l 15930 2819 l 15826 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 2760 m 15930 2820 l 15826 2879 l 15722 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 2820 m 15826 2880 l 15722 2939 l 15618 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 1980 m 17487 2040 l 17383 2099 l 17280 2039 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 2040 m 17383 2100 l 17280 2159 l 17177 2099 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 2100 m 17280 2160 l 17177 2219 l 17073 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 2160 m 17177 2220 l 17073 2279 l 16969 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 2220 m 17073 2280 l 16969 2339 l 16865 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 2280 m 16969 2340 l 16865 2399 l 16761 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 2340 m 16865 2400 l 16761 2459 l 16657 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 2400 m 16761 2460 l 16657 2519 l 16553 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 2460 m 16657 2520 l 16553 2579 l 16449 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 2520 m 16553 2580 l 16449 2639 l 16345 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 2580 m 16449 2640 l 16345 2699 l 16241 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 2640 m 16345 2700 l 16241 2759 l 16137 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 2700 m 16241 2760 l 16137 2819 l 16033 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 2760 m 16137 2820 l 16033 2879 l 15930 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 2820 m 16033 2880 l 15930 2939 l 15826 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 2880 m 15930 2940 l 15826 2999 l 15722 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 2040 m 17591 2100 l 17487 2159 l 17383 2099 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 2100 m 17487 2160 l 17383 2219 l 17280 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 2160 m 17383 2220 l 17280 2279 l 17177 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 2220 m 17280 2280 l 17177 2339 l 17073 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 2280 m 17177 2340 l 17073 2399 l 16969 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 2340 m 17073 2400 l 16969 2459 l 16865 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 2400 m 16969 2460 l 16865 2519 l 16761 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 2460 m 16865 2520 l 16761 2579 l 16657 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 2520 m 16761 2580 l 16657 2639 l 16553 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 2580 m 16657 2640 l 16553 2699 l 16449 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 2640 m 16553 2700 l 16449 2759 l 16345 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 2700 m 16449 2760 l 16345 2819 l 16241 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 2760 m 16345 2820 l 16241 2879 l 16137 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 2820 m 16241 2880 l 16137 2939 l 16033 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 2880 m 16137 2940 l 16033 2999 l 15930 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 2940 m 16033 3000 l 15930 3059 l 15826 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 2100 m 17695 2160 l 17591 2219 l 17487 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 2160 m 17591 2220 l 17487 2279 l 17383 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 2220 m 17487 2280 l 17383 2339 l 17280 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 2280 m 17383 2340 l 17280 2399 l 17177 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 2340 m 17280 2400 l 17177 2459 l 17073 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 2400 m 17177 2460 l 17073 2519 l 16969 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 2460 m 17073 2520 l 16969 2579 l 16865 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 2520 m 16969 2580 l 16865 2639 l 16761 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 2580 m 16865 2640 l 16761 2699 l 16657 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 2640 m 16761 2700 l 16657 2759 l 16553 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 2700 m 16657 2760 l 16553 2819 l 16449 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 2760 m 16553 2820 l 16449 2879 l 16345 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 2820 m 16449 2880 l 16345 2939 l 16241 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 2880 m 16345 2940 l 16241 2999 l 16137 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 2940 m 16241 3000 l 16137 3059 l 16033 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 3000 m 16137 3060 l 16033 3119 l 15930 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 2160 m 17799 2220 l 17695 2279 l 17591 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 2220 m 17695 2280 l 17591 2339 l 17487 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 2280 m 17591 2340 l 17487 2399 l 17383 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 2340 m 17487 2400 l 17383 2459 l 17280 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 2400 m 17383 2460 l 17280 2519 l 17177 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 2460 m 17280 2520 l 17177 2579 l 17073 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 2520 m 17177 2580 l 17073 2639 l 16969 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 2580 m 17073 2640 l 16969 2699 l 16865 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 2640 m 16969 2700 l 16865 2759 l 16761 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 2700 m 16865 2760 l 16761 2819 l 16657 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 2760 m 16761 2820 l 16657 2879 l 16553 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 2820 m 16657 2880 l 16553 2939 l 16449 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 2880 m 16553 2940 l 16449 2999 l 16345 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 2940 m 16449 3000 l 16345 3059 l 16241 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 3000 m 16345 3060 l 16241 3119 l 16137 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 3060 m 16241 3120 l 16137 3179 l 16033 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 2220 m 17903 2280 l 17799 2339 l 17695 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 2280 m 17799 2340 l 17695 2399 l 17591 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 2340 m 17695 2400 l 17591 2459 l 17487 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 2400 m 17591 2460 l 17487 2519 l 17383 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 2460 m 17487 2520 l 17383 2579 l 17280 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 2520 m 17383 2580 l 17280 2639 l 17177 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 2580 m 17280 2640 l 17177 2699 l 17073 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 2640 m 17177 2700 l 17073 2759 l 16969 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 2700 m 17073 2760 l 16969 2819 l 16865 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 2760 m 16969 2820 l 16865 2879 l 16761 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 2820 m 16865 2880 l 16761 2939 l 16657 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 2880 m 16761 2940 l 16657 2999 l 16553 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 2940 m 16657 3000 l 16553 3059 l 16449 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 3000 m 16553 3060 l 16449 3119 l 16345 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 3060 m 16449 3120 l 16345 3179 l 16241 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 3120 m 16345 3180 l 16241 3239 l 16137 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 2280 m 18007 2340 l 17903 2399 l 17799 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 2340 m 17903 2400 l 17799 2459 l 17695 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 2400 m 17799 2460 l 17695 2519 l 17591 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 2460 m 17695 2520 l 17591 2579 l 17487 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 2520 m 17591 2580 l 17487 2639 l 17383 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 2580 m 17487 2640 l 17383 2699 l 17280 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 2640 m 17383 2700 l 17280 2759 l 17177 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 2700 m 17280 2760 l 17177 2819 l 17073 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 2760 m 17177 2820 l 17073 2879 l 16969 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 2820 m 17073 2880 l 16969 2939 l 16865 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 2880 m 16969 2940 l 16865 2999 l 16761 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 2940 m 16865 3000 l 16761 3059 l 16657 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 3000 m 16761 3060 l 16657 3119 l 16553 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 3060 m 16657 3120 l 16553 3179 l 16449 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 3120 m 16553 3180 l 16449 3239 l 16345 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 3180 m 16449 3240 l 16345 3299 l 16241 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 2340 m 18111 2400 l 18007 2459 l 17903 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 2400 m 18007 2460 l 17903 2519 l 17799 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 2460 m 17903 2520 l 17799 2579 l 17695 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 2520 m 17799 2580 l 17695 2639 l 17591 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 2580 m 17695 2640 l 17591 2699 l 17487 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 2640 m 17591 2700 l 17487 2759 l 17383 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 2700 m 17487 2760 l 17383 2819 l 17280 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 2760 m 17383 2820 l 17280 2879 l 17177 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 2820 m 17280 2880 l 17177 2939 l 17073 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 2880 m 17177 2940 l 17073 2999 l 16969 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 2940 m 17073 3000 l 16969 3059 l 16865 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 3000 m 16969 3060 l 16865 3119 l 16761 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 3060 m 16865 3120 l 16761 3179 l 16657 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 3120 m 16761 3180 l 16657 3239 l 16553 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 3180 m 16657 3240 l 16553 3299 l 16449 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 3240 m 16553 3300 l 16449 3359 l 16345 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 2400 m 18215 2460 l 18111 2519 l 18007 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 2460 m 18111 2520 l 18007 2579 l 17903 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 2520 m 18007 2580 l 17903 2639 l 17799 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 2580 m 17903 2640 l 17799 2699 l 17695 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 2640 m 17799 2700 l 17695 2759 l 17591 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 2700 m 17695 2760 l 17591 2819 l 17487 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 2760 m 17591 2820 l 17487 2879 l 17383 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 2820 m 17487 2880 l 17383 2939 l 17280 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 2880 m 17383 2940 l 17280 2999 l 17177 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 2940 m 17280 3000 l 17177 3059 l 17073 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 3000 m 17177 3060 l 17073 3119 l 16969 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 3060 m 17073 3120 l 16969 3179 l 16865 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 3120 m 16969 3180 l 16865 3239 l 16761 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 3180 m 16865 3240 l 16761 3299 l 16657 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 3240 m 16761 3300 l 16657 3359 l 16553 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 3300 m 16657 3360 l 16553 3419 l 16449 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 2460 m 18319 2520 l 18215 2579 l 18111 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 2520 m 18215 2580 l 18111 2639 l 18007 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 2580 m 18111 2640 l 18007 2699 l 17903 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 2640 m 18007 2700 l 17903 2759 l 17799 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 2700 m 17903 2760 l 17799 2819 l 17695 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 2760 m 17799 2820 l 17695 2879 l 17591 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 2820 m 17695 2880 l 17591 2939 l 17487 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 2880 m 17591 2940 l 17487 2999 l 17383 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 2940 m 17487 3000 l 17383 3059 l 17280 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 3000 m 17383 3060 l 17280 3119 l 17177 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 3060 m 17280 3120 l 17177 3179 l 17073 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 3120 m 17177 3180 l 17073 3239 l 16969 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 3180 m 17073 3240 l 16969 3299 l 16865 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 3240 m 16969 3300 l 16865 3359 l 16761 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 3300 m 16865 3360 l 16761 3419 l 16657 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 3360 m 16761 3420 l 16657 3479 l 16553 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 2520 m 18423 2580 l 18319 2639 l 18215 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 2580 m 18319 2640 l 18215 2699 l 18111 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 2640 m 18215 2700 l 18111 2759 l 18007 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 2700 m 18111 2760 l 18007 2819 l 17903 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 2760 m 18007 2820 l 17903 2879 l 17799 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 2820 m 17903 2880 l 17799 2939 l 17695 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 2880 m 17799 2940 l 17695 2999 l 17591 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 2940 m 17695 3000 l 17591 3059 l 17487 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 3000 m 17591 3060 l 17487 3119 l 17383 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 3060 m 17487 3120 l 17383 3179 l 17280 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 3120 m 17383 3180 l 17280 3239 l 17177 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 3180 m 17280 3240 l 17177 3299 l 17073 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 3240 m 17177 3300 l 17073 3359 l 16969 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 3300 m 17073 3360 l 16969 3419 l 16865 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 3360 m 16969 3420 l 16865 3479 l 16761 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 3420 m 16865 3480 l 16761 3539 l 16657 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 2580 m 18527 2640 l 18423 2699 l 18319 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 2640 m 18423 2700 l 18319 2759 l 18215 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 2700 m 18319 2760 l 18215 2819 l 18111 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 2760 m 18215 2820 l 18111 2879 l 18007 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 2820 m 18111 2880 l 18007 2939 l 17903 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 2880 m 18007 2940 l 17903 2999 l 17799 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 2940 m 17903 3000 l 17799 3059 l 17695 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 3000 m 17799 3060 l 17695 3119 l 17591 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 3060 m 17695 3120 l 17591 3179 l 17487 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 3120 m 17591 3180 l 17487 3239 l 17383 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 3180 m 17487 3240 l 17383 3299 l 17280 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 3240 m 17383 3300 l 17280 3359 l 17177 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 3300 m 17280 3360 l 17177 3419 l 17073 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 3360 m 17177 3420 l 17073 3479 l 16969 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 3420 m 17073 3480 l 16969 3539 l 16865 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 3480 m 16969 3540 l 16865 3599 l 16761 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 2640 m 18630 2700 l 18527 2759 l 18423 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 2700 m 18527 2760 l 18423 2819 l 18319 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 2760 m 18423 2820 l 18319 2879 l 18215 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 2820 m 18319 2880 l 18215 2939 l 18111 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 2880 m 18215 2940 l 18111 2999 l 18007 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 2940 m 18111 3000 l 18007 3059 l 17903 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 3000 m 18007 3060 l 17903 3119 l 17799 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 3060 m 17903 3120 l 17799 3179 l 17695 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 3120 m 17799 3180 l 17695 3239 l 17591 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 3180 m 17695 3240 l 17591 3299 l 17487 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 3240 m 17591 3300 l 17487 3359 l 17383 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 3300 m 17487 3360 l 17383 3419 l 17280 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 3360 m 17383 3420 l 17280 3479 l 17177 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 3420 m 17280 3480 l 17177 3539 l 17073 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 3480 m 17177 3540 l 17073 3599 l 16969 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 3540 m 17073 3600 l 16969 3659 l 16865 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 2700 m 18734 2760 l 18630 2819 l 18527 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 2760 m 18630 2820 l 18527 2879 l 18423 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 2820 m 18527 2880 l 18423 2939 l 18319 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 2880 m 18423 2940 l 18319 2999 l 18215 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 2940 m 18319 3000 l 18215 3059 l 18111 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 3000 m 18215 3060 l 18111 3119 l 18007 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 3060 m 18111 3120 l 18007 3179 l 17903 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 3120 m 18007 3180 l 17903 3239 l 17799 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 3180 m 17903 3240 l 17799 3299 l 17695 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 3240 m 17799 3300 l 17695 3359 l 17591 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 3300 m 17695 3360 l 17591 3419 l 17487 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 3360 m 17591 3420 l 17487 3479 l 17383 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 3420 m 17487 3480 l 17383 3539 l 17280 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 3480 m 17383 3540 l 17280 3599 l 17177 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 3540 m 17280 3600 l 17177 3659 l 17073 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 3600 m 17177 3660 l 17073 3719 l 16969 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 2760 m 18838 2820 l 18734 2879 l 18630 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 2820 m 18734 2880 l 18630 2939 l 18527 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 2880 m 18630 2940 l 18527 2999 l 18423 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 2940 m 18527 3000 l 18423 3059 l 18319 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 3000 m 18423 3060 l 18319 3119 l 18215 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 3060 m 18319 3120 l 18215 3179 l 18111 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 3120 m 18215 3180 l 18111 3239 l 18007 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 3180 m 18111 3240 l 18007 3299 l 17903 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 3240 m 18007 3300 l 17903 3359 l 17799 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 3300 m 17903 3360 l 17799 3419 l 17695 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 3360 m 17799 3420 l 17695 3479 l 17591 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 3420 m 17695 3480 l 17591 3539 l 17487 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 3480 m 17591 3540 l 17487 3599 l 17383 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 3540 m 17487 3600 l 17383 3659 l 17280 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 3600 m 17383 3660 l 17280 3719 l 17177 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 3660 m 17280 3720 l 17177 3779 l 17073 3719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 2820 m 18942 2880 l 18838 2939 l 18734 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 2880 m 18838 2940 l 18734 2999 l 18630 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 2940 m 18734 3000 l 18630 3059 l 18527 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 3000 m 18630 3060 l 18527 3119 l 18423 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 3060 m 18527 3120 l 18423 3179 l 18319 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 3120 m 18423 3180 l 18319 3239 l 18215 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 3180 m 18319 3240 l 18215 3299 l 18111 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 3240 m 18215 3300 l 18111 3359 l 18007 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 3300 m 18111 3360 l 18007 3419 l 17903 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 3360 m 18007 3420 l 17903 3479 l 17799 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 3420 m 17903 3480 l 17799 3539 l 17695 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 3480 m 17799 3540 l 17695 3599 l 17591 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 3540 m 17695 3600 l 17591 3659 l 17487 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 3600 m 17591 3660 l 17487 3719 l 17383 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 3660 m 17487 3720 l 17383 3779 l 17280 3719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 3720 m 17383 3780 l 17280 3839 l 17177 3779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 2100 m 21327 2159 l 21327 2039 l 21431 1980 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 21223 1860 m 21120 1920 l 21120 1800 l 21223 1741 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 21120 1680 m 21017 1740 l 21017 1620 l 21120 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 1560 m 21017 1620 l 21017 1500 l 21120 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 1440 m 21017 1500 l 21017 1380 l 21120 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 1320 m 21017 1380 l 21017 1260 l 21120 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 1200 m 21017 1260 l 21017 1140 l 21120 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 1080 m 21017 1140 l 21017 1020 l 21120 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 960 m 21017 1020 l 21017 900 l 21120 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 840 m 21017 900 l 21017 780 l 21120 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 720 m 21017 780 l 21017 660 l 21120 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 600 m 21017 660 l 21017 540 l 21120 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 480 m 21017 540 l 21017 420 l 21120 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 360 m 21017 420 l 21017 300 l 21120 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 240 m 21017 300 l 21017 180 l 21120 121 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 120 m 21017 180 l 21017 60 l 21120 1 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 2100 m 21120 2159 l 21120 2039 l 21223 1980 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 21120 1920 m 21017 1979 l 21017 1860 l 21120 1801 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 21017 1740 m 20913 1800 l 20913 1680 l 21017 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 1620 m 20913 1680 l 20913 1560 l 21017 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 1500 m 20913 1560 l 20913 1440 l 21017 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 1380 m 20913 1440 l 20913 1320 l 21017 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 1260 m 20913 1320 l 20913 1200 l 21017 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 1140 m 20913 1200 l 20913 1080 l 21017 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 1020 m 20913 1080 l 20913 960 l 21017 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 900 m 20913 960 l 20913 840 l 21017 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 780 m 20913 840 l 20913 720 l 21017 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 660 m 20913 720 l 20913 600 l 21017 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 540 m 20913 600 l 20913 480 l 21017 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 420 m 20913 480 l 20913 360 l 21017 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 300 m 20913 360 l 20913 240 l 21017 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 180 m 20913 240 l 20913 120 l 21017 61 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 2160 m 21017 2219 l 21017 2099 l 21120 2040 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 20913 1920 m 20809 1979 l 20809 1860 l 20913 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 1800 m 20809 1860 l 20809 1740 l 20913 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 1680 m 20809 1740 l 20809 1620 l 20913 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 1560 m 20809 1620 l 20809 1500 l 20913 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 1440 m 20809 1500 l 20809 1380 l 20913 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 1320 m 20809 1380 l 20809 1260 l 20913 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 1200 m 20809 1260 l 20809 1140 l 20913 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 1080 m 20809 1140 l 20809 1020 l 20913 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 960 m 20809 1020 l 20809 900 l 20913 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 840 m 20809 900 l 20809 780 l 20913 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 720 m 20809 780 l 20809 660 l 20913 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 600 m 20809 660 l 20809 540 l 20913 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 480 m 20809 540 l 20809 420 l 20913 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 360 m 20809 420 l 20809 300 l 20913 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 240 m 20809 300 l 20809 180 l 20913 121 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 2220 m 20913 2279 l 20913 2159 l 21017 2100 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 20809 1980 m 20705 2039 l 20705 1920 l 20809 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 1860 m 20705 1920 l 20705 1800 l 20809 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 1740 m 20705 1800 l 20705 1680 l 20809 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 1620 m 20705 1680 l 20705 1560 l 20809 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 1500 m 20705 1560 l 20705 1440 l 20809 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 1380 m 20705 1440 l 20705 1320 l 20809 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 1260 m 20705 1320 l 20705 1200 l 20809 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 1140 m 20705 1200 l 20705 1080 l 20809 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 1020 m 20705 1080 l 20705 960 l 20809 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 900 m 20705 960 l 20705 840 l 20809 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 780 m 20705 840 l 20705 720 l 20809 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 660 m 20705 720 l 20705 600 l 20809 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 540 m 20705 600 l 20705 480 l 20809 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 420 m 20705 480 l 20705 360 l 20809 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 300 m 20705 360 l 20705 240 l 20809 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 2220 m 20705 2279 l 20705 2159 l 20809 2100 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 20705 2040 m 20601 2099 l 20601 1979 l 20705 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 1920 m 20601 1979 l 20601 1860 l 20705 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 1800 m 20601 1860 l 20601 1740 l 20705 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 1680 m 20601 1740 l 20601 1620 l 20705 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 1560 m 20601 1620 l 20601 1500 l 20705 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 1440 m 20601 1500 l 20601 1380 l 20705 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 1320 m 20601 1380 l 20601 1260 l 20705 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 1200 m 20601 1260 l 20601 1140 l 20705 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 1080 m 20601 1140 l 20601 1020 l 20705 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 960 m 20601 1020 l 20601 900 l 20705 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 840 m 20601 900 l 20601 780 l 20705 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 720 m 20601 780 l 20601 660 l 20705 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 600 m 20601 660 l 20601 540 l 20705 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 480 m 20601 540 l 20601 420 l 20705 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 360 m 20601 420 l 20601 300 l 20705 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 2280 m 20601 2339 l 20601 2219 l 20705 2160 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 20601 2100 m 20497 2159 l 20497 2039 l 20601 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 1980 m 20497 2039 l 20497 1920 l 20601 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 1860 m 20497 1920 l 20497 1800 l 20601 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 1740 m 20497 1800 l 20497 1680 l 20601 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 1620 m 20497 1680 l 20497 1560 l 20601 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 1500 m 20497 1560 l 20497 1440 l 20601 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 1380 m 20497 1440 l 20497 1320 l 20601 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 1260 m 20497 1320 l 20497 1200 l 20601 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 1140 m 20497 1200 l 20497 1080 l 20601 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 1020 m 20497 1080 l 20497 960 l 20601 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 900 m 20497 960 l 20497 840 l 20601 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 780 m 20497 840 l 20497 720 l 20601 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 660 m 20497 720 l 20497 600 l 20601 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 540 m 20497 600 l 20497 480 l 20601 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 420 m 20497 480 l 20497 360 l 20601 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 2340 m 20497 2399 l 20497 2279 l 20601 2220 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 20497 2160 m 20393 2219 l 20393 2099 l 20497 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 2040 m 20393 2099 l 20393 1979 l 20497 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 1920 m 20393 1979 l 20393 1860 l 20497 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 1800 m 20393 1860 l 20393 1740 l 20497 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 1680 m 20393 1740 l 20393 1620 l 20497 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 1560 m 20393 1620 l 20393 1500 l 20497 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 1440 m 20393 1500 l 20393 1380 l 20497 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 1320 m 20393 1380 l 20393 1260 l 20497 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 1200 m 20393 1260 l 20393 1140 l 20497 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 1080 m 20393 1140 l 20393 1020 l 20497 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 960 m 20393 1020 l 20393 900 l 20497 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 840 m 20393 900 l 20393 780 l 20497 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 720 m 20393 780 l 20393 660 l 20497 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 600 m 20393 660 l 20393 540 l 20497 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 480 m 20393 540 l 20393 420 l 20497 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 2400 m 20393 2459 l 20393 2339 l 20497 2280 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 20393 2220 m 20289 2279 l 20289 2159 l 20393 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 2100 m 20289 2159 l 20289 2039 l 20393 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 1980 m 20289 2039 l 20289 1920 l 20393 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 1860 m 20289 1920 l 20289 1800 l 20393 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 1740 m 20289 1800 l 20289 1680 l 20393 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 1620 m 20289 1680 l 20289 1560 l 20393 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 1500 m 20289 1560 l 20289 1440 l 20393 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 1380 m 20289 1440 l 20289 1320 l 20393 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 1260 m 20289 1320 l 20289 1200 l 20393 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 1140 m 20289 1200 l 20289 1080 l 20393 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 1020 m 20289 1080 l 20289 960 l 20393 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 900 m 20289 960 l 20289 840 l 20393 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 780 m 20289 840 l 20289 720 l 20393 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 660 m 20289 720 l 20289 600 l 20393 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 540 m 20289 600 l 20289 480 l 20393 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 2400 m 20185 2459 l 20185 2339 l 20289 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 2280 m 20185 2339 l 20185 2219 l 20289 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 2160 m 20185 2219 l 20185 2099 l 20289 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 2040 m 20185 2099 l 20185 1979 l 20289 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 1920 m 20185 1979 l 20185 1860 l 20289 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 1800 m 20185 1860 l 20185 1740 l 20289 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 1680 m 20185 1740 l 20185 1620 l 20289 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 1560 m 20185 1620 l 20185 1500 l 20289 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 1440 m 20185 1500 l 20185 1380 l 20289 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 1320 m 20185 1380 l 20185 1260 l 20289 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 1200 m 20185 1260 l 20185 1140 l 20289 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 1080 m 20185 1140 l 20185 1020 l 20289 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 960 m 20185 1020 l 20185 900 l 20289 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 840 m 20185 900 l 20185 780 l 20289 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 720 m 20185 780 l 20185 660 l 20289 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 600 m 20185 660 l 20185 540 l 20289 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 2460 m 20081 2519 l 20081 2399 l 20185 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 2340 m 20081 2399 l 20081 2279 l 20185 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 2220 m 20081 2279 l 20081 2159 l 20185 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 2100 m 20081 2159 l 20081 2039 l 20185 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 1980 m 20081 2039 l 20081 1920 l 20185 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 1860 m 20081 1920 l 20081 1800 l 20185 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 1740 m 20081 1800 l 20081 1680 l 20185 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 1620 m 20081 1680 l 20081 1560 l 20185 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 1500 m 20081 1560 l 20081 1440 l 20185 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 1380 m 20081 1440 l 20081 1320 l 20185 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 1260 m 20081 1320 l 20081 1200 l 20185 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 1140 m 20081 1200 l 20081 1080 l 20185 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 1020 m 20081 1080 l 20081 960 l 20185 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 900 m 20081 960 l 20081 840 l 20185 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 780 m 20081 840 l 20081 720 l 20185 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 660 m 20081 720 l 20081 600 l 20185 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 2520 m 19977 2579 l 19977 2459 l 20081 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 2400 m 19977 2459 l 19977 2339 l 20081 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 2280 m 19977 2339 l 19977 2219 l 20081 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 2160 m 19977 2219 l 19977 2099 l 20081 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 2040 m 19977 2099 l 19977 1979 l 20081 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 1920 m 19977 1979 l 19977 1860 l 20081 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 1800 m 19977 1860 l 19977 1740 l 20081 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 1680 m 19977 1740 l 19977 1620 l 20081 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 1560 m 19977 1620 l 19977 1500 l 20081 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 1440 m 19977 1500 l 19977 1380 l 20081 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 1320 m 19977 1380 l 19977 1260 l 20081 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 1200 m 19977 1260 l 19977 1140 l 20081 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 1080 m 19977 1140 l 19977 1020 l 20081 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 960 m 19977 1020 l 19977 900 l 20081 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 840 m 19977 900 l 19977 780 l 20081 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 720 m 19977 780 l 19977 660 l 20081 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 2580 m 19873 2639 l 19873 2519 l 19977 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 2460 m 19873 2519 l 19873 2399 l 19977 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 2340 m 19873 2399 l 19873 2279 l 19977 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 2220 m 19873 2279 l 19873 2159 l 19977 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 2100 m 19873 2159 l 19873 2039 l 19977 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 1980 m 19873 2039 l 19873 1920 l 19977 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 1860 m 19873 1920 l 19873 1800 l 19977 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 1740 m 19873 1800 l 19873 1680 l 19977 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 1620 m 19873 1680 l 19873 1560 l 19977 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 1500 m 19873 1560 l 19873 1440 l 19977 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 1380 m 19873 1440 l 19873 1320 l 19977 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 1260 m 19873 1320 l 19873 1200 l 19977 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 1140 m 19873 1200 l 19873 1080 l 19977 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 1020 m 19873 1080 l 19873 960 l 19977 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 900 m 19873 960 l 19873 840 l 19977 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 780 m 19873 840 l 19873 720 l 19977 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 2640 m 19770 2699 l 19770 2579 l 19873 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 2520 m 19770 2579 l 19770 2459 l 19873 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 2400 m 19770 2459 l 19770 2339 l 19873 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 2280 m 19770 2339 l 19770 2219 l 19873 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 2160 m 19770 2219 l 19770 2099 l 19873 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 2040 m 19770 2099 l 19770 1979 l 19873 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 1920 m 19770 1979 l 19770 1860 l 19873 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 1800 m 19770 1860 l 19770 1740 l 19873 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 1680 m 19770 1740 l 19770 1620 l 19873 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 1560 m 19770 1620 l 19770 1500 l 19873 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 1440 m 19770 1500 l 19770 1380 l 19873 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 1320 m 19770 1380 l 19770 1260 l 19873 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 1200 m 19770 1260 l 19770 1140 l 19873 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 1080 m 19770 1140 l 19770 1020 l 19873 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 960 m 19770 1020 l 19770 900 l 19873 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 840 m 19770 900 l 19770 780 l 19873 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 2700 m 19666 2759 l 19666 2639 l 19770 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 2580 m 19666 2639 l 19666 2519 l 19770 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 2460 m 19666 2519 l 19666 2399 l 19770 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 2340 m 19666 2399 l 19666 2279 l 19770 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 2220 m 19666 2279 l 19666 2159 l 19770 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 2100 m 19666 2159 l 19666 2039 l 19770 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 1980 m 19666 2039 l 19666 1920 l 19770 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 1860 m 19666 1920 l 19666 1800 l 19770 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 1740 m 19666 1800 l 19666 1680 l 19770 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 1620 m 19666 1680 l 19666 1560 l 19770 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 1500 m 19666 1560 l 19666 1440 l 19770 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 1380 m 19666 1440 l 19666 1320 l 19770 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 1260 m 19666 1320 l 19666 1200 l 19770 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 1140 m 19666 1200 l 19666 1080 l 19770 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 1020 m 19666 1080 l 19666 960 l 19770 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 900 m 19666 960 l 19666 840 l 19770 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 2760 m 19562 2819 l 19562 2699 l 19666 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 2640 m 19562 2699 l 19562 2579 l 19666 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 2520 m 19562 2579 l 19562 2459 l 19666 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 2400 m 19562 2459 l 19562 2339 l 19666 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 2280 m 19562 2339 l 19562 2219 l 19666 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 2160 m 19562 2219 l 19562 2099 l 19666 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 2040 m 19562 2099 l 19562 1979 l 19666 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 1920 m 19562 1979 l 19562 1860 l 19666 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 1800 m 19562 1860 l 19562 1740 l 19666 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 1680 m 19562 1740 l 19562 1620 l 19666 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 1560 m 19562 1620 l 19562 1500 l 19666 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 1440 m 19562 1500 l 19562 1380 l 19666 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 1320 m 19562 1380 l 19562 1260 l 19666 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 1200 m 19562 1260 l 19562 1140 l 19666 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 1080 m 19562 1140 l 19562 1020 l 19666 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 960 m 19562 1020 l 19562 900 l 19666 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 2820 m 19458 2879 l 19458 2759 l 19562 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 2700 m 19458 2759 l 19458 2639 l 19562 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 2580 m 19458 2639 l 19458 2519 l 19562 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 2460 m 19458 2519 l 19458 2399 l 19562 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 2340 m 19458 2399 l 19458 2279 l 19562 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 2220 m 19458 2279 l 19458 2159 l 19562 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 2100 m 19458 2159 l 19458 2039 l 19562 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 1980 m 19458 2039 l 19458 1920 l 19562 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 1860 m 19458 1920 l 19458 1800 l 19562 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 1740 m 19458 1800 l 19458 1680 l 19562 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 1620 m 19458 1680 l 19458 1560 l 19562 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 1500 m 19458 1560 l 19458 1440 l 19562 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 1380 m 19458 1440 l 19458 1320 l 19562 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 1260 m 19458 1320 l 19458 1200 l 19562 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 1140 m 19458 1200 l 19458 1080 l 19562 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 1020 m 19458 1080 l 19458 960 l 19562 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 2400 m 20289 2280 l 20393 2340 l 20393 2460 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 20913 1920 m 20913 1800 l 21017 1861 l 21017 1980 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 21120 1680 m 21120 1560 l 21223 1621 l 21223 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 1560 m 21120 1440 l 21223 1501 l 21223 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 1440 m 21120 1320 l 21223 1381 l 21223 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 1320 m 21120 1200 l 21223 1261 l 21223 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 1200 m 21120 1080 l 21223 1141 l 21223 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 1080 m 21120 960 l 21223 1021 l 21223 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 960 m 21120 840 l 21223 901 l 21223 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 840 m 21120 720 l 21223 781 l 21223 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 720 m 21120 600 l 21223 661 l 21223 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 600 m 21120 480 l 21223 541 l 21223 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 480 m 21120 360 l 21223 421 l 21223 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 360 m 21120 240 l 21223 301 l 21223 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 240 m 21120 120 l 21223 181 l 21223 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 120 m 21120 0 l 21223 61 l 21223 181 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 2220 m 20809 2100 l 20913 2160 l 20913 2280 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 21223 1860 m 21223 1740 l 21327 1801 l 21327 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 1740 m 21223 1620 l 21327 1681 l 21327 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 1620 m 21223 1500 l 21327 1561 l 21327 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 1500 m 21223 1380 l 21327 1441 l 21327 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 1380 m 21223 1260 l 21327 1321 l 21327 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 1260 m 21223 1140 l 21327 1201 l 21327 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 1140 m 21223 1020 l 21327 1081 l 21327 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 1020 m 21223 900 l 21327 961 l 21327 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 900 m 21223 780 l 21327 841 l 21327 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 780 m 21223 660 l 21327 721 l 21327 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 660 m 21223 540 l 21327 601 l 21327 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 540 m 21223 420 l 21327 481 l 21327 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 420 m 21223 300 l 21327 361 l 21327 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 300 m 21223 180 l 21327 241 l 21327 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 180 m 21223 60 l 21327 121 l 21327 241 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 2100 m 21223 1980 l 21327 2040 l 21327 2160 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 21327 1920 m 21327 1800 l 21431 1861 l 21431 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 1800 m 21327 1680 l 21431 1741 l 21431 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 1680 m 21327 1560 l 21431 1621 l 21431 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 1560 m 21327 1440 l 21431 1501 l 21431 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 1440 m 21327 1320 l 21431 1381 l 21431 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 1320 m 21327 1200 l 21431 1261 l 21431 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 1200 m 21327 1080 l 21431 1141 l 21431 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 1080 m 21327 960 l 21431 1021 l 21431 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 960 m 21327 840 l 21431 901 l 21431 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 840 m 21327 720 l 21431 781 l 21431 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 720 m 21327 600 l 21431 661 l 21431 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 600 m 21327 480 l 21431 541 l 21431 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 480 m 21327 360 l 21431 421 l 21431 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 360 m 21327 240 l 21431 301 l 21431 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 240 m 21327 120 l 21431 181 l 21431 301 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 2100 m 21431 1980 l 21535 2040 l 21535 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 1980 m 21431 1860 l 21535 1920 l 21535 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 1860 m 21431 1740 l 21535 1801 l 21535 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 1740 m 21431 1620 l 21535 1681 l 21535 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 1620 m 21431 1500 l 21535 1561 l 21535 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 1500 m 21431 1380 l 21535 1441 l 21535 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 1380 m 21431 1260 l 21535 1321 l 21535 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 1260 m 21431 1140 l 21535 1201 l 21535 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 1140 m 21431 1020 l 21535 1081 l 21535 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 1020 m 21431 900 l 21535 961 l 21535 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 900 m 21431 780 l 21535 841 l 21535 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 780 m 21431 660 l 21535 721 l 21535 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 660 m 21431 540 l 21535 601 l 21535 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 540 m 21431 420 l 21535 481 l 21535 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 420 m 21431 300 l 21535 361 l 21535 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 300 m 21431 180 l 21535 241 l 21535 361 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 2160 m 21535 2040 l 21639 2100 l 21639 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 2040 m 21535 1920 l 21639 1980 l 21639 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 1920 m 21535 1800 l 21639 1861 l 21639 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 1800 m 21535 1680 l 21639 1741 l 21639 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 1680 m 21535 1560 l 21639 1621 l 21639 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 1560 m 21535 1440 l 21639 1501 l 21639 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 1440 m 21535 1320 l 21639 1381 l 21639 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 1320 m 21535 1200 l 21639 1261 l 21639 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 1200 m 21535 1080 l 21639 1141 l 21639 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 1080 m 21535 960 l 21639 1021 l 21639 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 960 m 21535 840 l 21639 901 l 21639 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 840 m 21535 720 l 21639 781 l 21639 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 720 m 21535 600 l 21639 661 l 21639 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 600 m 21535 480 l 21639 541 l 21639 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 480 m 21535 360 l 21639 421 l 21639 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 360 m 21535 240 l 21639 301 l 21639 421 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 2220 m 21639 2100 l 21743 2160 l 21743 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 2100 m 21639 1980 l 21743 2040 l 21743 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 1980 m 21639 1860 l 21743 1920 l 21743 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 1860 m 21639 1740 l 21743 1801 l 21743 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 1740 m 21639 1620 l 21743 1681 l 21743 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 1620 m 21639 1500 l 21743 1561 l 21743 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 1500 m 21639 1380 l 21743 1441 l 21743 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 1380 m 21639 1260 l 21743 1321 l 21743 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 1260 m 21639 1140 l 21743 1201 l 21743 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 1140 m 21639 1020 l 21743 1081 l 21743 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 1020 m 21639 900 l 21743 961 l 21743 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 900 m 21639 780 l 21743 841 l 21743 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 780 m 21639 660 l 21743 721 l 21743 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 660 m 21639 540 l 21743 601 l 21743 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 540 m 21639 420 l 21743 481 l 21743 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 420 m 21639 300 l 21743 361 l 21743 481 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 2280 m 21743 2160 l 21847 2220 l 21847 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 2160 m 21743 2040 l 21847 2100 l 21847 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 2040 m 21743 1920 l 21847 1980 l 21847 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 1920 m 21743 1800 l 21847 1861 l 21847 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 1800 m 21743 1680 l 21847 1741 l 21847 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 1680 m 21743 1560 l 21847 1621 l 21847 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 1560 m 21743 1440 l 21847 1501 l 21847 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 1440 m 21743 1320 l 21847 1381 l 21847 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 1320 m 21743 1200 l 21847 1261 l 21847 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 1200 m 21743 1080 l 21847 1141 l 21847 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 1080 m 21743 960 l 21847 1021 l 21847 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 960 m 21743 840 l 21847 901 l 21847 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 840 m 21743 720 l 21847 781 l 21847 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 720 m 21743 600 l 21847 661 l 21847 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 600 m 21743 480 l 21847 541 l 21847 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 480 m 21743 360 l 21847 421 l 21847 541 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 2340 m 21847 2220 l 21951 2280 l 21951 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 2220 m 21847 2100 l 21951 2160 l 21951 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 2100 m 21847 1980 l 21951 2040 l 21951 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 1980 m 21847 1860 l 21951 1920 l 21951 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 1860 m 21847 1740 l 21951 1801 l 21951 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 1740 m 21847 1620 l 21951 1681 l 21951 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 1620 m 21847 1500 l 21951 1561 l 21951 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 1500 m 21847 1380 l 21951 1441 l 21951 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 1380 m 21847 1260 l 21951 1321 l 21951 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 1260 m 21847 1140 l 21951 1201 l 21951 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 1140 m 21847 1020 l 21951 1081 l 21951 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 1020 m 21847 900 l 21951 961 l 21951 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 900 m 21847 780 l 21951 841 l 21951 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 780 m 21847 660 l 21951 721 l 21951 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 660 m 21847 540 l 21951 601 l 21951 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 540 m 21847 420 l 21951 481 l 21951 601 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 2400 m 21951 2280 l 22055 2340 l 22055 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 2280 m 21951 2160 l 22055 2220 l 22055 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 2160 m 21951 2040 l 22055 2100 l 22055 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 2040 m 21951 1920 l 22055 1980 l 22055 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 1920 m 21951 1800 l 22055 1861 l 22055 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 1800 m 21951 1680 l 22055 1741 l 22055 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 1680 m 21951 1560 l 22055 1621 l 22055 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 1560 m 21951 1440 l 22055 1501 l 22055 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 1440 m 21951 1320 l 22055 1381 l 22055 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 1320 m 21951 1200 l 22055 1261 l 22055 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 1200 m 21951 1080 l 22055 1141 l 22055 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 1080 m 21951 960 l 22055 1021 l 22055 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 960 m 21951 840 l 22055 901 l 22055 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 840 m 21951 720 l 22055 781 l 22055 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 720 m 21951 600 l 22055 661 l 22055 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 600 m 21951 480 l 22055 541 l 22055 661 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 2460 m 22055 2340 l 22159 2400 l 22159 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 2340 m 22055 2220 l 22159 2280 l 22159 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 2220 m 22055 2100 l 22159 2160 l 22159 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 2100 m 22055 1980 l 22159 2040 l 22159 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 1980 m 22055 1860 l 22159 1920 l 22159 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 1860 m 22055 1740 l 22159 1801 l 22159 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 1740 m 22055 1620 l 22159 1681 l 22159 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 1620 m 22055 1500 l 22159 1561 l 22159 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 1500 m 22055 1380 l 22159 1441 l 22159 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 1380 m 22055 1260 l 22159 1321 l 22159 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 1260 m 22055 1140 l 22159 1201 l 22159 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 1140 m 22055 1020 l 22159 1081 l 22159 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 1020 m 22055 900 l 22159 961 l 22159 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 900 m 22055 780 l 22159 841 l 22159 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 780 m 22055 660 l 22159 721 l 22159 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 660 m 22055 540 l 22159 601 l 22159 721 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 2520 m 22159 2400 l 22263 2460 l 22263 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 2400 m 22159 2280 l 22263 2340 l 22263 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 2280 m 22159 2160 l 22263 2220 l 22263 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 2160 m 22159 2040 l 22263 2100 l 22263 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 2040 m 22159 1920 l 22263 1980 l 22263 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 1920 m 22159 1800 l 22263 1861 l 22263 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 1800 m 22159 1680 l 22263 1741 l 22263 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 1680 m 22159 1560 l 22263 1621 l 22263 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 1560 m 22159 1440 l 22263 1501 l 22263 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 1440 m 22159 1320 l 22263 1381 l 22263 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 1320 m 22159 1200 l 22263 1261 l 22263 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 1200 m 22159 1080 l 22263 1141 l 22263 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 1080 m 22159 960 l 22263 1021 l 22263 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 960 m 22159 840 l 22263 901 l 22263 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 840 m 22159 720 l 22263 781 l 22263 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 720 m 22159 600 l 22263 661 l 22263 781 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 2580 m 22263 2460 l 22367 2520 l 22367 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 2460 m 22263 2340 l 22367 2400 l 22367 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 2340 m 22263 2220 l 22367 2280 l 22367 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 2220 m 22263 2100 l 22367 2160 l 22367 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 2100 m 22263 1980 l 22367 2040 l 22367 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 1980 m 22263 1860 l 22367 1920 l 22367 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 1860 m 22263 1740 l 22367 1801 l 22367 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 1740 m 22263 1620 l 22367 1681 l 22367 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 1620 m 22263 1500 l 22367 1561 l 22367 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 1500 m 22263 1380 l 22367 1441 l 22367 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 1380 m 22263 1260 l 22367 1321 l 22367 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 1260 m 22263 1140 l 22367 1201 l 22367 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 1140 m 22263 1020 l 22367 1081 l 22367 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 1020 m 22263 900 l 22367 961 l 22367 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 900 m 22263 780 l 22367 841 l 22367 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 780 m 22263 660 l 22367 721 l 22367 841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 2640 m 22367 2520 l 22470 2580 l 22470 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 2520 m 22367 2400 l 22470 2460 l 22470 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 2400 m 22367 2280 l 22470 2340 l 22470 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 2280 m 22367 2160 l 22470 2220 l 22470 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 2160 m 22367 2040 l 22470 2100 l 22470 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 2040 m 22367 1920 l 22470 1980 l 22470 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 1920 m 22367 1800 l 22470 1861 l 22470 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 1800 m 22367 1680 l 22470 1741 l 22470 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 1680 m 22367 1560 l 22470 1621 l 22470 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 1560 m 22367 1440 l 22470 1501 l 22470 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 1440 m 22367 1320 l 22470 1381 l 22470 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 1320 m 22367 1200 l 22470 1261 l 22470 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 1200 m 22367 1080 l 22470 1141 l 22470 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 1080 m 22367 960 l 22470 1021 l 22470 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 960 m 22367 840 l 22470 901 l 22470 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 840 m 22367 720 l 22470 781 l 22470 901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 2700 m 22470 2580 l 22574 2640 l 22574 2760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 2580 m 22470 2460 l 22574 2520 l 22574 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 2460 m 22470 2340 l 22574 2400 l 22574 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 2340 m 22470 2220 l 22574 2280 l 22574 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 2220 m 22470 2100 l 22574 2160 l 22574 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 2100 m 22470 1980 l 22574 2040 l 22574 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 1980 m 22470 1860 l 22574 1920 l 22574 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 1860 m 22470 1740 l 22574 1801 l 22574 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 1740 m 22470 1620 l 22574 1681 l 22574 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 1620 m 22470 1500 l 22574 1561 l 22574 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 1500 m 22470 1380 l 22574 1441 l 22574 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 1380 m 22470 1260 l 22574 1321 l 22574 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 1260 m 22470 1140 l 22574 1201 l 22574 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 1140 m 22470 1020 l 22574 1081 l 22574 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 1020 m 22470 900 l 22574 961 l 22574 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 900 m 22470 780 l 22574 841 l 22574 961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 2760 m 22574 2640 l 22678 2700 l 22678 2820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 2640 m 22574 2520 l 22678 2580 l 22678 2700 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 2520 m 22574 2400 l 22678 2460 l 22678 2580 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 2400 m 22574 2280 l 22678 2340 l 22678 2460 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 2280 m 22574 2160 l 22678 2220 l 22678 2340 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 2160 m 22574 2040 l 22678 2100 l 22678 2220 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 2040 m 22574 1920 l 22678 1980 l 22678 2100 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 1920 m 22574 1800 l 22678 1861 l 22678 1980 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 1800 m 22574 1680 l 22678 1741 l 22678 1861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 1680 m 22574 1560 l 22678 1621 l 22678 1741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 1560 m 22574 1440 l 22678 1501 l 22678 1621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 1440 m 22574 1320 l 22678 1381 l 22678 1501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 1320 m 22574 1200 l 22678 1261 l 22678 1381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 1200 m 22574 1080 l 22678 1141 l 22678 1261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 1080 m 22574 960 l 22678 1021 l 22678 1141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 960 m 22574 840 l 22678 901 l 22678 1021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 2820 m 22678 2700 l 22782 2760 l 22782 2880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 2700 m 22678 2580 l 22782 2640 l 22782 2760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 2580 m 22678 2460 l 22782 2520 l 22782 2640 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 2460 m 22678 2340 l 22782 2400 l 22782 2520 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 2340 m 22678 2220 l 22782 2280 l 22782 2400 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 2220 m 22678 2100 l 22782 2160 l 22782 2280 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 2100 m 22678 1980 l 22782 2040 l 22782 2160 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 1980 m 22678 1860 l 22782 1920 l 22782 2040 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 1860 m 22678 1740 l 22782 1801 l 22782 1920 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 1740 m 22678 1620 l 22782 1681 l 22782 1801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 1620 m 22678 1500 l 22782 1561 l 22782 1681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 1500 m 22678 1380 l 22782 1441 l 22782 1561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 1380 m 22678 1260 l 22782 1321 l 22782 1441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 1260 m 22678 1140 l 22782 1201 l 22782 1321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 1140 m 22678 1020 l 22782 1081 l 22782 1201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 1020 m 22678 900 l 22782 961 l 22782 1081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 1680 m 21223 1741 l 21120 1800 l 21017 1740 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 21017 1740 m 21120 1801 l 21017 1860 l 20913 1800 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 20913 1920 m 21017 1980 l 20913 2039 l 20809 1979 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 20809 1980 m 20913 2040 l 20809 2099 l 20705 2039 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 20705 2040 m 20809 2100 l 20705 2159 l 20601 2099 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 20601 2100 m 20705 2160 l 20601 2219 l 20497 2159 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 20497 2160 m 20601 2220 l 20497 2279 l 20393 2219 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 20393 2220 m 20497 2280 l 20393 2339 l 20289 2279 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 20289 2400 m 20393 2460 l 20289 2519 l 20185 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 2460 m 20289 2520 l 20185 2579 l 20081 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 2520 m 20185 2580 l 20081 2639 l 19977 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 2580 m 20081 2640 l 19977 2699 l 19873 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 2640 m 19977 2700 l 19873 2759 l 19770 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 2700 m 19873 2760 l 19770 2819 l 19666 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 2760 m 19770 2820 l 19666 2879 l 19562 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19562 2820 m 19666 2880 l 19562 2939 l 19458 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 1860 m 21327 1920 l 21223 1979 l 21120 1920 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 21120 1920 m 21223 1980 l 21120 2039 l 21017 1979 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 21017 1980 m 21120 2040 l 21017 2099 l 20913 2039 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 20913 2040 m 21017 2100 l 20913 2159 l 20809 2099 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 20809 2220 m 20913 2280 l 20809 2339 l 20705 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 2280 m 20809 2340 l 20705 2399 l 20601 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 2340 m 20705 2400 l 20601 2459 l 20497 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 2400 m 20601 2460 l 20497 2519 l 20393 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 2460 m 20497 2520 l 20393 2579 l 20289 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 2520 m 20393 2580 l 20289 2639 l 20185 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 2580 m 20289 2640 l 20185 2699 l 20081 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 2640 m 20185 2700 l 20081 2759 l 19977 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 2700 m 20081 2760 l 19977 2819 l 19873 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 2760 m 19977 2820 l 19873 2879 l 19770 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 2820 m 19873 2880 l 19770 2939 l 19666 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19666 2880 m 19770 2940 l 19666 2999 l 19562 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 1920 m 21431 1980 l 21327 2039 l 21223 1979 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 21223 2100 m 21327 2160 l 21223 2219 l 21120 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 2160 m 21223 2220 l 21120 2279 l 21017 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 2220 m 21120 2280 l 21017 2339 l 20913 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 2280 m 21017 2340 l 20913 2399 l 20809 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 2340 m 20913 2400 l 20809 2459 l 20705 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 2400 m 20809 2460 l 20705 2519 l 20601 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 2460 m 20705 2520 l 20601 2579 l 20497 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 2520 m 20601 2580 l 20497 2639 l 20393 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 2580 m 20497 2640 l 20393 2699 l 20289 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 2640 m 20393 2700 l 20289 2759 l 20185 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 2700 m 20289 2760 l 20185 2819 l 20081 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 2760 m 20185 2820 l 20081 2879 l 19977 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 2820 m 20081 2880 l 19977 2939 l 19873 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 2880 m 19977 2940 l 19873 2999 l 19770 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19770 2940 m 19873 3000 l 19770 3059 l 19666 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 2100 m 21535 2160 l 21431 2219 l 21327 2159 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 2160 m 21431 2220 l 21327 2279 l 21223 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 2220 m 21327 2280 l 21223 2339 l 21120 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 2280 m 21223 2340 l 21120 2399 l 21017 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 2340 m 21120 2400 l 21017 2459 l 20913 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 2400 m 21017 2460 l 20913 2519 l 20809 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 2460 m 20913 2520 l 20809 2579 l 20705 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 2520 m 20809 2580 l 20705 2639 l 20601 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 2580 m 20705 2640 l 20601 2699 l 20497 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 2640 m 20601 2700 l 20497 2759 l 20393 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 2700 m 20497 2760 l 20393 2819 l 20289 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 2760 m 20393 2820 l 20289 2879 l 20185 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 2820 m 20289 2880 l 20185 2939 l 20081 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 2880 m 20185 2940 l 20081 2999 l 19977 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 2940 m 20081 3000 l 19977 3059 l 19873 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19873 3000 m 19977 3060 l 19873 3119 l 19770 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 2160 m 21639 2220 l 21535 2279 l 21431 2219 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 2220 m 21535 2280 l 21431 2339 l 21327 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 2280 m 21431 2340 l 21327 2399 l 21223 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 2340 m 21327 2400 l 21223 2459 l 21120 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 2400 m 21223 2460 l 21120 2519 l 21017 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 2460 m 21120 2520 l 21017 2579 l 20913 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 2520 m 21017 2580 l 20913 2639 l 20809 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 2580 m 20913 2640 l 20809 2699 l 20705 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 2640 m 20809 2700 l 20705 2759 l 20601 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 2700 m 20705 2760 l 20601 2819 l 20497 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 2760 m 20601 2820 l 20497 2879 l 20393 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 2820 m 20497 2880 l 20393 2939 l 20289 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 2880 m 20393 2940 l 20289 2999 l 20185 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 2940 m 20289 3000 l 20185 3059 l 20081 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 3000 m 20185 3060 l 20081 3119 l 19977 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 19977 3060 m 20081 3120 l 19977 3179 l 19873 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 2220 m 21743 2280 l 21639 2339 l 21535 2279 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 2280 m 21639 2340 l 21535 2399 l 21431 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 2340 m 21535 2400 l 21431 2459 l 21327 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 2400 m 21431 2460 l 21327 2519 l 21223 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 2460 m 21327 2520 l 21223 2579 l 21120 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 2520 m 21223 2580 l 21120 2639 l 21017 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 2580 m 21120 2640 l 21017 2699 l 20913 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 2640 m 21017 2700 l 20913 2759 l 20809 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 2700 m 20913 2760 l 20809 2819 l 20705 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 2760 m 20809 2820 l 20705 2879 l 20601 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 2820 m 20705 2880 l 20601 2939 l 20497 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 2880 m 20601 2940 l 20497 2999 l 20393 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 2940 m 20497 3000 l 20393 3059 l 20289 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 3000 m 20393 3060 l 20289 3119 l 20185 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 3060 m 20289 3120 l 20185 3179 l 20081 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20081 3120 m 20185 3180 l 20081 3239 l 19977 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 2280 m 21847 2340 l 21743 2399 l 21639 2339 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 2340 m 21743 2400 l 21639 2459 l 21535 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 2400 m 21639 2460 l 21535 2519 l 21431 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 2460 m 21535 2520 l 21431 2579 l 21327 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 2520 m 21431 2580 l 21327 2639 l 21223 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 2580 m 21327 2640 l 21223 2699 l 21120 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 2640 m 21223 2700 l 21120 2759 l 21017 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 2700 m 21120 2760 l 21017 2819 l 20913 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 2760 m 21017 2820 l 20913 2879 l 20809 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 2820 m 20913 2880 l 20809 2939 l 20705 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 2880 m 20809 2940 l 20705 2999 l 20601 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 2940 m 20705 3000 l 20601 3059 l 20497 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 3000 m 20601 3060 l 20497 3119 l 20393 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 3060 m 20497 3120 l 20393 3179 l 20289 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 3120 m 20393 3180 l 20289 3239 l 20185 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20185 3180 m 20289 3240 l 20185 3299 l 20081 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 2340 m 21951 2400 l 21847 2459 l 21743 2399 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 2400 m 21847 2460 l 21743 2519 l 21639 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 2460 m 21743 2520 l 21639 2579 l 21535 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 2520 m 21639 2580 l 21535 2639 l 21431 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 2580 m 21535 2640 l 21431 2699 l 21327 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 2640 m 21431 2700 l 21327 2759 l 21223 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 2700 m 21327 2760 l 21223 2819 l 21120 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 2760 m 21223 2820 l 21120 2879 l 21017 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 2820 m 21120 2880 l 21017 2939 l 20913 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 2880 m 21017 2940 l 20913 2999 l 20809 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 2940 m 20913 3000 l 20809 3059 l 20705 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 3000 m 20809 3060 l 20705 3119 l 20601 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 3060 m 20705 3120 l 20601 3179 l 20497 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 3120 m 20601 3180 l 20497 3239 l 20393 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 3180 m 20497 3240 l 20393 3299 l 20289 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20289 3240 m 20393 3300 l 20289 3359 l 20185 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 2400 m 22055 2460 l 21951 2519 l 21847 2459 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 2460 m 21951 2520 l 21847 2579 l 21743 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 2520 m 21847 2580 l 21743 2639 l 21639 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 2580 m 21743 2640 l 21639 2699 l 21535 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 2640 m 21639 2700 l 21535 2759 l 21431 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 2700 m 21535 2760 l 21431 2819 l 21327 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 2760 m 21431 2820 l 21327 2879 l 21223 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 2820 m 21327 2880 l 21223 2939 l 21120 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 2880 m 21223 2940 l 21120 2999 l 21017 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 2940 m 21120 3000 l 21017 3059 l 20913 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 3000 m 21017 3060 l 20913 3119 l 20809 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 3060 m 20913 3120 l 20809 3179 l 20705 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 3120 m 20809 3180 l 20705 3239 l 20601 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 3180 m 20705 3240 l 20601 3299 l 20497 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 3240 m 20601 3300 l 20497 3359 l 20393 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20393 3300 m 20497 3360 l 20393 3419 l 20289 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 2460 m 22159 2520 l 22055 2579 l 21951 2519 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 2520 m 22055 2580 l 21951 2639 l 21847 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 2580 m 21951 2640 l 21847 2699 l 21743 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 2640 m 21847 2700 l 21743 2759 l 21639 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 2700 m 21743 2760 l 21639 2819 l 21535 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 2760 m 21639 2820 l 21535 2879 l 21431 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 2820 m 21535 2880 l 21431 2939 l 21327 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 2880 m 21431 2940 l 21327 2999 l 21223 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 2940 m 21327 3000 l 21223 3059 l 21120 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 3000 m 21223 3060 l 21120 3119 l 21017 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 3060 m 21120 3120 l 21017 3179 l 20913 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 3120 m 21017 3180 l 20913 3239 l 20809 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 3180 m 20913 3240 l 20809 3299 l 20705 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 3240 m 20809 3300 l 20705 3359 l 20601 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 3300 m 20705 3360 l 20601 3419 l 20497 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20497 3360 m 20601 3420 l 20497 3479 l 20393 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 2520 m 22263 2580 l 22159 2639 l 22055 2579 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 2580 m 22159 2640 l 22055 2699 l 21951 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 2640 m 22055 2700 l 21951 2759 l 21847 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 2700 m 21951 2760 l 21847 2819 l 21743 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 2760 m 21847 2820 l 21743 2879 l 21639 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 2820 m 21743 2880 l 21639 2939 l 21535 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 2880 m 21639 2940 l 21535 2999 l 21431 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 2940 m 21535 3000 l 21431 3059 l 21327 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 3000 m 21431 3060 l 21327 3119 l 21223 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 3060 m 21327 3120 l 21223 3179 l 21120 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 3120 m 21223 3180 l 21120 3239 l 21017 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 3180 m 21120 3240 l 21017 3299 l 20913 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 3240 m 21017 3300 l 20913 3359 l 20809 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 3300 m 20913 3360 l 20809 3419 l 20705 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 3360 m 20809 3420 l 20705 3479 l 20601 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20601 3420 m 20705 3480 l 20601 3539 l 20497 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 2580 m 22367 2640 l 22263 2699 l 22159 2639 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 2640 m 22263 2700 l 22159 2759 l 22055 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 2700 m 22159 2760 l 22055 2819 l 21951 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 2760 m 22055 2820 l 21951 2879 l 21847 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 2820 m 21951 2880 l 21847 2939 l 21743 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 2880 m 21847 2940 l 21743 2999 l 21639 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 2940 m 21743 3000 l 21639 3059 l 21535 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 3000 m 21639 3060 l 21535 3119 l 21431 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 3060 m 21535 3120 l 21431 3179 l 21327 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 3120 m 21431 3180 l 21327 3239 l 21223 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 3180 m 21327 3240 l 21223 3299 l 21120 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 3240 m 21223 3300 l 21120 3359 l 21017 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 3300 m 21120 3360 l 21017 3419 l 20913 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 3360 m 21017 3420 l 20913 3479 l 20809 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 3420 m 20913 3480 l 20809 3539 l 20705 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20705 3480 m 20809 3540 l 20705 3599 l 20601 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 2640 m 22470 2700 l 22367 2759 l 22263 2699 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 2700 m 22367 2760 l 22263 2819 l 22159 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 2760 m 22263 2820 l 22159 2879 l 22055 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 2820 m 22159 2880 l 22055 2939 l 21951 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 2880 m 22055 2940 l 21951 2999 l 21847 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 2940 m 21951 3000 l 21847 3059 l 21743 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 3000 m 21847 3060 l 21743 3119 l 21639 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 3060 m 21743 3120 l 21639 3179 l 21535 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 3120 m 21639 3180 l 21535 3239 l 21431 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 3180 m 21535 3240 l 21431 3299 l 21327 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 3240 m 21431 3300 l 21327 3359 l 21223 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 3300 m 21327 3360 l 21223 3419 l 21120 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 3360 m 21223 3420 l 21120 3479 l 21017 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 3420 m 21120 3480 l 21017 3539 l 20913 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 3480 m 21017 3540 l 20913 3599 l 20809 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20809 3540 m 20913 3600 l 20809 3659 l 20705 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 2700 m 22574 2760 l 22470 2819 l 22367 2759 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 2760 m 22470 2820 l 22367 2879 l 22263 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 2820 m 22367 2880 l 22263 2939 l 22159 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 2880 m 22263 2940 l 22159 2999 l 22055 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 2940 m 22159 3000 l 22055 3059 l 21951 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 3000 m 22055 3060 l 21951 3119 l 21847 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 3060 m 21951 3120 l 21847 3179 l 21743 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 3120 m 21847 3180 l 21743 3239 l 21639 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 3180 m 21743 3240 l 21639 3299 l 21535 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 3240 m 21639 3300 l 21535 3359 l 21431 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 3300 m 21535 3360 l 21431 3419 l 21327 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 3360 m 21431 3420 l 21327 3479 l 21223 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 3420 m 21327 3480 l 21223 3539 l 21120 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 3480 m 21223 3540 l 21120 3599 l 21017 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 3540 m 21120 3600 l 21017 3659 l 20913 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 20913 3600 m 21017 3660 l 20913 3719 l 20809 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 2760 m 22678 2820 l 22574 2879 l 22470 2819 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 2820 m 22574 2880 l 22470 2939 l 22367 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 2880 m 22470 2940 l 22367 2999 l 22263 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 2940 m 22367 3000 l 22263 3059 l 22159 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 3000 m 22263 3060 l 22159 3119 l 22055 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 3060 m 22159 3120 l 22055 3179 l 21951 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 3120 m 22055 3180 l 21951 3239 l 21847 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 3180 m 21951 3240 l 21847 3299 l 21743 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 3240 m 21847 3300 l 21743 3359 l 21639 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 3300 m 21743 3360 l 21639 3419 l 21535 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 3360 m 21639 3420 l 21535 3479 l 21431 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 3420 m 21535 3480 l 21431 3539 l 21327 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 3480 m 21431 3540 l 21327 3599 l 21223 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 3540 m 21327 3600 l 21223 3659 l 21120 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 3600 m 21223 3660 l 21120 3719 l 21017 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21017 3660 m 21120 3720 l 21017 3779 l 20913 3719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22678 2820 m 22782 2880 l 22678 2939 l 22574 2879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22574 2880 m 22678 2940 l 22574 2999 l 22470 2939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22470 2940 m 22574 3000 l 22470 3059 l 22367 2999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22367 3000 m 22470 3060 l 22367 3119 l 22263 3059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22263 3060 m 22367 3120 l 22263 3179 l 22159 3119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22159 3120 m 22263 3180 l 22159 3239 l 22055 3179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 22055 3180 m 22159 3240 l 22055 3299 l 21951 3239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21951 3240 m 22055 3300 l 21951 3359 l 21847 3299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21847 3300 m 21951 3360 l 21847 3419 l 21743 3359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21743 3360 m 21847 3420 l 21743 3479 l 21639 3419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21639 3420 m 21743 3480 l 21639 3539 l 21535 3479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21535 3480 m 21639 3540 l 21535 3599 l 21431 3539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21431 3540 m 21535 3600 l 21431 3659 l 21327 3599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21327 3600 m 21431 3660 l 21327 3719 l 21223 3659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21223 3660 m 21327 3720 l 21223 3779 l 21120 3719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 21120 3720 m 21223 3780 l 21120 3839 l 21017 3779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 5820 m 1920 5879 l 1920 5760 l 2023 5701 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 2023 5700 m 1920 5760 l 1920 5640 l 2023 5581 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1920 5520 m 1817 5580 l 1817 5460 l 1920 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 5400 m 1817 5460 l 1817 5340 l 1920 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 5280 m 1817 5340 l 1817 5220 l 1920 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 5160 m 1817 5220 l 1817 5100 l 1920 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 5040 m 1817 5100 l 1817 4980 l 1920 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4920 m 1817 4980 l 1817 4860 l 1920 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4800 m 1817 4860 l 1817 4740 l 1920 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4680 m 1817 4740 l 1817 4620 l 1920 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4560 m 1817 4620 l 1817 4500 l 1920 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4440 m 1817 4500 l 1817 4380 l 1920 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4320 m 1817 4380 l 1817 4260 l 1920 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4200 m 1817 4260 l 1817 4140 l 1920 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4080 m 1817 4140 l 1817 4020 l 1920 3961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 3960 m 1817 4020 l 1817 3900 l 1920 3841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 5880 m 1817 5939 l 1817 5819 l 1920 5760 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1920 5760 m 1817 5819 l 1817 5700 l 1920 5641 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1817 5580 m 1713 5640 l 1713 5520 l 1817 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 5460 m 1713 5520 l 1713 5400 l 1817 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 5340 m 1713 5400 l 1713 5280 l 1817 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 5220 m 1713 5280 l 1713 5160 l 1817 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 5100 m 1713 5160 l 1713 5040 l 1817 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 4980 m 1713 5040 l 1713 4920 l 1817 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 4860 m 1713 4920 l 1713 4800 l 1817 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 4740 m 1713 4800 l 1713 4680 l 1817 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 4620 m 1713 4680 l 1713 4560 l 1817 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 4500 m 1713 4560 l 1713 4440 l 1817 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 4380 m 1713 4440 l 1713 4320 l 1817 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 4260 m 1713 4320 l 1713 4200 l 1817 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 4140 m 1713 4200 l 1713 4080 l 1817 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 4020 m 1713 4080 l 1713 3960 l 1817 3901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 5940 m 1713 5999 l 1713 5879 l 1817 5820 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1817 5820 m 1713 5879 l 1713 5760 l 1817 5701 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1713 5640 m 1609 5700 l 1609 5580 l 1713 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 5520 m 1609 5580 l 1609 5460 l 1713 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 5400 m 1609 5460 l 1609 5340 l 1713 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 5280 m 1609 5340 l 1609 5220 l 1713 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 5160 m 1609 5220 l 1609 5100 l 1713 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 5040 m 1609 5100 l 1609 4980 l 1713 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 4920 m 1609 4980 l 1609 4860 l 1713 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 4800 m 1609 4860 l 1609 4740 l 1713 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 4680 m 1609 4740 l 1609 4620 l 1713 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 4560 m 1609 4620 l 1609 4500 l 1713 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 4440 m 1609 4500 l 1609 4380 l 1713 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 4320 m 1609 4380 l 1609 4260 l 1713 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 4200 m 1609 4260 l 1609 4140 l 1713 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 4080 m 1609 4140 l 1609 4020 l 1713 3961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 6000 m 1609 6059 l 1609 5939 l 1713 5880 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1713 5880 m 1609 5939 l 1609 5819 l 1713 5760 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1609 5700 m 1505 5760 l 1505 5640 l 1609 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 5580 m 1505 5640 l 1505 5520 l 1609 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 5460 m 1505 5520 l 1505 5400 l 1609 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 5340 m 1505 5400 l 1505 5280 l 1609 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 5220 m 1505 5280 l 1505 5160 l 1609 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 5100 m 1505 5160 l 1505 5040 l 1609 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 4980 m 1505 5040 l 1505 4920 l 1609 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 4860 m 1505 4920 l 1505 4800 l 1609 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 4740 m 1505 4800 l 1505 4680 l 1609 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 4620 m 1505 4680 l 1505 4560 l 1609 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 4500 m 1505 4560 l 1505 4440 l 1609 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 4380 m 1505 4440 l 1505 4320 l 1609 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 4260 m 1505 4320 l 1505 4200 l 1609 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 4140 m 1505 4200 l 1505 4080 l 1609 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 6060 m 1505 6119 l 1505 5999 l 1609 5940 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1609 5940 m 1505 5999 l 1505 5879 l 1609 5820 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1505 5760 m 1401 5819 l 1401 5700 l 1505 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 5640 m 1401 5700 l 1401 5580 l 1505 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 5520 m 1401 5580 l 1401 5460 l 1505 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 5400 m 1401 5460 l 1401 5340 l 1505 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 5280 m 1401 5340 l 1401 5220 l 1505 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 5160 m 1401 5220 l 1401 5100 l 1505 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 5040 m 1401 5100 l 1401 4980 l 1505 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 4920 m 1401 4980 l 1401 4860 l 1505 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 4800 m 1401 4860 l 1401 4740 l 1505 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 4680 m 1401 4740 l 1401 4620 l 1505 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 4560 m 1401 4620 l 1401 4500 l 1505 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 4440 m 1401 4500 l 1401 4380 l 1505 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 4320 m 1401 4380 l 1401 4260 l 1505 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 4200 m 1401 4260 l 1401 4140 l 1505 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 6120 m 1401 6179 l 1401 6059 l 1505 6000 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1505 6000 m 1401 6059 l 1401 5939 l 1505 5880 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1401 5820 m 1297 5879 l 1297 5760 l 1401 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 5700 m 1297 5760 l 1297 5640 l 1401 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 5580 m 1297 5640 l 1297 5520 l 1401 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 5460 m 1297 5520 l 1297 5400 l 1401 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 5340 m 1297 5400 l 1297 5280 l 1401 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 5220 m 1297 5280 l 1297 5160 l 1401 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 5100 m 1297 5160 l 1297 5040 l 1401 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 4980 m 1297 5040 l 1297 4920 l 1401 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 4860 m 1297 4920 l 1297 4800 l 1401 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 4740 m 1297 4800 l 1297 4680 l 1401 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 4620 m 1297 4680 l 1297 4560 l 1401 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 4500 m 1297 4560 l 1297 4440 l 1401 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 4380 m 1297 4440 l 1297 4320 l 1401 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 4260 m 1297 4320 l 1297 4200 l 1401 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 6180 m 1297 6239 l 1297 6119 l 1401 6060 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1297 6000 m 1193 6059 l 1193 5939 l 1297 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 5880 m 1193 5939 l 1193 5819 l 1297 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 5760 m 1193 5819 l 1193 5700 l 1297 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 5640 m 1193 5700 l 1193 5580 l 1297 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 5520 m 1193 5580 l 1193 5460 l 1297 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 5400 m 1193 5460 l 1193 5340 l 1297 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 5280 m 1193 5340 l 1193 5220 l 1297 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 5160 m 1193 5220 l 1193 5100 l 1297 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 5040 m 1193 5100 l 1193 4980 l 1297 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 4920 m 1193 4980 l 1193 4860 l 1297 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 4800 m 1193 4860 l 1193 4740 l 1297 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 4680 m 1193 4740 l 1193 4620 l 1297 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 4560 m 1193 4620 l 1193 4500 l 1297 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 4440 m 1193 4500 l 1193 4380 l 1297 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 4320 m 1193 4380 l 1193 4260 l 1297 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 6240 m 1193 6299 l 1193 6179 l 1297 6120 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1193 6060 m 1089 6119 l 1089 5999 l 1193 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 5940 m 1089 5999 l 1089 5879 l 1193 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 5820 m 1089 5879 l 1089 5760 l 1193 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 5700 m 1089 5760 l 1089 5640 l 1193 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 5580 m 1089 5640 l 1089 5520 l 1193 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 5460 m 1089 5520 l 1089 5400 l 1193 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 5340 m 1089 5400 l 1089 5280 l 1193 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 5220 m 1089 5280 l 1089 5160 l 1193 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 5100 m 1089 5160 l 1089 5040 l 1193 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 4980 m 1089 5040 l 1089 4920 l 1193 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 4860 m 1089 4920 l 1089 4800 l 1193 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 4740 m 1089 4800 l 1089 4680 l 1193 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 4620 m 1089 4680 l 1089 4560 l 1193 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 4500 m 1089 4560 l 1089 4440 l 1193 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 4380 m 1089 4440 l 1089 4320 l 1193 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 6300 m 1089 6359 l 1089 6239 l 1193 6180 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 1089 6120 m 985 6179 l 985 6059 l 1089 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 6000 m 985 6059 l 985 5939 l 1089 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 5880 m 985 5939 l 985 5819 l 1089 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 5760 m 985 5819 l 985 5700 l 1089 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 5640 m 985 5700 l 985 5580 l 1089 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 5520 m 985 5580 l 985 5460 l 1089 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 5400 m 985 5460 l 985 5340 l 1089 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 5280 m 985 5340 l 985 5220 l 1089 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 5160 m 985 5220 l 985 5100 l 1089 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 5040 m 985 5100 l 985 4980 l 1089 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 4920 m 985 4980 l 985 4860 l 1089 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 4800 m 985 4860 l 985 4740 l 1089 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 4680 m 985 4740 l 985 4620 l 1089 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 4560 m 985 4620 l 985 4500 l 1089 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 4440 m 985 4500 l 985 4380 l 1089 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 6300 m 881 6359 l 881 6239 l 985 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 6180 m 881 6239 l 881 6119 l 985 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 6060 m 881 6119 l 881 5999 l 985 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 5940 m 881 5999 l 881 5879 l 985 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 5820 m 881 5879 l 881 5760 l 985 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 5700 m 881 5760 l 881 5640 l 985 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 5580 m 881 5640 l 881 5520 l 985 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 5460 m 881 5520 l 881 5400 l 985 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 5340 m 881 5400 l 881 5280 l 985 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 5220 m 881 5280 l 881 5160 l 985 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 5100 m 881 5160 l 881 5040 l 985 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 4980 m 881 5040 l 881 4920 l 985 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 4860 m 881 4920 l 881 4800 l 985 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 4740 m 881 4800 l 881 4680 l 985 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 4620 m 881 4680 l 881 4560 l 985 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 4500 m 881 4560 l 881 4440 l 985 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 6360 m 777 6419 l 777 6299 l 881 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 6240 m 777 6299 l 777 6179 l 881 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 6120 m 777 6179 l 777 6059 l 881 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 6000 m 777 6059 l 777 5939 l 881 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 5880 m 777 5939 l 777 5819 l 881 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 5760 m 777 5819 l 777 5700 l 881 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 5640 m 777 5700 l 777 5580 l 881 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 5520 m 777 5580 l 777 5460 l 881 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 5400 m 777 5460 l 777 5340 l 881 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 5280 m 777 5340 l 777 5220 l 881 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 5160 m 777 5220 l 777 5100 l 881 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 5040 m 777 5100 l 777 4980 l 881 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 4920 m 777 4980 l 777 4860 l 881 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 4800 m 777 4860 l 777 4740 l 881 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 4680 m 777 4740 l 777 4620 l 881 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 4560 m 777 4620 l 777 4500 l 881 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 6420 m 673 6479 l 673 6359 l 777 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 6300 m 673 6359 l 673 6239 l 777 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 6180 m 673 6239 l 673 6119 l 777 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 6060 m 673 6119 l 673 5999 l 777 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 5940 m 673 5999 l 673 5879 l 777 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 5820 m 673 5879 l 673 5760 l 777 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 5700 m 673 5760 l 673 5640 l 777 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 5580 m 673 5640 l 673 5520 l 777 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 5460 m 673 5520 l 673 5400 l 777 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 5340 m 673 5400 l 673 5280 l 777 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 5220 m 673 5280 l 673 5160 l 777 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 5100 m 673 5160 l 673 5040 l 777 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 4980 m 673 5040 l 673 4920 l 777 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 4860 m 673 4920 l 673 4800 l 777 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 4740 m 673 4800 l 673 4680 l 777 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 4620 m 673 4680 l 673 4560 l 777 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 6480 m 570 6539 l 570 6419 l 673 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 6360 m 570 6419 l 570 6299 l 673 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 6240 m 570 6299 l 570 6179 l 673 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 6120 m 570 6179 l 570 6059 l 673 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 6000 m 570 6059 l 570 5939 l 673 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 5880 m 570 5939 l 570 5819 l 673 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 5760 m 570 5819 l 570 5700 l 673 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 5640 m 570 5700 l 570 5580 l 673 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 5520 m 570 5580 l 570 5460 l 673 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 5400 m 570 5460 l 570 5340 l 673 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 5280 m 570 5340 l 570 5220 l 673 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 5160 m 570 5220 l 570 5100 l 673 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 5040 m 570 5100 l 570 4980 l 673 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 4920 m 570 4980 l 570 4860 l 673 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 4800 m 570 4860 l 570 4740 l 673 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 4680 m 570 4740 l 570 4620 l 673 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 6540 m 466 6599 l 466 6479 l 570 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 6420 m 466 6479 l 466 6359 l 570 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 6300 m 466 6359 l 466 6239 l 570 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 6180 m 466 6239 l 466 6119 l 570 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 6060 m 466 6119 l 466 5999 l 570 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 5940 m 466 5999 l 466 5879 l 570 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 5820 m 466 5879 l 466 5760 l 570 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 5700 m 466 5760 l 466 5640 l 570 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 5580 m 466 5640 l 466 5520 l 570 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 5460 m 466 5520 l 466 5400 l 570 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 5340 m 466 5400 l 466 5280 l 570 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 5220 m 466 5280 l 466 5160 l 570 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 5100 m 466 5160 l 466 5040 l 570 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 4980 m 466 5040 l 466 4920 l 570 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 4860 m 466 4920 l 466 4800 l 570 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 4740 m 466 4800 l 466 4680 l 570 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 6600 m 362 6659 l 362 6539 l 466 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 6480 m 362 6539 l 362 6419 l 466 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 6360 m 362 6419 l 362 6299 l 466 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 6240 m 362 6299 l 362 6179 l 466 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 6120 m 362 6179 l 362 6059 l 466 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 6000 m 362 6059 l 362 5939 l 466 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 5880 m 362 5939 l 362 5819 l 466 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 5760 m 362 5819 l 362 5700 l 466 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 5640 m 362 5700 l 362 5580 l 466 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 5520 m 362 5580 l 362 5460 l 466 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 5400 m 362 5460 l 362 5340 l 466 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 5280 m 362 5340 l 362 5220 l 466 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 5160 m 362 5220 l 362 5100 l 466 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 5040 m 362 5100 l 362 4980 l 466 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 4920 m 362 4980 l 362 4860 l 466 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 4800 m 362 4860 l 362 4740 l 466 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 6660 m 258 6719 l 258 6599 l 362 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 6540 m 258 6599 l 258 6479 l 362 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 6420 m 258 6479 l 258 6359 l 362 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 6300 m 258 6359 l 258 6239 l 362 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 6180 m 258 6239 l 258 6119 l 362 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 6060 m 258 6119 l 258 5999 l 362 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 5940 m 258 5999 l 258 5879 l 362 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 5820 m 258 5879 l 258 5760 l 362 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 5700 m 258 5760 l 258 5640 l 362 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 5580 m 258 5640 l 258 5520 l 362 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 5460 m 258 5520 l 258 5400 l 362 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 5340 m 258 5400 l 258 5280 l 362 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 5220 m 258 5280 l 258 5160 l 362 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 5100 m 258 5160 l 258 5040 l 362 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 4980 m 258 5040 l 258 4920 l 362 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 4860 m 258 4920 l 258 4800 l 362 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 6300 m 985 6180 l 1089 6240 l 1089 6360 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 1297 6000 m 1297 5880 l 1401 5940 l 1401 6060 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 1920 5520 m 1920 5400 l 2023 5461 l 2023 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 5400 m 1920 5280 l 2023 5341 l 2023 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 5280 m 1920 5160 l 2023 5221 l 2023 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 5160 m 1920 5040 l 2023 5101 l 2023 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 5040 m 1920 4920 l 2023 4981 l 2023 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4920 m 1920 4800 l 2023 4861 l 2023 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4800 m 1920 4680 l 2023 4741 l 2023 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4680 m 1920 4560 l 2023 4621 l 2023 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4560 m 1920 4440 l 2023 4501 l 2023 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4440 m 1920 4320 l 2023 4381 l 2023 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4320 m 1920 4200 l 2023 4261 l 2023 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4200 m 1920 4080 l 2023 4141 l 2023 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 4080 m 1920 3960 l 2023 4021 l 2023 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 3960 m 1920 3840 l 2023 3901 l 2023 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 5820 m 2023 5700 l 2127 5760 l 2127 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 5700 m 2023 5580 l 2127 5641 l 2127 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 5580 m 2023 5460 l 2127 5521 l 2127 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 5460 m 2023 5340 l 2127 5401 l 2127 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 5340 m 2023 5220 l 2127 5281 l 2127 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 5220 m 2023 5100 l 2127 5161 l 2127 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 5100 m 2023 4980 l 2127 5041 l 2127 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 4980 m 2023 4860 l 2127 4921 l 2127 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 4860 m 2023 4740 l 2127 4801 l 2127 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 4740 m 2023 4620 l 2127 4681 l 2127 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 4620 m 2023 4500 l 2127 4561 l 2127 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 4500 m 2023 4380 l 2127 4441 l 2127 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 4380 m 2023 4260 l 2127 4321 l 2127 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 4260 m 2023 4140 l 2127 4201 l 2127 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 4140 m 2023 4020 l 2127 4081 l 2127 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 4020 m 2023 3900 l 2127 3961 l 2127 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 5880 m 2127 5760 l 2231 5820 l 2231 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 5760 m 2127 5640 l 2231 5701 l 2231 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 5640 m 2127 5520 l 2231 5581 l 2231 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 5520 m 2127 5400 l 2231 5461 l 2231 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 5400 m 2127 5280 l 2231 5341 l 2231 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 5280 m 2127 5160 l 2231 5221 l 2231 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 5160 m 2127 5040 l 2231 5101 l 2231 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 5040 m 2127 4920 l 2231 4981 l 2231 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 4920 m 2127 4800 l 2231 4861 l 2231 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 4800 m 2127 4680 l 2231 4741 l 2231 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 4680 m 2127 4560 l 2231 4621 l 2231 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 4560 m 2127 4440 l 2231 4501 l 2231 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 4440 m 2127 4320 l 2231 4381 l 2231 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 4320 m 2127 4200 l 2231 4261 l 2231 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 4200 m 2127 4080 l 2231 4141 l 2231 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 4080 m 2127 3960 l 2231 4021 l 2231 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 5940 m 2231 5820 l 2335 5880 l 2335 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 5820 m 2231 5700 l 2335 5760 l 2335 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 5700 m 2231 5580 l 2335 5641 l 2335 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 5580 m 2231 5460 l 2335 5521 l 2335 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 5460 m 2231 5340 l 2335 5401 l 2335 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 5340 m 2231 5220 l 2335 5281 l 2335 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 5220 m 2231 5100 l 2335 5161 l 2335 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 5100 m 2231 4980 l 2335 5041 l 2335 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 4980 m 2231 4860 l 2335 4921 l 2335 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 4860 m 2231 4740 l 2335 4801 l 2335 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 4740 m 2231 4620 l 2335 4681 l 2335 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 4620 m 2231 4500 l 2335 4561 l 2335 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 4500 m 2231 4380 l 2335 4441 l 2335 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 4380 m 2231 4260 l 2335 4321 l 2335 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 4260 m 2231 4140 l 2335 4201 l 2335 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 4140 m 2231 4020 l 2335 4081 l 2335 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 6000 m 2335 5880 l 2439 5940 l 2439 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 5880 m 2335 5760 l 2439 5820 l 2439 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 5760 m 2335 5640 l 2439 5701 l 2439 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 5640 m 2335 5520 l 2439 5581 l 2439 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 5520 m 2335 5400 l 2439 5461 l 2439 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 5400 m 2335 5280 l 2439 5341 l 2439 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 5280 m 2335 5160 l 2439 5221 l 2439 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 5160 m 2335 5040 l 2439 5101 l 2439 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 5040 m 2335 4920 l 2439 4981 l 2439 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 4920 m 2335 4800 l 2439 4861 l 2439 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 4800 m 2335 4680 l 2439 4741 l 2439 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 4680 m 2335 4560 l 2439 4621 l 2439 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 4560 m 2335 4440 l 2439 4501 l 2439 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 4440 m 2335 4320 l 2439 4381 l 2439 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 4320 m 2335 4200 l 2439 4261 l 2439 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 4200 m 2335 4080 l 2439 4141 l 2439 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 6060 m 2439 5940 l 2543 6000 l 2543 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 5940 m 2439 5820 l 2543 5880 l 2543 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 5820 m 2439 5700 l 2543 5760 l 2543 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 5700 m 2439 5580 l 2543 5641 l 2543 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 5580 m 2439 5460 l 2543 5521 l 2543 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 5460 m 2439 5340 l 2543 5401 l 2543 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 5340 m 2439 5220 l 2543 5281 l 2543 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 5220 m 2439 5100 l 2543 5161 l 2543 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 5100 m 2439 4980 l 2543 5041 l 2543 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 4980 m 2439 4860 l 2543 4921 l 2543 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 4860 m 2439 4740 l 2543 4801 l 2543 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 4740 m 2439 4620 l 2543 4681 l 2543 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 4620 m 2439 4500 l 2543 4561 l 2543 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 4500 m 2439 4380 l 2543 4441 l 2543 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 4380 m 2439 4260 l 2543 4321 l 2543 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 4260 m 2439 4140 l 2543 4201 l 2543 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 6120 m 2543 6000 l 2647 6060 l 2647 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 6000 m 2543 5880 l 2647 5940 l 2647 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 5880 m 2543 5760 l 2647 5820 l 2647 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 5760 m 2543 5640 l 2647 5701 l 2647 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 5640 m 2543 5520 l 2647 5581 l 2647 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 5520 m 2543 5400 l 2647 5461 l 2647 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 5400 m 2543 5280 l 2647 5341 l 2647 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 5280 m 2543 5160 l 2647 5221 l 2647 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 5160 m 2543 5040 l 2647 5101 l 2647 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 5040 m 2543 4920 l 2647 4981 l 2647 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 4920 m 2543 4800 l 2647 4861 l 2647 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 4800 m 2543 4680 l 2647 4741 l 2647 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 4680 m 2543 4560 l 2647 4621 l 2647 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 4560 m 2543 4440 l 2647 4501 l 2647 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 4440 m 2543 4320 l 2647 4381 l 2647 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 4320 m 2543 4200 l 2647 4261 l 2647 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 6180 m 2647 6060 l 2751 6120 l 2751 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 6060 m 2647 5940 l 2751 6000 l 2751 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 5940 m 2647 5820 l 2751 5880 l 2751 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 5820 m 2647 5700 l 2751 5760 l 2751 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 5700 m 2647 5580 l 2751 5641 l 2751 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 5580 m 2647 5460 l 2751 5521 l 2751 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 5460 m 2647 5340 l 2751 5401 l 2751 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 5340 m 2647 5220 l 2751 5281 l 2751 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 5220 m 2647 5100 l 2751 5161 l 2751 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 5100 m 2647 4980 l 2751 5041 l 2751 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 4980 m 2647 4860 l 2751 4921 l 2751 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 4860 m 2647 4740 l 2751 4801 l 2751 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 4740 m 2647 4620 l 2751 4681 l 2751 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 4620 m 2647 4500 l 2751 4561 l 2751 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 4500 m 2647 4380 l 2751 4441 l 2751 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 4380 m 2647 4260 l 2751 4321 l 2751 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 6240 m 2751 6120 l 2855 6180 l 2855 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 6120 m 2751 6000 l 2855 6060 l 2855 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 6000 m 2751 5880 l 2855 5940 l 2855 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 5880 m 2751 5760 l 2855 5820 l 2855 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 5760 m 2751 5640 l 2855 5701 l 2855 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 5640 m 2751 5520 l 2855 5581 l 2855 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 5520 m 2751 5400 l 2855 5461 l 2855 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 5400 m 2751 5280 l 2855 5341 l 2855 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 5280 m 2751 5160 l 2855 5221 l 2855 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 5160 m 2751 5040 l 2855 5101 l 2855 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 5040 m 2751 4920 l 2855 4981 l 2855 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 4920 m 2751 4800 l 2855 4861 l 2855 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 4800 m 2751 4680 l 2855 4741 l 2855 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 4680 m 2751 4560 l 2855 4621 l 2855 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 4560 m 2751 4440 l 2855 4501 l 2855 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 4440 m 2751 4320 l 2855 4381 l 2855 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 6300 m 2855 6180 l 2959 6240 l 2959 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 6180 m 2855 6060 l 2959 6120 l 2959 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 6060 m 2855 5940 l 2959 6000 l 2959 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 5940 m 2855 5820 l 2959 5880 l 2959 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 5820 m 2855 5700 l 2959 5760 l 2959 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 5700 m 2855 5580 l 2959 5641 l 2959 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 5580 m 2855 5460 l 2959 5521 l 2959 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 5460 m 2855 5340 l 2959 5401 l 2959 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 5340 m 2855 5220 l 2959 5281 l 2959 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 5220 m 2855 5100 l 2959 5161 l 2959 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 5100 m 2855 4980 l 2959 5041 l 2959 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 4980 m 2855 4860 l 2959 4921 l 2959 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 4860 m 2855 4740 l 2959 4801 l 2959 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 4740 m 2855 4620 l 2959 4681 l 2959 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 4620 m 2855 4500 l 2959 4561 l 2959 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 4500 m 2855 4380 l 2959 4441 l 2959 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 6360 m 2959 6240 l 3063 6300 l 3063 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 6240 m 2959 6120 l 3063 6180 l 3063 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 6120 m 2959 6000 l 3063 6060 l 3063 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 6000 m 2959 5880 l 3063 5940 l 3063 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 5880 m 2959 5760 l 3063 5820 l 3063 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 5760 m 2959 5640 l 3063 5701 l 3063 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 5640 m 2959 5520 l 3063 5581 l 3063 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 5520 m 2959 5400 l 3063 5461 l 3063 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 5400 m 2959 5280 l 3063 5341 l 3063 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 5280 m 2959 5160 l 3063 5221 l 3063 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 5160 m 2959 5040 l 3063 5101 l 3063 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 5040 m 2959 4920 l 3063 4981 l 3063 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 4920 m 2959 4800 l 3063 4861 l 3063 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 4800 m 2959 4680 l 3063 4741 l 3063 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 4680 m 2959 4560 l 3063 4621 l 3063 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 4560 m 2959 4440 l 3063 4501 l 3063 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 6420 m 3063 6300 l 3167 6360 l 3167 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 6300 m 3063 6180 l 3167 6240 l 3167 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 6180 m 3063 6060 l 3167 6120 l 3167 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 6060 m 3063 5940 l 3167 6000 l 3167 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 5940 m 3063 5820 l 3167 5880 l 3167 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 5820 m 3063 5700 l 3167 5760 l 3167 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 5700 m 3063 5580 l 3167 5641 l 3167 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 5580 m 3063 5460 l 3167 5521 l 3167 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 5460 m 3063 5340 l 3167 5401 l 3167 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 5340 m 3063 5220 l 3167 5281 l 3167 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 5220 m 3063 5100 l 3167 5161 l 3167 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 5100 m 3063 4980 l 3167 5041 l 3167 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 4980 m 3063 4860 l 3167 4921 l 3167 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 4860 m 3063 4740 l 3167 4801 l 3167 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 4740 m 3063 4620 l 3167 4681 l 3167 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 4620 m 3063 4500 l 3167 4561 l 3167 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 6480 m 3167 6360 l 3270 6420 l 3270 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 6360 m 3167 6240 l 3270 6300 l 3270 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 6240 m 3167 6120 l 3270 6180 l 3270 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 6120 m 3167 6000 l 3270 6060 l 3270 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 6000 m 3167 5880 l 3270 5940 l 3270 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 5880 m 3167 5760 l 3270 5820 l 3270 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 5760 m 3167 5640 l 3270 5701 l 3270 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 5640 m 3167 5520 l 3270 5581 l 3270 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 5520 m 3167 5400 l 3270 5461 l 3270 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 5400 m 3167 5280 l 3270 5341 l 3270 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 5280 m 3167 5160 l 3270 5221 l 3270 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 5160 m 3167 5040 l 3270 5101 l 3270 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 5040 m 3167 4920 l 3270 4981 l 3270 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 4920 m 3167 4800 l 3270 4861 l 3270 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 4800 m 3167 4680 l 3270 4741 l 3270 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 4680 m 3167 4560 l 3270 4621 l 3270 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 6540 m 3270 6420 l 3374 6480 l 3374 6600 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 6420 m 3270 6300 l 3374 6360 l 3374 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 6300 m 3270 6180 l 3374 6240 l 3374 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 6180 m 3270 6060 l 3374 6120 l 3374 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 6060 m 3270 5940 l 3374 6000 l 3374 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 5940 m 3270 5820 l 3374 5880 l 3374 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 5820 m 3270 5700 l 3374 5760 l 3374 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 5700 m 3270 5580 l 3374 5641 l 3374 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 5580 m 3270 5460 l 3374 5521 l 3374 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 5460 m 3270 5340 l 3374 5401 l 3374 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 5340 m 3270 5220 l 3374 5281 l 3374 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 5220 m 3270 5100 l 3374 5161 l 3374 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 5100 m 3270 4980 l 3374 5041 l 3374 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 4980 m 3270 4860 l 3374 4921 l 3374 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 4860 m 3270 4740 l 3374 4801 l 3374 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 4740 m 3270 4620 l 3374 4681 l 3374 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 6600 m 3374 6480 l 3478 6540 l 3478 6660 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 6480 m 3374 6360 l 3478 6420 l 3478 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 6360 m 3374 6240 l 3478 6300 l 3478 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 6240 m 3374 6120 l 3478 6180 l 3478 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 6120 m 3374 6000 l 3478 6060 l 3478 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 6000 m 3374 5880 l 3478 5940 l 3478 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 5880 m 3374 5760 l 3478 5820 l 3478 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 5760 m 3374 5640 l 3478 5701 l 3478 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 5640 m 3374 5520 l 3478 5581 l 3478 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 5520 m 3374 5400 l 3478 5461 l 3478 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 5400 m 3374 5280 l 3478 5341 l 3478 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 5280 m 3374 5160 l 3478 5221 l 3478 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 5160 m 3374 5040 l 3478 5101 l 3478 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 5040 m 3374 4920 l 3478 4981 l 3478 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 4920 m 3374 4800 l 3478 4861 l 3478 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 4800 m 3374 4680 l 3478 4741 l 3478 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 6660 m 3478 6540 l 3582 6600 l 3582 6720 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 6540 m 3478 6420 l 3582 6480 l 3582 6600 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 6420 m 3478 6300 l 3582 6360 l 3582 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 6300 m 3478 6180 l 3582 6240 l 3582 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 6180 m 3478 6060 l 3582 6120 l 3582 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 6060 m 3478 5940 l 3582 6000 l 3582 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 5940 m 3478 5820 l 3582 5880 l 3582 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 5820 m 3478 5700 l 3582 5760 l 3582 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 5700 m 3478 5580 l 3582 5641 l 3582 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 5580 m 3478 5460 l 3582 5521 l 3582 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 5460 m 3478 5340 l 3582 5401 l 3582 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 5340 m 3478 5220 l 3582 5281 l 3582 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 5220 m 3478 5100 l 3582 5161 l 3582 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 5100 m 3478 4980 l 3582 5041 l 3582 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 4980 m 3478 4860 l 3582 4921 l 3582 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 4860 m 3478 4740 l 3582 4801 l 3582 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 5520 m 2023 5581 l 1920 5640 l 1817 5580 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1817 5580 m 1920 5641 l 1817 5700 l 1713 5640 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1713 5640 m 1817 5701 l 1713 5760 l 1609 5700 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1609 5700 m 1713 5760 l 1609 5819 l 1505 5760 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1505 5760 m 1609 5820 l 1505 5879 l 1401 5819 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1401 5820 m 1505 5880 l 1401 5939 l 1297 5879 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1297 6000 m 1401 6060 l 1297 6119 l 1193 6059 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1193 6060 m 1297 6120 l 1193 6179 l 1089 6119 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 1089 6120 m 1193 6180 l 1089 6239 l 985 6179 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 985 6300 m 1089 6360 l 985 6419 l 881 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 6360 m 985 6420 l 881 6479 l 777 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 6420 m 881 6480 l 777 6539 l 673 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 6480 m 777 6540 l 673 6599 l 570 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 6540 m 673 6600 l 570 6659 l 466 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 6600 m 570 6660 l 466 6719 l 362 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 362 6660 m 466 6720 l 362 6779 l 258 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 5820 m 2127 5880 l 2023 5939 l 1920 5879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 5880 m 2023 5940 l 1920 5999 l 1817 5939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 5940 m 1920 6000 l 1817 6059 l 1713 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 6000 m 1817 6060 l 1713 6119 l 1609 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 6060 m 1713 6120 l 1609 6179 l 1505 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 6120 m 1609 6180 l 1505 6239 l 1401 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 6180 m 1505 6240 l 1401 6299 l 1297 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 6240 m 1401 6300 l 1297 6359 l 1193 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 6300 m 1297 6360 l 1193 6419 l 1089 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 6360 m 1193 6420 l 1089 6479 l 985 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 6420 m 1089 6480 l 985 6539 l 881 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 6480 m 985 6540 l 881 6599 l 777 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 6540 m 881 6600 l 777 6659 l 673 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 6600 m 777 6660 l 673 6719 l 570 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 6660 m 673 6720 l 570 6779 l 466 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 466 6720 m 570 6780 l 466 6839 l 362 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 5880 m 2231 5940 l 2127 5999 l 2023 5939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 5940 m 2127 6000 l 2023 6059 l 1920 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 6000 m 2023 6060 l 1920 6119 l 1817 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 6060 m 1920 6120 l 1817 6179 l 1713 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 6120 m 1817 6180 l 1713 6239 l 1609 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 6180 m 1713 6240 l 1609 6299 l 1505 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 6240 m 1609 6300 l 1505 6359 l 1401 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 6300 m 1505 6360 l 1401 6419 l 1297 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 6360 m 1401 6420 l 1297 6479 l 1193 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 6420 m 1297 6480 l 1193 6539 l 1089 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 6480 m 1193 6540 l 1089 6599 l 985 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 6540 m 1089 6600 l 985 6659 l 881 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 6600 m 985 6660 l 881 6719 l 777 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 6660 m 881 6720 l 777 6779 l 673 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 6720 m 777 6780 l 673 6839 l 570 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 570 6780 m 673 6840 l 570 6899 l 466 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 5940 m 2335 6000 l 2231 6059 l 2127 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 6000 m 2231 6060 l 2127 6119 l 2023 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 6060 m 2127 6120 l 2023 6179 l 1920 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 6120 m 2023 6180 l 1920 6239 l 1817 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 6180 m 1920 6240 l 1817 6299 l 1713 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 6240 m 1817 6300 l 1713 6359 l 1609 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 6300 m 1713 6360 l 1609 6419 l 1505 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 6360 m 1609 6420 l 1505 6479 l 1401 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 6420 m 1505 6480 l 1401 6539 l 1297 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 6480 m 1401 6540 l 1297 6599 l 1193 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 6540 m 1297 6600 l 1193 6659 l 1089 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 6600 m 1193 6660 l 1089 6719 l 985 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 6660 m 1089 6720 l 985 6779 l 881 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 6720 m 985 6780 l 881 6839 l 777 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 6780 m 881 6840 l 777 6899 l 673 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 673 6840 m 777 6900 l 673 6959 l 570 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 6000 m 2439 6060 l 2335 6119 l 2231 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 6060 m 2335 6120 l 2231 6179 l 2127 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 6120 m 2231 6180 l 2127 6239 l 2023 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 6180 m 2127 6240 l 2023 6299 l 1920 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 6240 m 2023 6300 l 1920 6359 l 1817 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 6300 m 1920 6360 l 1817 6419 l 1713 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 6360 m 1817 6420 l 1713 6479 l 1609 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 6420 m 1713 6480 l 1609 6539 l 1505 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 6480 m 1609 6540 l 1505 6599 l 1401 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 6540 m 1505 6600 l 1401 6659 l 1297 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 6600 m 1401 6660 l 1297 6719 l 1193 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 6660 m 1297 6720 l 1193 6779 l 1089 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 6720 m 1193 6780 l 1089 6839 l 985 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 6780 m 1089 6840 l 985 6899 l 881 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 6840 m 985 6900 l 881 6959 l 777 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 777 6900 m 881 6960 l 777 7019 l 673 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 6060 m 2543 6120 l 2439 6179 l 2335 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 6120 m 2439 6180 l 2335 6239 l 2231 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 6180 m 2335 6240 l 2231 6299 l 2127 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 6240 m 2231 6300 l 2127 6359 l 2023 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 6300 m 2127 6360 l 2023 6419 l 1920 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 6360 m 2023 6420 l 1920 6479 l 1817 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 6420 m 1920 6480 l 1817 6539 l 1713 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 6480 m 1817 6540 l 1713 6599 l 1609 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 6540 m 1713 6600 l 1609 6659 l 1505 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 6600 m 1609 6660 l 1505 6719 l 1401 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 6660 m 1505 6720 l 1401 6779 l 1297 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 6720 m 1401 6780 l 1297 6839 l 1193 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 6780 m 1297 6840 l 1193 6899 l 1089 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 6840 m 1193 6900 l 1089 6959 l 985 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 6900 m 1089 6960 l 985 7019 l 881 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 881 6960 m 985 7020 l 881 7079 l 777 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 6120 m 2647 6180 l 2543 6239 l 2439 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 6180 m 2543 6240 l 2439 6299 l 2335 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 6240 m 2439 6300 l 2335 6359 l 2231 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 6300 m 2335 6360 l 2231 6419 l 2127 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 6360 m 2231 6420 l 2127 6479 l 2023 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 6420 m 2127 6480 l 2023 6539 l 1920 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 6480 m 2023 6540 l 1920 6599 l 1817 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 6540 m 1920 6600 l 1817 6659 l 1713 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 6600 m 1817 6660 l 1713 6719 l 1609 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 6660 m 1713 6720 l 1609 6779 l 1505 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 6720 m 1609 6780 l 1505 6839 l 1401 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 6780 m 1505 6840 l 1401 6899 l 1297 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 6840 m 1401 6900 l 1297 6959 l 1193 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 6900 m 1297 6960 l 1193 7019 l 1089 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 6960 m 1193 7020 l 1089 7079 l 985 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 985 7020 m 1089 7080 l 985 7139 l 881 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 6180 m 2751 6240 l 2647 6299 l 2543 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 6240 m 2647 6300 l 2543 6359 l 2439 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 6300 m 2543 6360 l 2439 6419 l 2335 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 6360 m 2439 6420 l 2335 6479 l 2231 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 6420 m 2335 6480 l 2231 6539 l 2127 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 6480 m 2231 6540 l 2127 6599 l 2023 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 6540 m 2127 6600 l 2023 6659 l 1920 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 6600 m 2023 6660 l 1920 6719 l 1817 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 6660 m 1920 6720 l 1817 6779 l 1713 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 6720 m 1817 6780 l 1713 6839 l 1609 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 6780 m 1713 6840 l 1609 6899 l 1505 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 6840 m 1609 6900 l 1505 6959 l 1401 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 6900 m 1505 6960 l 1401 7019 l 1297 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 6960 m 1401 7020 l 1297 7079 l 1193 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 7020 m 1297 7080 l 1193 7139 l 1089 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1089 7080 m 1193 7140 l 1089 7199 l 985 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 6240 m 2855 6300 l 2751 6359 l 2647 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 6300 m 2751 6360 l 2647 6419 l 2543 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 6360 m 2647 6420 l 2543 6479 l 2439 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 6420 m 2543 6480 l 2439 6539 l 2335 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 6480 m 2439 6540 l 2335 6599 l 2231 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 6540 m 2335 6600 l 2231 6659 l 2127 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 6600 m 2231 6660 l 2127 6719 l 2023 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 6660 m 2127 6720 l 2023 6779 l 1920 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 6720 m 2023 6780 l 1920 6839 l 1817 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 6780 m 1920 6840 l 1817 6899 l 1713 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 6840 m 1817 6900 l 1713 6959 l 1609 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 6900 m 1713 6960 l 1609 7019 l 1505 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 6960 m 1609 7020 l 1505 7079 l 1401 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 7020 m 1505 7080 l 1401 7139 l 1297 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 7080 m 1401 7140 l 1297 7199 l 1193 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1193 7140 m 1297 7200 l 1193 7259 l 1089 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 6300 m 2959 6360 l 2855 6419 l 2751 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 6360 m 2855 6420 l 2751 6479 l 2647 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 6420 m 2751 6480 l 2647 6539 l 2543 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 6480 m 2647 6540 l 2543 6599 l 2439 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 6540 m 2543 6600 l 2439 6659 l 2335 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 6600 m 2439 6660 l 2335 6719 l 2231 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 6660 m 2335 6720 l 2231 6779 l 2127 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 6720 m 2231 6780 l 2127 6839 l 2023 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 6780 m 2127 6840 l 2023 6899 l 1920 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 6840 m 2023 6900 l 1920 6959 l 1817 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 6900 m 1920 6960 l 1817 7019 l 1713 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 6960 m 1817 7020 l 1713 7079 l 1609 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 7020 m 1713 7080 l 1609 7139 l 1505 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 7080 m 1609 7140 l 1505 7199 l 1401 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 7140 m 1505 7200 l 1401 7259 l 1297 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1297 7200 m 1401 7260 l 1297 7319 l 1193 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 6360 m 3063 6420 l 2959 6479 l 2855 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 6420 m 2959 6480 l 2855 6539 l 2751 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 6480 m 2855 6540 l 2751 6599 l 2647 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 6540 m 2751 6600 l 2647 6659 l 2543 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 6600 m 2647 6660 l 2543 6719 l 2439 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 6660 m 2543 6720 l 2439 6779 l 2335 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 6720 m 2439 6780 l 2335 6839 l 2231 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 6780 m 2335 6840 l 2231 6899 l 2127 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 6840 m 2231 6900 l 2127 6959 l 2023 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 6900 m 2127 6960 l 2023 7019 l 1920 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 6960 m 2023 7020 l 1920 7079 l 1817 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 7020 m 1920 7080 l 1817 7139 l 1713 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 7080 m 1817 7140 l 1713 7199 l 1609 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 7140 m 1713 7200 l 1609 7259 l 1505 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 7200 m 1609 7260 l 1505 7319 l 1401 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1401 7260 m 1505 7320 l 1401 7379 l 1297 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 6420 m 3167 6480 l 3063 6539 l 2959 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 6480 m 3063 6540 l 2959 6599 l 2855 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 6540 m 2959 6600 l 2855 6659 l 2751 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 6600 m 2855 6660 l 2751 6719 l 2647 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 6660 m 2751 6720 l 2647 6779 l 2543 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 6720 m 2647 6780 l 2543 6839 l 2439 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 6780 m 2543 6840 l 2439 6899 l 2335 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 6840 m 2439 6900 l 2335 6959 l 2231 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 6900 m 2335 6960 l 2231 7019 l 2127 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 6960 m 2231 7020 l 2127 7079 l 2023 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 7020 m 2127 7080 l 2023 7139 l 1920 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 7080 m 2023 7140 l 1920 7199 l 1817 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 7140 m 1920 7200 l 1817 7259 l 1713 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 7200 m 1817 7260 l 1713 7319 l 1609 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 7260 m 1713 7320 l 1609 7379 l 1505 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1505 7320 m 1609 7380 l 1505 7439 l 1401 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 6480 m 3270 6540 l 3167 6599 l 3063 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 6540 m 3167 6600 l 3063 6659 l 2959 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 6600 m 3063 6660 l 2959 6719 l 2855 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 6660 m 2959 6720 l 2855 6779 l 2751 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 6720 m 2855 6780 l 2751 6839 l 2647 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 6780 m 2751 6840 l 2647 6899 l 2543 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 6840 m 2647 6900 l 2543 6959 l 2439 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 6900 m 2543 6960 l 2439 7019 l 2335 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 6960 m 2439 7020 l 2335 7079 l 2231 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 7020 m 2335 7080 l 2231 7139 l 2127 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 7080 m 2231 7140 l 2127 7199 l 2023 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 7140 m 2127 7200 l 2023 7259 l 1920 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 7200 m 2023 7260 l 1920 7319 l 1817 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 7260 m 1920 7320 l 1817 7379 l 1713 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 7320 m 1817 7380 l 1713 7439 l 1609 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1609 7380 m 1713 7440 l 1609 7499 l 1505 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 6540 m 3374 6600 l 3270 6659 l 3167 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 6600 m 3270 6660 l 3167 6719 l 3063 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 6660 m 3167 6720 l 3063 6779 l 2959 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 6720 m 3063 6780 l 2959 6839 l 2855 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 6780 m 2959 6840 l 2855 6899 l 2751 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 6840 m 2855 6900 l 2751 6959 l 2647 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 6900 m 2751 6960 l 2647 7019 l 2543 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 6960 m 2647 7020 l 2543 7079 l 2439 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 7020 m 2543 7080 l 2439 7139 l 2335 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 7080 m 2439 7140 l 2335 7199 l 2231 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 7140 m 2335 7200 l 2231 7259 l 2127 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 7200 m 2231 7260 l 2127 7319 l 2023 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 7260 m 2127 7320 l 2023 7379 l 1920 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 7320 m 2023 7380 l 1920 7439 l 1817 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 7380 m 1920 7440 l 1817 7499 l 1713 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1713 7440 m 1817 7500 l 1713 7559 l 1609 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 6600 m 3478 6660 l 3374 6719 l 3270 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 6660 m 3374 6720 l 3270 6779 l 3167 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 6720 m 3270 6780 l 3167 6839 l 3063 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 6780 m 3167 6840 l 3063 6899 l 2959 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 6840 m 3063 6900 l 2959 6959 l 2855 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 6900 m 2959 6960 l 2855 7019 l 2751 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 6960 m 2855 7020 l 2751 7079 l 2647 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 7020 m 2751 7080 l 2647 7139 l 2543 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 7080 m 2647 7140 l 2543 7199 l 2439 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 7140 m 2543 7200 l 2439 7259 l 2335 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 7200 m 2439 7260 l 2335 7319 l 2231 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 7260 m 2335 7320 l 2231 7379 l 2127 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 7320 m 2231 7380 l 2127 7439 l 2023 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 7380 m 2127 7440 l 2023 7499 l 1920 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 7440 m 2023 7500 l 1920 7559 l 1817 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1817 7500 m 1920 7560 l 1817 7619 l 1713 7559 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3478 6660 m 3582 6720 l 3478 6779 l 3374 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3374 6720 m 3478 6780 l 3374 6839 l 3270 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3270 6780 m 3374 6840 l 3270 6899 l 3167 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3167 6840 m 3270 6900 l 3167 6959 l 3063 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 3063 6900 m 3167 6960 l 3063 7019 l 2959 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2959 6960 m 3063 7020 l 2959 7079 l 2855 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2855 7020 m 2959 7080 l 2855 7139 l 2751 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2751 7080 m 2855 7140 l 2751 7199 l 2647 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2647 7140 m 2751 7200 l 2647 7259 l 2543 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2543 7200 m 2647 7260 l 2543 7319 l 2439 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2439 7260 m 2543 7320 l 2439 7379 l 2335 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2335 7320 m 2439 7380 l 2335 7439 l 2231 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2231 7380 m 2335 7440 l 2231 7499 l 2127 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2127 7440 m 2231 7500 l 2127 7559 l 2023 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 2023 7500 m 2127 7560 l 2023 7619 l 1920 7559 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 1920 7560 m 2023 7620 l 1920 7679 l 1817 7619 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 5820 m 5760 5879 l 5760 5760 l 5863 5701 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5863 5700 m 5760 5760 l 5760 5640 l 5863 5581 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5863 5580 m 5760 5640 l 5760 5520 l 5863 5461 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5863 5460 m 5760 5520 l 5760 5400 l 5863 5341 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5863 5340 m 5760 5400 l 5760 5280 l 5863 5221 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5863 5220 m 5760 5280 l 5760 5160 l 5863 5101 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5863 5100 m 5760 5160 l 5760 5040 l 5863 4981 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5863 4980 m 5760 5040 l 5760 4920 l 5863 4861 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5760 4800 m 5657 4860 l 5657 4740 l 5760 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4680 m 5657 4740 l 5657 4620 l 5760 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4560 m 5657 4620 l 5657 4500 l 5760 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4440 m 5657 4500 l 5657 4380 l 5760 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4320 m 5657 4380 l 5657 4260 l 5760 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4200 m 5657 4260 l 5657 4140 l 5760 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4080 m 5657 4140 l 5657 4020 l 5760 3961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 3960 m 5657 4020 l 5657 3900 l 5760 3841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 5880 m 5657 5939 l 5657 5819 l 5760 5760 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5760 5760 m 5657 5819 l 5657 5700 l 5760 5641 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5760 5640 m 5657 5700 l 5657 5580 l 5760 5521 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5760 5520 m 5657 5580 l 5657 5460 l 5760 5401 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5657 5340 m 5553 5400 l 5553 5280 l 5657 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 5220 m 5553 5280 l 5553 5160 l 5657 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 5100 m 5553 5160 l 5553 5040 l 5657 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 4980 m 5553 5040 l 5553 4920 l 5657 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 4860 m 5553 4920 l 5553 4800 l 5657 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 4740 m 5553 4800 l 5553 4680 l 5657 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 4620 m 5553 4680 l 5553 4560 l 5657 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 4500 m 5553 4560 l 5553 4440 l 5657 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 4380 m 5553 4440 l 5553 4320 l 5657 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 4260 m 5553 4320 l 5553 4200 l 5657 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 4140 m 5553 4200 l 5553 4080 l 5657 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 4020 m 5553 4080 l 5553 3960 l 5657 3901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 5940 m 5553 5999 l 5553 5879 l 5657 5820 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5657 5820 m 5553 5879 l 5553 5760 l 5657 5701 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5657 5700 m 5553 5760 l 5553 5640 l 5657 5581 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 5553 5520 m 5449 5580 l 5449 5460 l 5553 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 5400 m 5449 5460 l 5449 5340 l 5553 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 5280 m 5449 5340 l 5449 5220 l 5553 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 5160 m 5449 5220 l 5449 5100 l 5553 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 5040 m 5449 5100 l 5449 4980 l 5553 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 4920 m 5449 4980 l 5449 4860 l 5553 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 4800 m 5449 4860 l 5449 4740 l 5553 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 4680 m 5449 4740 l 5449 4620 l 5553 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 4560 m 5449 4620 l 5449 4500 l 5553 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 4440 m 5449 4500 l 5449 4380 l 5553 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 4320 m 5449 4380 l 5449 4260 l 5553 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 4200 m 5449 4260 l 5449 4140 l 5553 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 4080 m 5449 4140 l 5449 4020 l 5553 3961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 5940 m 5345 5999 l 5345 5879 l 5449 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 5820 m 5345 5879 l 5345 5760 l 5449 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 5700 m 5345 5760 l 5345 5640 l 5449 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 5580 m 5345 5640 l 5345 5520 l 5449 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 5460 m 5345 5520 l 5345 5400 l 5449 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 5340 m 5345 5400 l 5345 5280 l 5449 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 5220 m 5345 5280 l 5345 5160 l 5449 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 5100 m 5345 5160 l 5345 5040 l 5449 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 4980 m 5345 5040 l 5345 4920 l 5449 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 4860 m 5345 4920 l 5345 4800 l 5449 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 4740 m 5345 4800 l 5345 4680 l 5449 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 4620 m 5345 4680 l 5345 4560 l 5449 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 4500 m 5345 4560 l 5345 4440 l 5449 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 4380 m 5345 4440 l 5345 4320 l 5449 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 4260 m 5345 4320 l 5345 4200 l 5449 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 4140 m 5345 4200 l 5345 4080 l 5449 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 6000 m 5241 6059 l 5241 5939 l 5345 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 5880 m 5241 5939 l 5241 5819 l 5345 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 5760 m 5241 5819 l 5241 5700 l 5345 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 5640 m 5241 5700 l 5241 5580 l 5345 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 5520 m 5241 5580 l 5241 5460 l 5345 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 5400 m 5241 5460 l 5241 5340 l 5345 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 5280 m 5241 5340 l 5241 5220 l 5345 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 5160 m 5241 5220 l 5241 5100 l 5345 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 5040 m 5241 5100 l 5241 4980 l 5345 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 4920 m 5241 4980 l 5241 4860 l 5345 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 4800 m 5241 4860 l 5241 4740 l 5345 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 4680 m 5241 4740 l 5241 4620 l 5345 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 4560 m 5241 4620 l 5241 4500 l 5345 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 4440 m 5241 4500 l 5241 4380 l 5345 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 4320 m 5241 4380 l 5241 4260 l 5345 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 4200 m 5241 4260 l 5241 4140 l 5345 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 6060 m 5137 6119 l 5137 5999 l 5241 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 5940 m 5137 5999 l 5137 5879 l 5241 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 5820 m 5137 5879 l 5137 5760 l 5241 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 5700 m 5137 5760 l 5137 5640 l 5241 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 5580 m 5137 5640 l 5137 5520 l 5241 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 5460 m 5137 5520 l 5137 5400 l 5241 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 5340 m 5137 5400 l 5137 5280 l 5241 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 5220 m 5137 5280 l 5137 5160 l 5241 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 5100 m 5137 5160 l 5137 5040 l 5241 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 4980 m 5137 5040 l 5137 4920 l 5241 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 4860 m 5137 4920 l 5137 4800 l 5241 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 4740 m 5137 4800 l 5137 4680 l 5241 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 4620 m 5137 4680 l 5137 4560 l 5241 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 4500 m 5137 4560 l 5137 4440 l 5241 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 4380 m 5137 4440 l 5137 4320 l 5241 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 4260 m 5137 4320 l 5137 4200 l 5241 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 6120 m 5033 6179 l 5033 6059 l 5137 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 6000 m 5033 6059 l 5033 5939 l 5137 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 5880 m 5033 5939 l 5033 5819 l 5137 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 5760 m 5033 5819 l 5033 5700 l 5137 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 5640 m 5033 5700 l 5033 5580 l 5137 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 5520 m 5033 5580 l 5033 5460 l 5137 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 5400 m 5033 5460 l 5033 5340 l 5137 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 5280 m 5033 5340 l 5033 5220 l 5137 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 5160 m 5033 5220 l 5033 5100 l 5137 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 5040 m 5033 5100 l 5033 4980 l 5137 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 4920 m 5033 4980 l 5033 4860 l 5137 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 4800 m 5033 4860 l 5033 4740 l 5137 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 4680 m 5033 4740 l 5033 4620 l 5137 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 4560 m 5033 4620 l 5033 4500 l 5137 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 4440 m 5033 4500 l 5033 4380 l 5137 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 4320 m 5033 4380 l 5033 4260 l 5137 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 6180 m 4929 6239 l 4929 6119 l 5033 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 6060 m 4929 6119 l 4929 5999 l 5033 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 5940 m 4929 5999 l 4929 5879 l 5033 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 5820 m 4929 5879 l 4929 5760 l 5033 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 5700 m 4929 5760 l 4929 5640 l 5033 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 5580 m 4929 5640 l 4929 5520 l 5033 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 5460 m 4929 5520 l 4929 5400 l 5033 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 5340 m 4929 5400 l 4929 5280 l 5033 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 5220 m 4929 5280 l 4929 5160 l 5033 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 5100 m 4929 5160 l 4929 5040 l 5033 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 4980 m 4929 5040 l 4929 4920 l 5033 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 4860 m 4929 4920 l 4929 4800 l 5033 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 4740 m 4929 4800 l 4929 4680 l 5033 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 4620 m 4929 4680 l 4929 4560 l 5033 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 4500 m 4929 4560 l 4929 4440 l 5033 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 4380 m 4929 4440 l 4929 4320 l 5033 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 6240 m 4825 6299 l 4825 6179 l 4929 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 6120 m 4825 6179 l 4825 6059 l 4929 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 6000 m 4825 6059 l 4825 5939 l 4929 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 5880 m 4825 5939 l 4825 5819 l 4929 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 5760 m 4825 5819 l 4825 5700 l 4929 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 5640 m 4825 5700 l 4825 5580 l 4929 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 5520 m 4825 5580 l 4825 5460 l 4929 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 5400 m 4825 5460 l 4825 5340 l 4929 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 5280 m 4825 5340 l 4825 5220 l 4929 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 5160 m 4825 5220 l 4825 5100 l 4929 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 5040 m 4825 5100 l 4825 4980 l 4929 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 4920 m 4825 4980 l 4825 4860 l 4929 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 4800 m 4825 4860 l 4825 4740 l 4929 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 4680 m 4825 4740 l 4825 4620 l 4929 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 4560 m 4825 4620 l 4825 4500 l 4929 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 4440 m 4825 4500 l 4825 4380 l 4929 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 6300 m 4721 6359 l 4721 6239 l 4825 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 6180 m 4721 6239 l 4721 6119 l 4825 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 6060 m 4721 6119 l 4721 5999 l 4825 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 5940 m 4721 5999 l 4721 5879 l 4825 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 5820 m 4721 5879 l 4721 5760 l 4825 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 5700 m 4721 5760 l 4721 5640 l 4825 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 5580 m 4721 5640 l 4721 5520 l 4825 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 5460 m 4721 5520 l 4721 5400 l 4825 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 5340 m 4721 5400 l 4721 5280 l 4825 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 5220 m 4721 5280 l 4721 5160 l 4825 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 5100 m 4721 5160 l 4721 5040 l 4825 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 4980 m 4721 5040 l 4721 4920 l 4825 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 4860 m 4721 4920 l 4721 4800 l 4825 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 4740 m 4721 4800 l 4721 4680 l 4825 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 4620 m 4721 4680 l 4721 4560 l 4825 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 4500 m 4721 4560 l 4721 4440 l 4825 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 6360 m 4617 6419 l 4617 6299 l 4721 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 6240 m 4617 6299 l 4617 6179 l 4721 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 6120 m 4617 6179 l 4617 6059 l 4721 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 6000 m 4617 6059 l 4617 5939 l 4721 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 5880 m 4617 5939 l 4617 5819 l 4721 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 5760 m 4617 5819 l 4617 5700 l 4721 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 5640 m 4617 5700 l 4617 5580 l 4721 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 5520 m 4617 5580 l 4617 5460 l 4721 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 5400 m 4617 5460 l 4617 5340 l 4721 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 5280 m 4617 5340 l 4617 5220 l 4721 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 5160 m 4617 5220 l 4617 5100 l 4721 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 5040 m 4617 5100 l 4617 4980 l 4721 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 4920 m 4617 4980 l 4617 4860 l 4721 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 4800 m 4617 4860 l 4617 4740 l 4721 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 4680 m 4617 4740 l 4617 4620 l 4721 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 4560 m 4617 4620 l 4617 4500 l 4721 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 6420 m 4513 6479 l 4513 6359 l 4617 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 6300 m 4513 6359 l 4513 6239 l 4617 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 6180 m 4513 6239 l 4513 6119 l 4617 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 6060 m 4513 6119 l 4513 5999 l 4617 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 5940 m 4513 5999 l 4513 5879 l 4617 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 5820 m 4513 5879 l 4513 5760 l 4617 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 5700 m 4513 5760 l 4513 5640 l 4617 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 5580 m 4513 5640 l 4513 5520 l 4617 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 5460 m 4513 5520 l 4513 5400 l 4617 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 5340 m 4513 5400 l 4513 5280 l 4617 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 5220 m 4513 5280 l 4513 5160 l 4617 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 5100 m 4513 5160 l 4513 5040 l 4617 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 4980 m 4513 5040 l 4513 4920 l 4617 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 4860 m 4513 4920 l 4513 4800 l 4617 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 4740 m 4513 4800 l 4513 4680 l 4617 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 4620 m 4513 4680 l 4513 4560 l 4617 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 6480 m 4410 6539 l 4410 6419 l 4513 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 6360 m 4410 6419 l 4410 6299 l 4513 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 6240 m 4410 6299 l 4410 6179 l 4513 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 6120 m 4410 6179 l 4410 6059 l 4513 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 6000 m 4410 6059 l 4410 5939 l 4513 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 5880 m 4410 5939 l 4410 5819 l 4513 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 5760 m 4410 5819 l 4410 5700 l 4513 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 5640 m 4410 5700 l 4410 5580 l 4513 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 5520 m 4410 5580 l 4410 5460 l 4513 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 5400 m 4410 5460 l 4410 5340 l 4513 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 5280 m 4410 5340 l 4410 5220 l 4513 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 5160 m 4410 5220 l 4410 5100 l 4513 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 5040 m 4410 5100 l 4410 4980 l 4513 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 4920 m 4410 4980 l 4410 4860 l 4513 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 4800 m 4410 4860 l 4410 4740 l 4513 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 4680 m 4410 4740 l 4410 4620 l 4513 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 6540 m 4306 6599 l 4306 6479 l 4410 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 6420 m 4306 6479 l 4306 6359 l 4410 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 6300 m 4306 6359 l 4306 6239 l 4410 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 6180 m 4306 6239 l 4306 6119 l 4410 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 6060 m 4306 6119 l 4306 5999 l 4410 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 5940 m 4306 5999 l 4306 5879 l 4410 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 5820 m 4306 5879 l 4306 5760 l 4410 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 5700 m 4306 5760 l 4306 5640 l 4410 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 5580 m 4306 5640 l 4306 5520 l 4410 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 5460 m 4306 5520 l 4306 5400 l 4410 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 5340 m 4306 5400 l 4306 5280 l 4410 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 5220 m 4306 5280 l 4306 5160 l 4410 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 5100 m 4306 5160 l 4306 5040 l 4410 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 4980 m 4306 5040 l 4306 4920 l 4410 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 4860 m 4306 4920 l 4306 4800 l 4410 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 4740 m 4306 4800 l 4306 4680 l 4410 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 6600 m 4202 6659 l 4202 6539 l 4306 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 6480 m 4202 6539 l 4202 6419 l 4306 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 6360 m 4202 6419 l 4202 6299 l 4306 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 6240 m 4202 6299 l 4202 6179 l 4306 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 6120 m 4202 6179 l 4202 6059 l 4306 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 6000 m 4202 6059 l 4202 5939 l 4306 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 5880 m 4202 5939 l 4202 5819 l 4306 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 5760 m 4202 5819 l 4202 5700 l 4306 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 5640 m 4202 5700 l 4202 5580 l 4306 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 5520 m 4202 5580 l 4202 5460 l 4306 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 5400 m 4202 5460 l 4202 5340 l 4306 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 5280 m 4202 5340 l 4202 5220 l 4306 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 5160 m 4202 5220 l 4202 5100 l 4306 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 5040 m 4202 5100 l 4202 4980 l 4306 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 4920 m 4202 4980 l 4202 4860 l 4306 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 4800 m 4202 4860 l 4202 4740 l 4306 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 6660 m 4098 6719 l 4098 6599 l 4202 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 6540 m 4098 6599 l 4098 6479 l 4202 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 6420 m 4098 6479 l 4098 6359 l 4202 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 6300 m 4098 6359 l 4098 6239 l 4202 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 6180 m 4098 6239 l 4098 6119 l 4202 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 6060 m 4098 6119 l 4098 5999 l 4202 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 5940 m 4098 5999 l 4098 5879 l 4202 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 5820 m 4098 5879 l 4098 5760 l 4202 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 5700 m 4098 5760 l 4098 5640 l 4202 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 5580 m 4098 5640 l 4098 5520 l 4202 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 5460 m 4098 5520 l 4098 5400 l 4202 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 5340 m 4098 5400 l 4098 5280 l 4202 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 5220 m 4098 5280 l 4098 5160 l 4202 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 5100 m 4098 5160 l 4098 5040 l 4202 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 4980 m 4098 5040 l 4098 4920 l 4202 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 4860 m 4098 4920 l 4098 4800 l 4202 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 5940 m 5449 5820 l 5553 5880 l 5553 6000 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5449 5820 m 5449 5700 l 5553 5760 l 5553 5880 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5449 5700 m 5449 5580 l 5553 5641 l 5553 5760 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5553 5520 m 5553 5400 l 5657 5461 l 5657 5581 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5657 5340 m 5657 5220 l 5760 5281 l 5760 5401 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5657 5220 m 5657 5100 l 5760 5161 l 5760 5281 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5657 5100 m 5657 4980 l 5760 5041 l 5760 5161 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5657 4980 m 5657 4860 l 5760 4921 l 5760 5041 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 5760 4800 m 5760 4680 l 5863 4741 l 5863 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4680 m 5760 4560 l 5863 4621 l 5863 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4560 m 5760 4440 l 5863 4501 l 5863 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4440 m 5760 4320 l 5863 4381 l 5863 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4320 m 5760 4200 l 5863 4261 l 5863 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4200 m 5760 4080 l 5863 4141 l 5863 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4080 m 5760 3960 l 5863 4021 l 5863 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 3960 m 5760 3840 l 5863 3901 l 5863 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 5820 m 5863 5700 l 5967 5760 l 5967 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 5700 m 5863 5580 l 5967 5641 l 5967 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 5580 m 5863 5460 l 5967 5521 l 5967 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 5460 m 5863 5340 l 5967 5401 l 5967 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 5340 m 5863 5220 l 5967 5281 l 5967 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 5220 m 5863 5100 l 5967 5161 l 5967 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 5100 m 5863 4980 l 5967 5041 l 5967 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 4980 m 5863 4860 l 5967 4921 l 5967 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 4860 m 5863 4740 l 5967 4801 l 5967 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 4740 m 5863 4620 l 5967 4681 l 5967 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 4620 m 5863 4500 l 5967 4561 l 5967 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 4500 m 5863 4380 l 5967 4441 l 5967 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 4380 m 5863 4260 l 5967 4321 l 5967 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 4260 m 5863 4140 l 5967 4201 l 5967 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 4140 m 5863 4020 l 5967 4081 l 5967 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 4020 m 5863 3900 l 5967 3961 l 5967 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 5880 m 5967 5760 l 6071 5820 l 6071 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 5760 m 5967 5640 l 6071 5701 l 6071 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 5640 m 5967 5520 l 6071 5581 l 6071 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 5520 m 5967 5400 l 6071 5461 l 6071 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 5400 m 5967 5280 l 6071 5341 l 6071 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 5280 m 5967 5160 l 6071 5221 l 6071 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 5160 m 5967 5040 l 6071 5101 l 6071 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 5040 m 5967 4920 l 6071 4981 l 6071 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 4920 m 5967 4800 l 6071 4861 l 6071 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 4800 m 5967 4680 l 6071 4741 l 6071 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 4680 m 5967 4560 l 6071 4621 l 6071 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 4560 m 5967 4440 l 6071 4501 l 6071 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 4440 m 5967 4320 l 6071 4381 l 6071 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 4320 m 5967 4200 l 6071 4261 l 6071 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 4200 m 5967 4080 l 6071 4141 l 6071 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 4080 m 5967 3960 l 6071 4021 l 6071 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 5940 m 6071 5820 l 6175 5880 l 6175 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 5820 m 6071 5700 l 6175 5760 l 6175 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 5700 m 6071 5580 l 6175 5641 l 6175 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 5580 m 6071 5460 l 6175 5521 l 6175 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 5460 m 6071 5340 l 6175 5401 l 6175 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 5340 m 6071 5220 l 6175 5281 l 6175 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 5220 m 6071 5100 l 6175 5161 l 6175 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 5100 m 6071 4980 l 6175 5041 l 6175 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 4980 m 6071 4860 l 6175 4921 l 6175 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 4860 m 6071 4740 l 6175 4801 l 6175 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 4740 m 6071 4620 l 6175 4681 l 6175 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 4620 m 6071 4500 l 6175 4561 l 6175 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 4500 m 6071 4380 l 6175 4441 l 6175 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 4380 m 6071 4260 l 6175 4321 l 6175 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 4260 m 6071 4140 l 6175 4201 l 6175 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 4140 m 6071 4020 l 6175 4081 l 6175 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 6000 m 6175 5880 l 6279 5940 l 6279 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 5880 m 6175 5760 l 6279 5820 l 6279 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 5760 m 6175 5640 l 6279 5701 l 6279 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 5640 m 6175 5520 l 6279 5581 l 6279 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 5520 m 6175 5400 l 6279 5461 l 6279 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 5400 m 6175 5280 l 6279 5341 l 6279 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 5280 m 6175 5160 l 6279 5221 l 6279 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 5160 m 6175 5040 l 6279 5101 l 6279 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 5040 m 6175 4920 l 6279 4981 l 6279 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 4920 m 6175 4800 l 6279 4861 l 6279 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 4800 m 6175 4680 l 6279 4741 l 6279 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 4680 m 6175 4560 l 6279 4621 l 6279 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 4560 m 6175 4440 l 6279 4501 l 6279 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 4440 m 6175 4320 l 6279 4381 l 6279 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 4320 m 6175 4200 l 6279 4261 l 6279 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 4200 m 6175 4080 l 6279 4141 l 6279 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 6060 m 6279 5940 l 6383 6000 l 6383 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 5940 m 6279 5820 l 6383 5880 l 6383 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 5820 m 6279 5700 l 6383 5760 l 6383 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 5700 m 6279 5580 l 6383 5641 l 6383 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 5580 m 6279 5460 l 6383 5521 l 6383 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 5460 m 6279 5340 l 6383 5401 l 6383 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 5340 m 6279 5220 l 6383 5281 l 6383 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 5220 m 6279 5100 l 6383 5161 l 6383 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 5100 m 6279 4980 l 6383 5041 l 6383 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 4980 m 6279 4860 l 6383 4921 l 6383 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 4860 m 6279 4740 l 6383 4801 l 6383 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 4740 m 6279 4620 l 6383 4681 l 6383 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 4620 m 6279 4500 l 6383 4561 l 6383 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 4500 m 6279 4380 l 6383 4441 l 6383 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 4380 m 6279 4260 l 6383 4321 l 6383 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 4260 m 6279 4140 l 6383 4201 l 6383 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 6120 m 6383 6000 l 6487 6060 l 6487 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 6000 m 6383 5880 l 6487 5940 l 6487 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 5880 m 6383 5760 l 6487 5820 l 6487 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 5760 m 6383 5640 l 6487 5701 l 6487 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 5640 m 6383 5520 l 6487 5581 l 6487 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 5520 m 6383 5400 l 6487 5461 l 6487 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 5400 m 6383 5280 l 6487 5341 l 6487 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 5280 m 6383 5160 l 6487 5221 l 6487 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 5160 m 6383 5040 l 6487 5101 l 6487 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 5040 m 6383 4920 l 6487 4981 l 6487 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 4920 m 6383 4800 l 6487 4861 l 6487 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 4800 m 6383 4680 l 6487 4741 l 6487 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 4680 m 6383 4560 l 6487 4621 l 6487 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 4560 m 6383 4440 l 6487 4501 l 6487 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 4440 m 6383 4320 l 6487 4381 l 6487 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 4320 m 6383 4200 l 6487 4261 l 6487 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 6180 m 6487 6060 l 6591 6120 l 6591 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 6060 m 6487 5940 l 6591 6000 l 6591 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 5940 m 6487 5820 l 6591 5880 l 6591 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 5820 m 6487 5700 l 6591 5760 l 6591 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 5700 m 6487 5580 l 6591 5641 l 6591 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 5580 m 6487 5460 l 6591 5521 l 6591 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 5460 m 6487 5340 l 6591 5401 l 6591 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 5340 m 6487 5220 l 6591 5281 l 6591 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 5220 m 6487 5100 l 6591 5161 l 6591 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 5100 m 6487 4980 l 6591 5041 l 6591 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 4980 m 6487 4860 l 6591 4921 l 6591 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 4860 m 6487 4740 l 6591 4801 l 6591 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 4740 m 6487 4620 l 6591 4681 l 6591 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 4620 m 6487 4500 l 6591 4561 l 6591 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 4500 m 6487 4380 l 6591 4441 l 6591 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 4380 m 6487 4260 l 6591 4321 l 6591 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 6240 m 6591 6120 l 6695 6180 l 6695 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 6120 m 6591 6000 l 6695 6060 l 6695 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 6000 m 6591 5880 l 6695 5940 l 6695 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 5880 m 6591 5760 l 6695 5820 l 6695 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 5760 m 6591 5640 l 6695 5701 l 6695 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 5640 m 6591 5520 l 6695 5581 l 6695 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 5520 m 6591 5400 l 6695 5461 l 6695 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 5400 m 6591 5280 l 6695 5341 l 6695 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 5280 m 6591 5160 l 6695 5221 l 6695 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 5160 m 6591 5040 l 6695 5101 l 6695 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 5040 m 6591 4920 l 6695 4981 l 6695 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 4920 m 6591 4800 l 6695 4861 l 6695 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 4800 m 6591 4680 l 6695 4741 l 6695 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 4680 m 6591 4560 l 6695 4621 l 6695 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 4560 m 6591 4440 l 6695 4501 l 6695 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 4440 m 6591 4320 l 6695 4381 l 6695 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 6300 m 6695 6180 l 6799 6240 l 6799 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 6180 m 6695 6060 l 6799 6120 l 6799 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 6060 m 6695 5940 l 6799 6000 l 6799 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 5940 m 6695 5820 l 6799 5880 l 6799 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 5820 m 6695 5700 l 6799 5760 l 6799 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 5700 m 6695 5580 l 6799 5641 l 6799 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 5580 m 6695 5460 l 6799 5521 l 6799 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 5460 m 6695 5340 l 6799 5401 l 6799 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 5340 m 6695 5220 l 6799 5281 l 6799 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 5220 m 6695 5100 l 6799 5161 l 6799 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 5100 m 6695 4980 l 6799 5041 l 6799 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 4980 m 6695 4860 l 6799 4921 l 6799 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 4860 m 6695 4740 l 6799 4801 l 6799 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 4740 m 6695 4620 l 6799 4681 l 6799 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 4620 m 6695 4500 l 6799 4561 l 6799 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 4500 m 6695 4380 l 6799 4441 l 6799 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 6360 m 6799 6240 l 6903 6300 l 6903 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 6240 m 6799 6120 l 6903 6180 l 6903 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 6120 m 6799 6000 l 6903 6060 l 6903 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 6000 m 6799 5880 l 6903 5940 l 6903 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 5880 m 6799 5760 l 6903 5820 l 6903 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 5760 m 6799 5640 l 6903 5701 l 6903 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 5640 m 6799 5520 l 6903 5581 l 6903 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 5520 m 6799 5400 l 6903 5461 l 6903 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 5400 m 6799 5280 l 6903 5341 l 6903 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 5280 m 6799 5160 l 6903 5221 l 6903 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 5160 m 6799 5040 l 6903 5101 l 6903 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 5040 m 6799 4920 l 6903 4981 l 6903 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 4920 m 6799 4800 l 6903 4861 l 6903 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 4800 m 6799 4680 l 6903 4741 l 6903 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 4680 m 6799 4560 l 6903 4621 l 6903 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 4560 m 6799 4440 l 6903 4501 l 6903 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 6420 m 6903 6300 l 7007 6360 l 7007 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 6300 m 6903 6180 l 7007 6240 l 7007 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 6180 m 6903 6060 l 7007 6120 l 7007 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 6060 m 6903 5940 l 7007 6000 l 7007 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 5940 m 6903 5820 l 7007 5880 l 7007 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 5820 m 6903 5700 l 7007 5760 l 7007 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 5700 m 6903 5580 l 7007 5641 l 7007 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 5580 m 6903 5460 l 7007 5521 l 7007 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 5460 m 6903 5340 l 7007 5401 l 7007 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 5340 m 6903 5220 l 7007 5281 l 7007 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 5220 m 6903 5100 l 7007 5161 l 7007 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 5100 m 6903 4980 l 7007 5041 l 7007 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 4980 m 6903 4860 l 7007 4921 l 7007 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 4860 m 6903 4740 l 7007 4801 l 7007 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 4740 m 6903 4620 l 7007 4681 l 7007 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 4620 m 6903 4500 l 7007 4561 l 7007 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 6480 m 7007 6360 l 7110 6420 l 7110 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 6360 m 7007 6240 l 7110 6300 l 7110 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 6240 m 7007 6120 l 7110 6180 l 7110 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 6120 m 7007 6000 l 7110 6060 l 7110 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 6000 m 7007 5880 l 7110 5940 l 7110 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 5880 m 7007 5760 l 7110 5820 l 7110 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 5760 m 7007 5640 l 7110 5701 l 7110 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 5640 m 7007 5520 l 7110 5581 l 7110 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 5520 m 7007 5400 l 7110 5461 l 7110 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 5400 m 7007 5280 l 7110 5341 l 7110 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 5280 m 7007 5160 l 7110 5221 l 7110 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 5160 m 7007 5040 l 7110 5101 l 7110 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 5040 m 7007 4920 l 7110 4981 l 7110 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 4920 m 7007 4800 l 7110 4861 l 7110 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 4800 m 7007 4680 l 7110 4741 l 7110 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 4680 m 7007 4560 l 7110 4621 l 7110 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 6540 m 7110 6420 l 7214 6480 l 7214 6600 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 6420 m 7110 6300 l 7214 6360 l 7214 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 6300 m 7110 6180 l 7214 6240 l 7214 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 6180 m 7110 6060 l 7214 6120 l 7214 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 6060 m 7110 5940 l 7214 6000 l 7214 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 5940 m 7110 5820 l 7214 5880 l 7214 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 5820 m 7110 5700 l 7214 5760 l 7214 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 5700 m 7110 5580 l 7214 5641 l 7214 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 5580 m 7110 5460 l 7214 5521 l 7214 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 5460 m 7110 5340 l 7214 5401 l 7214 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 5340 m 7110 5220 l 7214 5281 l 7214 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 5220 m 7110 5100 l 7214 5161 l 7214 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 5100 m 7110 4980 l 7214 5041 l 7214 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 4980 m 7110 4860 l 7214 4921 l 7214 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 4860 m 7110 4740 l 7214 4801 l 7214 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 4740 m 7110 4620 l 7214 4681 l 7214 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 6600 m 7214 6480 l 7318 6540 l 7318 6660 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 6480 m 7214 6360 l 7318 6420 l 7318 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 6360 m 7214 6240 l 7318 6300 l 7318 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 6240 m 7214 6120 l 7318 6180 l 7318 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 6120 m 7214 6000 l 7318 6060 l 7318 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 6000 m 7214 5880 l 7318 5940 l 7318 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 5880 m 7214 5760 l 7318 5820 l 7318 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 5760 m 7214 5640 l 7318 5701 l 7318 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 5640 m 7214 5520 l 7318 5581 l 7318 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 5520 m 7214 5400 l 7318 5461 l 7318 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 5400 m 7214 5280 l 7318 5341 l 7318 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 5280 m 7214 5160 l 7318 5221 l 7318 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 5160 m 7214 5040 l 7318 5101 l 7318 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 5040 m 7214 4920 l 7318 4981 l 7318 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 4920 m 7214 4800 l 7318 4861 l 7318 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 4800 m 7214 4680 l 7318 4741 l 7318 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 6660 m 7318 6540 l 7422 6600 l 7422 6720 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 6540 m 7318 6420 l 7422 6480 l 7422 6600 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 6420 m 7318 6300 l 7422 6360 l 7422 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 6300 m 7318 6180 l 7422 6240 l 7422 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 6180 m 7318 6060 l 7422 6120 l 7422 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 6060 m 7318 5940 l 7422 6000 l 7422 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 5940 m 7318 5820 l 7422 5880 l 7422 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 5820 m 7318 5700 l 7422 5760 l 7422 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 5700 m 7318 5580 l 7422 5641 l 7422 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 5580 m 7318 5460 l 7422 5521 l 7422 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 5460 m 7318 5340 l 7422 5401 l 7422 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 5340 m 7318 5220 l 7422 5281 l 7422 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 5220 m 7318 5100 l 7422 5161 l 7422 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 5100 m 7318 4980 l 7422 5041 l 7422 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 4980 m 7318 4860 l 7422 4921 l 7422 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 4860 m 7318 4740 l 7422 4801 l 7422 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 4800 m 5863 4861 l 5760 4920 l 5657 4860 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 5657 5340 m 5760 5401 l 5657 5460 l 5553 5400 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 5553 5520 m 5657 5581 l 5553 5640 l 5449 5580 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 5449 5940 m 5553 6000 l 5449 6059 l 5345 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 6000 m 5449 6060 l 5345 6119 l 5241 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 6060 m 5345 6120 l 5241 6179 l 5137 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 6120 m 5241 6180 l 5137 6239 l 5033 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 6180 m 5137 6240 l 5033 6299 l 4929 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 6240 m 5033 6300 l 4929 6359 l 4825 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 6300 m 4929 6360 l 4825 6419 l 4721 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 6360 m 4825 6420 l 4721 6479 l 4617 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 6420 m 4721 6480 l 4617 6539 l 4513 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 6480 m 4617 6540 l 4513 6599 l 4410 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 6540 m 4513 6600 l 4410 6659 l 4306 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 6600 m 4410 6660 l 4306 6719 l 4202 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4202 6660 m 4306 6720 l 4202 6779 l 4098 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 5820 m 5967 5880 l 5863 5939 l 5760 5879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 5880 m 5863 5940 l 5760 5999 l 5657 5939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 5940 m 5760 6000 l 5657 6059 l 5553 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 6000 m 5657 6060 l 5553 6119 l 5449 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 6060 m 5553 6120 l 5449 6179 l 5345 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 6120 m 5449 6180 l 5345 6239 l 5241 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 6180 m 5345 6240 l 5241 6299 l 5137 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 6240 m 5241 6300 l 5137 6359 l 5033 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 6300 m 5137 6360 l 5033 6419 l 4929 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 6360 m 5033 6420 l 4929 6479 l 4825 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 6420 m 4929 6480 l 4825 6539 l 4721 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 6480 m 4825 6540 l 4721 6599 l 4617 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 6540 m 4721 6600 l 4617 6659 l 4513 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 6600 m 4617 6660 l 4513 6719 l 4410 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 6660 m 4513 6720 l 4410 6779 l 4306 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4306 6720 m 4410 6780 l 4306 6839 l 4202 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 5880 m 6071 5940 l 5967 5999 l 5863 5939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 5940 m 5967 6000 l 5863 6059 l 5760 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 6000 m 5863 6060 l 5760 6119 l 5657 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 6060 m 5760 6120 l 5657 6179 l 5553 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 6120 m 5657 6180 l 5553 6239 l 5449 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 6180 m 5553 6240 l 5449 6299 l 5345 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 6240 m 5449 6300 l 5345 6359 l 5241 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 6300 m 5345 6360 l 5241 6419 l 5137 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 6360 m 5241 6420 l 5137 6479 l 5033 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 6420 m 5137 6480 l 5033 6539 l 4929 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 6480 m 5033 6540 l 4929 6599 l 4825 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 6540 m 4929 6600 l 4825 6659 l 4721 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 6600 m 4825 6660 l 4721 6719 l 4617 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 6660 m 4721 6720 l 4617 6779 l 4513 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 6720 m 4617 6780 l 4513 6839 l 4410 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4410 6780 m 4513 6840 l 4410 6899 l 4306 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 5940 m 6175 6000 l 6071 6059 l 5967 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 6000 m 6071 6060 l 5967 6119 l 5863 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 6060 m 5967 6120 l 5863 6179 l 5760 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 6120 m 5863 6180 l 5760 6239 l 5657 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 6180 m 5760 6240 l 5657 6299 l 5553 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 6240 m 5657 6300 l 5553 6359 l 5449 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 6300 m 5553 6360 l 5449 6419 l 5345 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 6360 m 5449 6420 l 5345 6479 l 5241 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 6420 m 5345 6480 l 5241 6539 l 5137 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 6480 m 5241 6540 l 5137 6599 l 5033 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 6540 m 5137 6600 l 5033 6659 l 4929 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 6600 m 5033 6660 l 4929 6719 l 4825 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 6660 m 4929 6720 l 4825 6779 l 4721 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 6720 m 4825 6780 l 4721 6839 l 4617 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 6780 m 4721 6840 l 4617 6899 l 4513 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4513 6840 m 4617 6900 l 4513 6959 l 4410 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 6000 m 6279 6060 l 6175 6119 l 6071 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 6060 m 6175 6120 l 6071 6179 l 5967 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 6120 m 6071 6180 l 5967 6239 l 5863 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 6180 m 5967 6240 l 5863 6299 l 5760 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 6240 m 5863 6300 l 5760 6359 l 5657 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 6300 m 5760 6360 l 5657 6419 l 5553 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 6360 m 5657 6420 l 5553 6479 l 5449 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 6420 m 5553 6480 l 5449 6539 l 5345 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 6480 m 5449 6540 l 5345 6599 l 5241 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 6540 m 5345 6600 l 5241 6659 l 5137 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 6600 m 5241 6660 l 5137 6719 l 5033 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 6660 m 5137 6720 l 5033 6779 l 4929 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 6720 m 5033 6780 l 4929 6839 l 4825 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 6780 m 4929 6840 l 4825 6899 l 4721 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 6840 m 4825 6900 l 4721 6959 l 4617 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4617 6900 m 4721 6960 l 4617 7019 l 4513 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 6060 m 6383 6120 l 6279 6179 l 6175 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 6120 m 6279 6180 l 6175 6239 l 6071 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 6180 m 6175 6240 l 6071 6299 l 5967 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 6240 m 6071 6300 l 5967 6359 l 5863 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 6300 m 5967 6360 l 5863 6419 l 5760 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 6360 m 5863 6420 l 5760 6479 l 5657 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 6420 m 5760 6480 l 5657 6539 l 5553 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 6480 m 5657 6540 l 5553 6599 l 5449 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 6540 m 5553 6600 l 5449 6659 l 5345 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 6600 m 5449 6660 l 5345 6719 l 5241 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 6660 m 5345 6720 l 5241 6779 l 5137 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 6720 m 5241 6780 l 5137 6839 l 5033 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 6780 m 5137 6840 l 5033 6899 l 4929 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 6840 m 5033 6900 l 4929 6959 l 4825 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 6900 m 4929 6960 l 4825 7019 l 4721 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4721 6960 m 4825 7020 l 4721 7079 l 4617 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 6120 m 6487 6180 l 6383 6239 l 6279 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 6180 m 6383 6240 l 6279 6299 l 6175 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 6240 m 6279 6300 l 6175 6359 l 6071 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 6300 m 6175 6360 l 6071 6419 l 5967 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 6360 m 6071 6420 l 5967 6479 l 5863 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 6420 m 5967 6480 l 5863 6539 l 5760 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 6480 m 5863 6540 l 5760 6599 l 5657 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 6540 m 5760 6600 l 5657 6659 l 5553 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 6600 m 5657 6660 l 5553 6719 l 5449 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 6660 m 5553 6720 l 5449 6779 l 5345 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 6720 m 5449 6780 l 5345 6839 l 5241 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 6780 m 5345 6840 l 5241 6899 l 5137 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 6840 m 5241 6900 l 5137 6959 l 5033 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 6900 m 5137 6960 l 5033 7019 l 4929 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 6960 m 5033 7020 l 4929 7079 l 4825 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4825 7020 m 4929 7080 l 4825 7139 l 4721 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 6180 m 6591 6240 l 6487 6299 l 6383 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 6240 m 6487 6300 l 6383 6359 l 6279 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 6300 m 6383 6360 l 6279 6419 l 6175 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 6360 m 6279 6420 l 6175 6479 l 6071 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 6420 m 6175 6480 l 6071 6539 l 5967 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 6480 m 6071 6540 l 5967 6599 l 5863 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 6540 m 5967 6600 l 5863 6659 l 5760 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 6600 m 5863 6660 l 5760 6719 l 5657 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 6660 m 5760 6720 l 5657 6779 l 5553 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 6720 m 5657 6780 l 5553 6839 l 5449 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 6780 m 5553 6840 l 5449 6899 l 5345 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 6840 m 5449 6900 l 5345 6959 l 5241 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 6900 m 5345 6960 l 5241 7019 l 5137 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 6960 m 5241 7020 l 5137 7079 l 5033 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 7020 m 5137 7080 l 5033 7139 l 4929 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 4929 7080 m 5033 7140 l 4929 7199 l 4825 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 6240 m 6695 6300 l 6591 6359 l 6487 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 6300 m 6591 6360 l 6487 6419 l 6383 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 6360 m 6487 6420 l 6383 6479 l 6279 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 6420 m 6383 6480 l 6279 6539 l 6175 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 6480 m 6279 6540 l 6175 6599 l 6071 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 6540 m 6175 6600 l 6071 6659 l 5967 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 6600 m 6071 6660 l 5967 6719 l 5863 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 6660 m 5967 6720 l 5863 6779 l 5760 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 6720 m 5863 6780 l 5760 6839 l 5657 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 6780 m 5760 6840 l 5657 6899 l 5553 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 6840 m 5657 6900 l 5553 6959 l 5449 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 6900 m 5553 6960 l 5449 7019 l 5345 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 6960 m 5449 7020 l 5345 7079 l 5241 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 7020 m 5345 7080 l 5241 7139 l 5137 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 7080 m 5241 7140 l 5137 7199 l 5033 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5033 7140 m 5137 7200 l 5033 7259 l 4929 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 6300 m 6799 6360 l 6695 6419 l 6591 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 6360 m 6695 6420 l 6591 6479 l 6487 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 6420 m 6591 6480 l 6487 6539 l 6383 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 6480 m 6487 6540 l 6383 6599 l 6279 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 6540 m 6383 6600 l 6279 6659 l 6175 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 6600 m 6279 6660 l 6175 6719 l 6071 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 6660 m 6175 6720 l 6071 6779 l 5967 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 6720 m 6071 6780 l 5967 6839 l 5863 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 6780 m 5967 6840 l 5863 6899 l 5760 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 6840 m 5863 6900 l 5760 6959 l 5657 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 6900 m 5760 6960 l 5657 7019 l 5553 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 6960 m 5657 7020 l 5553 7079 l 5449 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 7020 m 5553 7080 l 5449 7139 l 5345 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 7080 m 5449 7140 l 5345 7199 l 5241 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 7140 m 5345 7200 l 5241 7259 l 5137 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5137 7200 m 5241 7260 l 5137 7319 l 5033 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 6360 m 6903 6420 l 6799 6479 l 6695 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 6420 m 6799 6480 l 6695 6539 l 6591 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 6480 m 6695 6540 l 6591 6599 l 6487 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 6540 m 6591 6600 l 6487 6659 l 6383 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 6600 m 6487 6660 l 6383 6719 l 6279 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 6660 m 6383 6720 l 6279 6779 l 6175 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 6720 m 6279 6780 l 6175 6839 l 6071 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 6780 m 6175 6840 l 6071 6899 l 5967 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 6840 m 6071 6900 l 5967 6959 l 5863 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 6900 m 5967 6960 l 5863 7019 l 5760 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 6960 m 5863 7020 l 5760 7079 l 5657 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 7020 m 5760 7080 l 5657 7139 l 5553 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 7080 m 5657 7140 l 5553 7199 l 5449 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 7140 m 5553 7200 l 5449 7259 l 5345 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 7200 m 5449 7260 l 5345 7319 l 5241 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5241 7260 m 5345 7320 l 5241 7379 l 5137 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 6420 m 7007 6480 l 6903 6539 l 6799 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 6480 m 6903 6540 l 6799 6599 l 6695 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 6540 m 6799 6600 l 6695 6659 l 6591 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 6600 m 6695 6660 l 6591 6719 l 6487 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 6660 m 6591 6720 l 6487 6779 l 6383 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 6720 m 6487 6780 l 6383 6839 l 6279 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 6780 m 6383 6840 l 6279 6899 l 6175 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 6840 m 6279 6900 l 6175 6959 l 6071 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 6900 m 6175 6960 l 6071 7019 l 5967 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 6960 m 6071 7020 l 5967 7079 l 5863 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 7020 m 5967 7080 l 5863 7139 l 5760 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 7080 m 5863 7140 l 5760 7199 l 5657 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 7140 m 5760 7200 l 5657 7259 l 5553 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 7200 m 5657 7260 l 5553 7319 l 5449 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 7260 m 5553 7320 l 5449 7379 l 5345 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5345 7320 m 5449 7380 l 5345 7439 l 5241 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 6480 m 7110 6540 l 7007 6599 l 6903 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 6540 m 7007 6600 l 6903 6659 l 6799 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 6600 m 6903 6660 l 6799 6719 l 6695 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 6660 m 6799 6720 l 6695 6779 l 6591 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 6720 m 6695 6780 l 6591 6839 l 6487 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 6780 m 6591 6840 l 6487 6899 l 6383 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 6840 m 6487 6900 l 6383 6959 l 6279 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 6900 m 6383 6960 l 6279 7019 l 6175 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 6960 m 6279 7020 l 6175 7079 l 6071 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 7020 m 6175 7080 l 6071 7139 l 5967 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 7080 m 6071 7140 l 5967 7199 l 5863 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 7140 m 5967 7200 l 5863 7259 l 5760 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 7200 m 5863 7260 l 5760 7319 l 5657 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 7260 m 5760 7320 l 5657 7379 l 5553 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 7320 m 5657 7380 l 5553 7439 l 5449 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5449 7380 m 5553 7440 l 5449 7499 l 5345 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 6540 m 7214 6600 l 7110 6659 l 7007 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 6600 m 7110 6660 l 7007 6719 l 6903 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 6660 m 7007 6720 l 6903 6779 l 6799 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 6720 m 6903 6780 l 6799 6839 l 6695 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 6780 m 6799 6840 l 6695 6899 l 6591 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 6840 m 6695 6900 l 6591 6959 l 6487 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 6900 m 6591 6960 l 6487 7019 l 6383 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 6960 m 6487 7020 l 6383 7079 l 6279 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 7020 m 6383 7080 l 6279 7139 l 6175 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 7080 m 6279 7140 l 6175 7199 l 6071 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 7140 m 6175 7200 l 6071 7259 l 5967 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 7200 m 6071 7260 l 5967 7319 l 5863 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 7260 m 5967 7320 l 5863 7379 l 5760 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 7320 m 5863 7380 l 5760 7439 l 5657 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 7380 m 5760 7440 l 5657 7499 l 5553 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5553 7440 m 5657 7500 l 5553 7559 l 5449 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 6600 m 7318 6660 l 7214 6719 l 7110 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 6660 m 7214 6720 l 7110 6779 l 7007 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 6720 m 7110 6780 l 7007 6839 l 6903 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 6780 m 7007 6840 l 6903 6899 l 6799 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 6840 m 6903 6900 l 6799 6959 l 6695 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 6900 m 6799 6960 l 6695 7019 l 6591 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 6960 m 6695 7020 l 6591 7079 l 6487 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 7020 m 6591 7080 l 6487 7139 l 6383 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 7080 m 6487 7140 l 6383 7199 l 6279 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 7140 m 6383 7200 l 6279 7259 l 6175 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 7200 m 6279 7260 l 6175 7319 l 6071 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 7260 m 6175 7320 l 6071 7379 l 5967 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 7320 m 6071 7380 l 5967 7439 l 5863 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 7380 m 5967 7440 l 5863 7499 l 5760 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 7440 m 5863 7500 l 5760 7559 l 5657 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5657 7500 m 5760 7560 l 5657 7619 l 5553 7559 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7318 6660 m 7422 6720 l 7318 6779 l 7214 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7214 6720 m 7318 6780 l 7214 6839 l 7110 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7110 6780 m 7214 6840 l 7110 6899 l 7007 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 7007 6840 m 7110 6900 l 7007 6959 l 6903 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6903 6900 m 7007 6960 l 6903 7019 l 6799 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6799 6960 m 6903 7020 l 6799 7079 l 6695 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6695 7020 m 6799 7080 l 6695 7139 l 6591 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6591 7080 m 6695 7140 l 6591 7199 l 6487 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6487 7140 m 6591 7200 l 6487 7259 l 6383 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6383 7200 m 6487 7260 l 6383 7319 l 6279 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6279 7260 m 6383 7320 l 6279 7379 l 6175 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6175 7320 m 6279 7380 l 6175 7439 l 6071 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 6071 7380 m 6175 7440 l 6071 7499 l 5967 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5967 7440 m 6071 7500 l 5967 7559 l 5863 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5863 7500 m 5967 7560 l 5863 7619 l 5760 7559 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 5760 7560 m 5863 7620 l 5760 7679 l 5657 7619 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 5880 m 9703 5939 l 9703 5819 l 9807 5760 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9703 5700 m 9600 5760 l 9600 5640 l 9703 5581 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9600 5520 m 9497 5580 l 9497 5460 l 9600 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 5400 m 9497 5460 l 9497 5340 l 9600 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 5280 m 9497 5340 l 9497 5220 l 9600 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 5160 m 9497 5220 l 9497 5100 l 9600 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 5040 m 9497 5100 l 9497 4980 l 9600 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4920 m 9497 4980 l 9497 4860 l 9600 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4800 m 9497 4860 l 9497 4740 l 9600 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4680 m 9497 4740 l 9497 4620 l 9600 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4560 m 9497 4620 l 9497 4500 l 9600 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4440 m 9497 4500 l 9497 4380 l 9600 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4320 m 9497 4380 l 9497 4260 l 9600 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4200 m 9497 4260 l 9497 4140 l 9600 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4080 m 9497 4140 l 9497 4020 l 9600 3961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 3960 m 9497 4020 l 9497 3900 l 9600 3841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 5940 m 9600 5999 l 9600 5879 l 9703 5820 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9600 5760 m 9497 5819 l 9497 5700 l 9600 5641 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9497 5580 m 9393 5640 l 9393 5520 l 9497 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 5460 m 9393 5520 l 9393 5400 l 9497 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 5340 m 9393 5400 l 9393 5280 l 9497 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 5220 m 9393 5280 l 9393 5160 l 9497 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 5100 m 9393 5160 l 9393 5040 l 9497 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 4980 m 9393 5040 l 9393 4920 l 9497 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 4860 m 9393 4920 l 9393 4800 l 9497 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 4740 m 9393 4800 l 9393 4680 l 9497 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 4620 m 9393 4680 l 9393 4560 l 9497 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 4500 m 9393 4560 l 9393 4440 l 9497 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 4380 m 9393 4440 l 9393 4320 l 9497 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 4260 m 9393 4320 l 9393 4200 l 9497 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 4140 m 9393 4200 l 9393 4080 l 9497 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 4020 m 9393 4080 l 9393 3960 l 9497 3901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 6000 m 9497 6059 l 9497 5939 l 9600 5880 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9393 5760 m 9289 5819 l 9289 5700 l 9393 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 5640 m 9289 5700 l 9289 5580 l 9393 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 5520 m 9289 5580 l 9289 5460 l 9393 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 5400 m 9289 5460 l 9289 5340 l 9393 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 5280 m 9289 5340 l 9289 5220 l 9393 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 5160 m 9289 5220 l 9289 5100 l 9393 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 5040 m 9289 5100 l 9289 4980 l 9393 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 4920 m 9289 4980 l 9289 4860 l 9393 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 4800 m 9289 4860 l 9289 4740 l 9393 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 4680 m 9289 4740 l 9289 4620 l 9393 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 4560 m 9289 4620 l 9289 4500 l 9393 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 4440 m 9289 4500 l 9289 4380 l 9393 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 4320 m 9289 4380 l 9289 4260 l 9393 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 4200 m 9289 4260 l 9289 4140 l 9393 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 4080 m 9289 4140 l 9289 4020 l 9393 3961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 6060 m 9393 6119 l 9393 5999 l 9497 5940 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9289 5820 m 9185 5879 l 9185 5760 l 9289 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 5700 m 9185 5760 l 9185 5640 l 9289 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 5580 m 9185 5640 l 9185 5520 l 9289 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 5460 m 9185 5520 l 9185 5400 l 9289 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 5340 m 9185 5400 l 9185 5280 l 9289 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 5220 m 9185 5280 l 9185 5160 l 9289 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 5100 m 9185 5160 l 9185 5040 l 9289 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 4980 m 9185 5040 l 9185 4920 l 9289 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 4860 m 9185 4920 l 9185 4800 l 9289 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 4740 m 9185 4800 l 9185 4680 l 9289 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 4620 m 9185 4680 l 9185 4560 l 9289 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 4500 m 9185 4560 l 9185 4440 l 9289 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 4380 m 9185 4440 l 9185 4320 l 9289 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 4260 m 9185 4320 l 9185 4200 l 9289 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 4140 m 9185 4200 l 9185 4080 l 9289 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 6060 m 9185 6119 l 9185 5999 l 9289 5940 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9185 5880 m 9081 5939 l 9081 5819 l 9185 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 5760 m 9081 5819 l 9081 5700 l 9185 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 5640 m 9081 5700 l 9081 5580 l 9185 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 5520 m 9081 5580 l 9081 5460 l 9185 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 5400 m 9081 5460 l 9081 5340 l 9185 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 5280 m 9081 5340 l 9081 5220 l 9185 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 5160 m 9081 5220 l 9081 5100 l 9185 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 5040 m 9081 5100 l 9081 4980 l 9185 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 4920 m 9081 4980 l 9081 4860 l 9185 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 4800 m 9081 4860 l 9081 4740 l 9185 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 4680 m 9081 4740 l 9081 4620 l 9185 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 4560 m 9081 4620 l 9081 4500 l 9185 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 4440 m 9081 4500 l 9081 4380 l 9185 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 4320 m 9081 4380 l 9081 4260 l 9185 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 4200 m 9081 4260 l 9081 4140 l 9185 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 6120 m 9081 6179 l 9081 6059 l 9185 6000 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 9081 5940 m 8977 5999 l 8977 5879 l 9081 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 5820 m 8977 5879 l 8977 5760 l 9081 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 5700 m 8977 5760 l 8977 5640 l 9081 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 5580 m 8977 5640 l 8977 5520 l 9081 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 5460 m 8977 5520 l 8977 5400 l 9081 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 5340 m 8977 5400 l 8977 5280 l 9081 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 5220 m 8977 5280 l 8977 5160 l 9081 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 5100 m 8977 5160 l 8977 5040 l 9081 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 4980 m 8977 5040 l 8977 4920 l 9081 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 4860 m 8977 4920 l 8977 4800 l 9081 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 4740 m 8977 4800 l 8977 4680 l 9081 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 4620 m 8977 4680 l 8977 4560 l 9081 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 4500 m 8977 4560 l 8977 4440 l 9081 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 4380 m 8977 4440 l 8977 4320 l 9081 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 4260 m 8977 4320 l 8977 4200 l 9081 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 6180 m 8977 6239 l 8977 6119 l 9081 6060 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 8977 6000 m 8873 6059 l 8873 5939 l 8977 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 5880 m 8873 5939 l 8873 5819 l 8977 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 5760 m 8873 5819 l 8873 5700 l 8977 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 5640 m 8873 5700 l 8873 5580 l 8977 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 5520 m 8873 5580 l 8873 5460 l 8977 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 5400 m 8873 5460 l 8873 5340 l 8977 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 5280 m 8873 5340 l 8873 5220 l 8977 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 5160 m 8873 5220 l 8873 5100 l 8977 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 5040 m 8873 5100 l 8873 4980 l 8977 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 4920 m 8873 4980 l 8873 4860 l 8977 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 4800 m 8873 4860 l 8873 4740 l 8977 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 4680 m 8873 4740 l 8873 4620 l 8977 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 4560 m 8873 4620 l 8873 4500 l 8977 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 4440 m 8873 4500 l 8873 4380 l 8977 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 4320 m 8873 4380 l 8873 4260 l 8977 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 6240 m 8873 6299 l 8873 6179 l 8977 6120 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 8873 6060 m 8769 6119 l 8769 5999 l 8873 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 5940 m 8769 5999 l 8769 5879 l 8873 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 5820 m 8769 5879 l 8769 5760 l 8873 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 5700 m 8769 5760 l 8769 5640 l 8873 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 5580 m 8769 5640 l 8769 5520 l 8873 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 5460 m 8769 5520 l 8769 5400 l 8873 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 5340 m 8769 5400 l 8769 5280 l 8873 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 5220 m 8769 5280 l 8769 5160 l 8873 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 5100 m 8769 5160 l 8769 5040 l 8873 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 4980 m 8769 5040 l 8769 4920 l 8873 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 4860 m 8769 4920 l 8769 4800 l 8873 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 4740 m 8769 4800 l 8769 4680 l 8873 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 4620 m 8769 4680 l 8769 4560 l 8873 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 4500 m 8769 4560 l 8769 4440 l 8873 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 4380 m 8769 4440 l 8769 4320 l 8873 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 6300 m 8769 6359 l 8769 6239 l 8873 6180 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 8769 6120 m 8665 6179 l 8665 6059 l 8769 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 6000 m 8665 6059 l 8665 5939 l 8769 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 5880 m 8665 5939 l 8665 5819 l 8769 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 5760 m 8665 5819 l 8665 5700 l 8769 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 5640 m 8665 5700 l 8665 5580 l 8769 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 5520 m 8665 5580 l 8665 5460 l 8769 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 5400 m 8665 5460 l 8665 5340 l 8769 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 5280 m 8665 5340 l 8665 5220 l 8769 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 5160 m 8665 5220 l 8665 5100 l 8769 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 5040 m 8665 5100 l 8665 4980 l 8769 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 4920 m 8665 4980 l 8665 4860 l 8769 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 4800 m 8665 4860 l 8665 4740 l 8769 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 4680 m 8665 4740 l 8665 4620 l 8769 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 4560 m 8665 4620 l 8665 4500 l 8769 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 4440 m 8665 4500 l 8665 4380 l 8769 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 6300 m 8561 6359 l 8561 6239 l 8665 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 6180 m 8561 6239 l 8561 6119 l 8665 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 6060 m 8561 6119 l 8561 5999 l 8665 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 5940 m 8561 5999 l 8561 5879 l 8665 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 5820 m 8561 5879 l 8561 5760 l 8665 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 5700 m 8561 5760 l 8561 5640 l 8665 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 5580 m 8561 5640 l 8561 5520 l 8665 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 5460 m 8561 5520 l 8561 5400 l 8665 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 5340 m 8561 5400 l 8561 5280 l 8665 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 5220 m 8561 5280 l 8561 5160 l 8665 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 5100 m 8561 5160 l 8561 5040 l 8665 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 4980 m 8561 5040 l 8561 4920 l 8665 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 4860 m 8561 4920 l 8561 4800 l 8665 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 4740 m 8561 4800 l 8561 4680 l 8665 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 4620 m 8561 4680 l 8561 4560 l 8665 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 4500 m 8561 4560 l 8561 4440 l 8665 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 6360 m 8457 6419 l 8457 6299 l 8561 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 6240 m 8457 6299 l 8457 6179 l 8561 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 6120 m 8457 6179 l 8457 6059 l 8561 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 6000 m 8457 6059 l 8457 5939 l 8561 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 5880 m 8457 5939 l 8457 5819 l 8561 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 5760 m 8457 5819 l 8457 5700 l 8561 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 5640 m 8457 5700 l 8457 5580 l 8561 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 5520 m 8457 5580 l 8457 5460 l 8561 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 5400 m 8457 5460 l 8457 5340 l 8561 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 5280 m 8457 5340 l 8457 5220 l 8561 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 5160 m 8457 5220 l 8457 5100 l 8561 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 5040 m 8457 5100 l 8457 4980 l 8561 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 4920 m 8457 4980 l 8457 4860 l 8561 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 4800 m 8457 4860 l 8457 4740 l 8561 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 4680 m 8457 4740 l 8457 4620 l 8561 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 4560 m 8457 4620 l 8457 4500 l 8561 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 6420 m 8353 6479 l 8353 6359 l 8457 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 6300 m 8353 6359 l 8353 6239 l 8457 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 6180 m 8353 6239 l 8353 6119 l 8457 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 6060 m 8353 6119 l 8353 5999 l 8457 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 5940 m 8353 5999 l 8353 5879 l 8457 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 5820 m 8353 5879 l 8353 5760 l 8457 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 5700 m 8353 5760 l 8353 5640 l 8457 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 5580 m 8353 5640 l 8353 5520 l 8457 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 5460 m 8353 5520 l 8353 5400 l 8457 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 5340 m 8353 5400 l 8353 5280 l 8457 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 5220 m 8353 5280 l 8353 5160 l 8457 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 5100 m 8353 5160 l 8353 5040 l 8457 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 4980 m 8353 5040 l 8353 4920 l 8457 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 4860 m 8353 4920 l 8353 4800 l 8457 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 4740 m 8353 4800 l 8353 4680 l 8457 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 4620 m 8353 4680 l 8353 4560 l 8457 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 6480 m 8250 6539 l 8250 6419 l 8353 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 6360 m 8250 6419 l 8250 6299 l 8353 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 6240 m 8250 6299 l 8250 6179 l 8353 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 6120 m 8250 6179 l 8250 6059 l 8353 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 6000 m 8250 6059 l 8250 5939 l 8353 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 5880 m 8250 5939 l 8250 5819 l 8353 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 5760 m 8250 5819 l 8250 5700 l 8353 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 5640 m 8250 5700 l 8250 5580 l 8353 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 5520 m 8250 5580 l 8250 5460 l 8353 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 5400 m 8250 5460 l 8250 5340 l 8353 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 5280 m 8250 5340 l 8250 5220 l 8353 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 5160 m 8250 5220 l 8250 5100 l 8353 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 5040 m 8250 5100 l 8250 4980 l 8353 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 4920 m 8250 4980 l 8250 4860 l 8353 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 4800 m 8250 4860 l 8250 4740 l 8353 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 4680 m 8250 4740 l 8250 4620 l 8353 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 6540 m 8146 6599 l 8146 6479 l 8250 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 6420 m 8146 6479 l 8146 6359 l 8250 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 6300 m 8146 6359 l 8146 6239 l 8250 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 6180 m 8146 6239 l 8146 6119 l 8250 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 6060 m 8146 6119 l 8146 5999 l 8250 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 5940 m 8146 5999 l 8146 5879 l 8250 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 5820 m 8146 5879 l 8146 5760 l 8250 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 5700 m 8146 5760 l 8146 5640 l 8250 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 5580 m 8146 5640 l 8146 5520 l 8250 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 5460 m 8146 5520 l 8146 5400 l 8250 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 5340 m 8146 5400 l 8146 5280 l 8250 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 5220 m 8146 5280 l 8146 5160 l 8250 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 5100 m 8146 5160 l 8146 5040 l 8250 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 4980 m 8146 5040 l 8146 4920 l 8250 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 4860 m 8146 4920 l 8146 4800 l 8250 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 4740 m 8146 4800 l 8146 4680 l 8250 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 6600 m 8042 6659 l 8042 6539 l 8146 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 6480 m 8042 6539 l 8042 6419 l 8146 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 6360 m 8042 6419 l 8042 6299 l 8146 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 6240 m 8042 6299 l 8042 6179 l 8146 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 6120 m 8042 6179 l 8042 6059 l 8146 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 6000 m 8042 6059 l 8042 5939 l 8146 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 5880 m 8042 5939 l 8042 5819 l 8146 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 5760 m 8042 5819 l 8042 5700 l 8146 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 5640 m 8042 5700 l 8042 5580 l 8146 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 5520 m 8042 5580 l 8042 5460 l 8146 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 5400 m 8042 5460 l 8042 5340 l 8146 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 5280 m 8042 5340 l 8042 5220 l 8146 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 5160 m 8042 5220 l 8042 5100 l 8146 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 5040 m 8042 5100 l 8042 4980 l 8146 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 4920 m 8042 4980 l 8042 4860 l 8146 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 4800 m 8042 4860 l 8042 4740 l 8146 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 6660 m 7938 6719 l 7938 6599 l 8042 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 6540 m 7938 6599 l 7938 6479 l 8042 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 6420 m 7938 6479 l 7938 6359 l 8042 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 6300 m 7938 6359 l 7938 6239 l 8042 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 6180 m 7938 6239 l 7938 6119 l 8042 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 6060 m 7938 6119 l 7938 5999 l 8042 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 5940 m 7938 5999 l 7938 5879 l 8042 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 5820 m 7938 5879 l 7938 5760 l 8042 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 5700 m 7938 5760 l 7938 5640 l 8042 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 5580 m 7938 5640 l 7938 5520 l 8042 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 5460 m 7938 5520 l 7938 5400 l 8042 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 5340 m 7938 5400 l 7938 5280 l 8042 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 5220 m 7938 5280 l 7938 5160 l 8042 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 5100 m 7938 5160 l 7938 5040 l 8042 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 4980 m 7938 5040 l 7938 4920 l 8042 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 4860 m 7938 4920 l 7938 4800 l 8042 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 6300 m 8665 6180 l 8769 6240 l 8769 6360 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 9393 5760 m 9393 5640 l 9497 5701 l 9497 5820 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 9600 5520 m 9600 5400 l 9703 5461 l 9703 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 5400 m 9600 5280 l 9703 5341 l 9703 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 5280 m 9600 5160 l 9703 5221 l 9703 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 5160 m 9600 5040 l 9703 5101 l 9703 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 5040 m 9600 4920 l 9703 4981 l 9703 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4920 m 9600 4800 l 9703 4861 l 9703 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4800 m 9600 4680 l 9703 4741 l 9703 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4680 m 9600 4560 l 9703 4621 l 9703 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4560 m 9600 4440 l 9703 4501 l 9703 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4440 m 9600 4320 l 9703 4381 l 9703 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4320 m 9600 4200 l 9703 4261 l 9703 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4200 m 9600 4080 l 9703 4141 l 9703 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 4080 m 9600 3960 l 9703 4021 l 9703 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 3960 m 9600 3840 l 9703 3901 l 9703 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 6060 m 9289 5940 l 9393 6000 l 9393 6120 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 9703 5700 m 9703 5580 l 9807 5641 l 9807 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 5580 m 9703 5460 l 9807 5521 l 9807 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 5460 m 9703 5340 l 9807 5401 l 9807 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 5340 m 9703 5220 l 9807 5281 l 9807 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 5220 m 9703 5100 l 9807 5161 l 9807 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 5100 m 9703 4980 l 9807 5041 l 9807 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 4980 m 9703 4860 l 9807 4921 l 9807 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 4860 m 9703 4740 l 9807 4801 l 9807 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 4740 m 9703 4620 l 9807 4681 l 9807 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 4620 m 9703 4500 l 9807 4561 l 9807 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 4500 m 9703 4380 l 9807 4441 l 9807 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 4380 m 9703 4260 l 9807 4321 l 9807 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 4260 m 9703 4140 l 9807 4201 l 9807 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 4140 m 9703 4020 l 9807 4081 l 9807 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 4020 m 9703 3900 l 9807 3961 l 9807 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 5880 m 9807 5760 l 9911 5820 l 9911 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 5760 m 9807 5640 l 9911 5701 l 9911 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 5640 m 9807 5520 l 9911 5581 l 9911 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 5520 m 9807 5400 l 9911 5461 l 9911 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 5400 m 9807 5280 l 9911 5341 l 9911 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 5280 m 9807 5160 l 9911 5221 l 9911 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 5160 m 9807 5040 l 9911 5101 l 9911 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 5040 m 9807 4920 l 9911 4981 l 9911 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 4920 m 9807 4800 l 9911 4861 l 9911 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 4800 m 9807 4680 l 9911 4741 l 9911 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 4680 m 9807 4560 l 9911 4621 l 9911 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 4560 m 9807 4440 l 9911 4501 l 9911 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 4440 m 9807 4320 l 9911 4381 l 9911 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 4320 m 9807 4200 l 9911 4261 l 9911 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 4200 m 9807 4080 l 9911 4141 l 9911 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 4080 m 9807 3960 l 9911 4021 l 9911 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 5940 m 9911 5820 l 10015 5880 l 10015 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 5820 m 9911 5700 l 10015 5760 l 10015 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 5700 m 9911 5580 l 10015 5641 l 10015 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 5580 m 9911 5460 l 10015 5521 l 10015 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 5460 m 9911 5340 l 10015 5401 l 10015 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 5340 m 9911 5220 l 10015 5281 l 10015 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 5220 m 9911 5100 l 10015 5161 l 10015 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 5100 m 9911 4980 l 10015 5041 l 10015 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 4980 m 9911 4860 l 10015 4921 l 10015 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 4860 m 9911 4740 l 10015 4801 l 10015 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 4740 m 9911 4620 l 10015 4681 l 10015 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 4620 m 9911 4500 l 10015 4561 l 10015 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 4500 m 9911 4380 l 10015 4441 l 10015 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 4380 m 9911 4260 l 10015 4321 l 10015 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 4260 m 9911 4140 l 10015 4201 l 10015 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 4140 m 9911 4020 l 10015 4081 l 10015 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 6000 m 10015 5880 l 10119 5940 l 10119 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 5880 m 10015 5760 l 10119 5820 l 10119 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 5760 m 10015 5640 l 10119 5701 l 10119 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 5640 m 10015 5520 l 10119 5581 l 10119 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 5520 m 10015 5400 l 10119 5461 l 10119 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 5400 m 10015 5280 l 10119 5341 l 10119 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 5280 m 10015 5160 l 10119 5221 l 10119 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 5160 m 10015 5040 l 10119 5101 l 10119 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 5040 m 10015 4920 l 10119 4981 l 10119 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 4920 m 10015 4800 l 10119 4861 l 10119 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 4800 m 10015 4680 l 10119 4741 l 10119 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 4680 m 10015 4560 l 10119 4621 l 10119 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 4560 m 10015 4440 l 10119 4501 l 10119 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 4440 m 10015 4320 l 10119 4381 l 10119 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 4320 m 10015 4200 l 10119 4261 l 10119 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 4200 m 10015 4080 l 10119 4141 l 10119 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 6060 m 10119 5940 l 10223 6000 l 10223 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 5940 m 10119 5820 l 10223 5880 l 10223 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 5820 m 10119 5700 l 10223 5760 l 10223 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 5700 m 10119 5580 l 10223 5641 l 10223 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 5580 m 10119 5460 l 10223 5521 l 10223 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 5460 m 10119 5340 l 10223 5401 l 10223 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 5340 m 10119 5220 l 10223 5281 l 10223 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 5220 m 10119 5100 l 10223 5161 l 10223 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 5100 m 10119 4980 l 10223 5041 l 10223 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 4980 m 10119 4860 l 10223 4921 l 10223 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 4860 m 10119 4740 l 10223 4801 l 10223 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 4740 m 10119 4620 l 10223 4681 l 10223 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 4620 m 10119 4500 l 10223 4561 l 10223 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 4500 m 10119 4380 l 10223 4441 l 10223 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 4380 m 10119 4260 l 10223 4321 l 10223 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 4260 m 10119 4140 l 10223 4201 l 10223 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 6120 m 10223 6000 l 10327 6060 l 10327 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 6000 m 10223 5880 l 10327 5940 l 10327 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 5880 m 10223 5760 l 10327 5820 l 10327 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 5760 m 10223 5640 l 10327 5701 l 10327 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 5640 m 10223 5520 l 10327 5581 l 10327 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 5520 m 10223 5400 l 10327 5461 l 10327 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 5400 m 10223 5280 l 10327 5341 l 10327 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 5280 m 10223 5160 l 10327 5221 l 10327 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 5160 m 10223 5040 l 10327 5101 l 10327 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 5040 m 10223 4920 l 10327 4981 l 10327 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 4920 m 10223 4800 l 10327 4861 l 10327 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 4800 m 10223 4680 l 10327 4741 l 10327 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 4680 m 10223 4560 l 10327 4621 l 10327 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 4560 m 10223 4440 l 10327 4501 l 10327 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 4440 m 10223 4320 l 10327 4381 l 10327 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 4320 m 10223 4200 l 10327 4261 l 10327 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 6180 m 10327 6060 l 10431 6120 l 10431 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 6060 m 10327 5940 l 10431 6000 l 10431 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 5940 m 10327 5820 l 10431 5880 l 10431 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 5820 m 10327 5700 l 10431 5760 l 10431 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 5700 m 10327 5580 l 10431 5641 l 10431 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 5580 m 10327 5460 l 10431 5521 l 10431 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 5460 m 10327 5340 l 10431 5401 l 10431 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 5340 m 10327 5220 l 10431 5281 l 10431 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 5220 m 10327 5100 l 10431 5161 l 10431 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 5100 m 10327 4980 l 10431 5041 l 10431 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 4980 m 10327 4860 l 10431 4921 l 10431 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 4860 m 10327 4740 l 10431 4801 l 10431 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 4740 m 10327 4620 l 10431 4681 l 10431 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 4620 m 10327 4500 l 10431 4561 l 10431 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 4500 m 10327 4380 l 10431 4441 l 10431 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 4380 m 10327 4260 l 10431 4321 l 10431 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 6240 m 10431 6120 l 10535 6180 l 10535 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 6120 m 10431 6000 l 10535 6060 l 10535 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 6000 m 10431 5880 l 10535 5940 l 10535 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 5880 m 10431 5760 l 10535 5820 l 10535 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 5760 m 10431 5640 l 10535 5701 l 10535 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 5640 m 10431 5520 l 10535 5581 l 10535 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 5520 m 10431 5400 l 10535 5461 l 10535 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 5400 m 10431 5280 l 10535 5341 l 10535 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 5280 m 10431 5160 l 10535 5221 l 10535 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 5160 m 10431 5040 l 10535 5101 l 10535 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 5040 m 10431 4920 l 10535 4981 l 10535 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 4920 m 10431 4800 l 10535 4861 l 10535 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 4800 m 10431 4680 l 10535 4741 l 10535 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 4680 m 10431 4560 l 10535 4621 l 10535 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 4560 m 10431 4440 l 10535 4501 l 10535 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 4440 m 10431 4320 l 10535 4381 l 10535 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 6300 m 10535 6180 l 10639 6240 l 10639 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 6180 m 10535 6060 l 10639 6120 l 10639 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 6060 m 10535 5940 l 10639 6000 l 10639 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 5940 m 10535 5820 l 10639 5880 l 10639 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 5820 m 10535 5700 l 10639 5760 l 10639 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 5700 m 10535 5580 l 10639 5641 l 10639 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 5580 m 10535 5460 l 10639 5521 l 10639 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 5460 m 10535 5340 l 10639 5401 l 10639 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 5340 m 10535 5220 l 10639 5281 l 10639 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 5220 m 10535 5100 l 10639 5161 l 10639 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 5100 m 10535 4980 l 10639 5041 l 10639 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 4980 m 10535 4860 l 10639 4921 l 10639 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 4860 m 10535 4740 l 10639 4801 l 10639 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 4740 m 10535 4620 l 10639 4681 l 10639 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 4620 m 10535 4500 l 10639 4561 l 10639 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 4500 m 10535 4380 l 10639 4441 l 10639 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 6360 m 10639 6240 l 10743 6300 l 10743 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 6240 m 10639 6120 l 10743 6180 l 10743 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 6120 m 10639 6000 l 10743 6060 l 10743 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 6000 m 10639 5880 l 10743 5940 l 10743 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 5880 m 10639 5760 l 10743 5820 l 10743 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 5760 m 10639 5640 l 10743 5701 l 10743 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 5640 m 10639 5520 l 10743 5581 l 10743 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 5520 m 10639 5400 l 10743 5461 l 10743 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 5400 m 10639 5280 l 10743 5341 l 10743 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 5280 m 10639 5160 l 10743 5221 l 10743 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 5160 m 10639 5040 l 10743 5101 l 10743 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 5040 m 10639 4920 l 10743 4981 l 10743 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 4920 m 10639 4800 l 10743 4861 l 10743 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 4800 m 10639 4680 l 10743 4741 l 10743 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 4680 m 10639 4560 l 10743 4621 l 10743 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 4560 m 10639 4440 l 10743 4501 l 10743 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 6420 m 10743 6300 l 10847 6360 l 10847 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 6300 m 10743 6180 l 10847 6240 l 10847 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 6180 m 10743 6060 l 10847 6120 l 10847 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 6060 m 10743 5940 l 10847 6000 l 10847 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 5940 m 10743 5820 l 10847 5880 l 10847 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 5820 m 10743 5700 l 10847 5760 l 10847 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 5700 m 10743 5580 l 10847 5641 l 10847 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 5580 m 10743 5460 l 10847 5521 l 10847 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 5460 m 10743 5340 l 10847 5401 l 10847 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 5340 m 10743 5220 l 10847 5281 l 10847 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 5220 m 10743 5100 l 10847 5161 l 10847 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 5100 m 10743 4980 l 10847 5041 l 10847 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 4980 m 10743 4860 l 10847 4921 l 10847 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 4860 m 10743 4740 l 10847 4801 l 10847 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 4740 m 10743 4620 l 10847 4681 l 10847 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 4620 m 10743 4500 l 10847 4561 l 10847 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 6480 m 10847 6360 l 10950 6420 l 10950 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 6360 m 10847 6240 l 10950 6300 l 10950 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 6240 m 10847 6120 l 10950 6180 l 10950 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 6120 m 10847 6000 l 10950 6060 l 10950 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 6000 m 10847 5880 l 10950 5940 l 10950 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 5880 m 10847 5760 l 10950 5820 l 10950 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 5760 m 10847 5640 l 10950 5701 l 10950 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 5640 m 10847 5520 l 10950 5581 l 10950 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 5520 m 10847 5400 l 10950 5461 l 10950 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 5400 m 10847 5280 l 10950 5341 l 10950 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 5280 m 10847 5160 l 10950 5221 l 10950 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 5160 m 10847 5040 l 10950 5101 l 10950 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 5040 m 10847 4920 l 10950 4981 l 10950 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 4920 m 10847 4800 l 10950 4861 l 10950 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 4800 m 10847 4680 l 10950 4741 l 10950 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 4680 m 10847 4560 l 10950 4621 l 10950 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 6540 m 10950 6420 l 11054 6480 l 11054 6600 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 6420 m 10950 6300 l 11054 6360 l 11054 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 6300 m 10950 6180 l 11054 6240 l 11054 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 6180 m 10950 6060 l 11054 6120 l 11054 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 6060 m 10950 5940 l 11054 6000 l 11054 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 5940 m 10950 5820 l 11054 5880 l 11054 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 5820 m 10950 5700 l 11054 5760 l 11054 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 5700 m 10950 5580 l 11054 5641 l 11054 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 5580 m 10950 5460 l 11054 5521 l 11054 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 5460 m 10950 5340 l 11054 5401 l 11054 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 5340 m 10950 5220 l 11054 5281 l 11054 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 5220 m 10950 5100 l 11054 5161 l 11054 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 5100 m 10950 4980 l 11054 5041 l 11054 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 4980 m 10950 4860 l 11054 4921 l 11054 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 4860 m 10950 4740 l 11054 4801 l 11054 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 4740 m 10950 4620 l 11054 4681 l 11054 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 6600 m 11054 6480 l 11158 6540 l 11158 6660 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 6480 m 11054 6360 l 11158 6420 l 11158 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 6360 m 11054 6240 l 11158 6300 l 11158 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 6240 m 11054 6120 l 11158 6180 l 11158 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 6120 m 11054 6000 l 11158 6060 l 11158 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 6000 m 11054 5880 l 11158 5940 l 11158 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 5880 m 11054 5760 l 11158 5820 l 11158 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 5760 m 11054 5640 l 11158 5701 l 11158 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 5640 m 11054 5520 l 11158 5581 l 11158 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 5520 m 11054 5400 l 11158 5461 l 11158 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 5400 m 11054 5280 l 11158 5341 l 11158 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 5280 m 11054 5160 l 11158 5221 l 11158 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 5160 m 11054 5040 l 11158 5101 l 11158 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 5040 m 11054 4920 l 11158 4981 l 11158 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 4920 m 11054 4800 l 11158 4861 l 11158 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 4800 m 11054 4680 l 11158 4741 l 11158 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 6660 m 11158 6540 l 11262 6600 l 11262 6720 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 6540 m 11158 6420 l 11262 6480 l 11262 6600 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 6420 m 11158 6300 l 11262 6360 l 11262 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 6300 m 11158 6180 l 11262 6240 l 11262 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 6180 m 11158 6060 l 11262 6120 l 11262 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 6060 m 11158 5940 l 11262 6000 l 11262 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 5940 m 11158 5820 l 11262 5880 l 11262 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 5820 m 11158 5700 l 11262 5760 l 11262 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 5700 m 11158 5580 l 11262 5641 l 11262 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 5580 m 11158 5460 l 11262 5521 l 11262 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 5460 m 11158 5340 l 11262 5401 l 11262 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 5340 m 11158 5220 l 11262 5281 l 11262 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 5220 m 11158 5100 l 11262 5161 l 11262 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 5100 m 11158 4980 l 11262 5041 l 11262 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 4980 m 11158 4860 l 11262 4921 l 11262 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 4860 m 11158 4740 l 11262 4801 l 11262 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 5520 m 9703 5581 l 9600 5640 l 9497 5580 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9497 5580 m 9600 5641 l 9497 5700 l 9393 5640 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9393 5760 m 9497 5820 l 9393 5879 l 9289 5819 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9289 5820 m 9393 5880 l 9289 5939 l 9185 5879 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9185 5880 m 9289 5940 l 9185 5999 l 9081 5939 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9081 5940 m 9185 6000 l 9081 6059 l 8977 5999 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 8977 6000 m 9081 6060 l 8977 6119 l 8873 6059 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 8873 6060 m 8977 6120 l 8873 6179 l 8769 6119 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 8769 6120 m 8873 6180 l 8769 6239 l 8665 6179 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 8665 6300 m 8769 6360 l 8665 6419 l 8561 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 6360 m 8665 6420 l 8561 6479 l 8457 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 6420 m 8561 6480 l 8457 6539 l 8353 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 6480 m 8457 6540 l 8353 6599 l 8250 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 6540 m 8353 6600 l 8250 6659 l 8146 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 6600 m 8250 6660 l 8146 6719 l 8042 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8042 6660 m 8146 6720 l 8042 6779 l 7938 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 5700 m 9807 5760 l 9703 5819 l 9600 5760 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9600 5760 m 9703 5820 l 9600 5879 l 9497 5819 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9497 5820 m 9600 5880 l 9497 5939 l 9393 5879 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9393 5880 m 9497 5940 l 9393 5999 l 9289 5939 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 9289 6060 m 9393 6120 l 9289 6179 l 9185 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 6120 m 9289 6180 l 9185 6239 l 9081 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 6180 m 9185 6240 l 9081 6299 l 8977 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 6240 m 9081 6300 l 8977 6359 l 8873 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 6300 m 8977 6360 l 8873 6419 l 8769 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 6360 m 8873 6420 l 8769 6479 l 8665 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 6420 m 8769 6480 l 8665 6539 l 8561 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 6480 m 8665 6540 l 8561 6599 l 8457 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 6540 m 8561 6600 l 8457 6659 l 8353 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 6600 m 8457 6660 l 8353 6719 l 8250 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 6660 m 8353 6720 l 8250 6779 l 8146 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8146 6720 m 8250 6780 l 8146 6839 l 8042 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 5880 m 9911 5940 l 9807 5999 l 9703 5939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 5940 m 9807 6000 l 9703 6059 l 9600 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 6000 m 9703 6060 l 9600 6119 l 9497 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 6060 m 9600 6120 l 9497 6179 l 9393 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 6120 m 9497 6180 l 9393 6239 l 9289 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 6180 m 9393 6240 l 9289 6299 l 9185 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 6240 m 9289 6300 l 9185 6359 l 9081 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 6300 m 9185 6360 l 9081 6419 l 8977 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 6360 m 9081 6420 l 8977 6479 l 8873 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 6420 m 8977 6480 l 8873 6539 l 8769 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 6480 m 8873 6540 l 8769 6599 l 8665 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 6540 m 8769 6600 l 8665 6659 l 8561 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 6600 m 8665 6660 l 8561 6719 l 8457 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 6660 m 8561 6720 l 8457 6779 l 8353 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 6720 m 8457 6780 l 8353 6839 l 8250 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8250 6780 m 8353 6840 l 8250 6899 l 8146 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 5940 m 10015 6000 l 9911 6059 l 9807 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 6000 m 9911 6060 l 9807 6119 l 9703 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 6060 m 9807 6120 l 9703 6179 l 9600 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 6120 m 9703 6180 l 9600 6239 l 9497 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 6180 m 9600 6240 l 9497 6299 l 9393 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 6240 m 9497 6300 l 9393 6359 l 9289 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 6300 m 9393 6360 l 9289 6419 l 9185 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 6360 m 9289 6420 l 9185 6479 l 9081 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 6420 m 9185 6480 l 9081 6539 l 8977 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 6480 m 9081 6540 l 8977 6599 l 8873 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 6540 m 8977 6600 l 8873 6659 l 8769 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 6600 m 8873 6660 l 8769 6719 l 8665 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 6660 m 8769 6720 l 8665 6779 l 8561 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 6720 m 8665 6780 l 8561 6839 l 8457 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 6780 m 8561 6840 l 8457 6899 l 8353 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8353 6840 m 8457 6900 l 8353 6959 l 8250 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 6000 m 10119 6060 l 10015 6119 l 9911 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 6060 m 10015 6120 l 9911 6179 l 9807 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 6120 m 9911 6180 l 9807 6239 l 9703 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 6180 m 9807 6240 l 9703 6299 l 9600 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 6240 m 9703 6300 l 9600 6359 l 9497 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 6300 m 9600 6360 l 9497 6419 l 9393 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 6360 m 9497 6420 l 9393 6479 l 9289 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 6420 m 9393 6480 l 9289 6539 l 9185 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 6480 m 9289 6540 l 9185 6599 l 9081 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 6540 m 9185 6600 l 9081 6659 l 8977 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 6600 m 9081 6660 l 8977 6719 l 8873 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 6660 m 8977 6720 l 8873 6779 l 8769 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 6720 m 8873 6780 l 8769 6839 l 8665 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 6780 m 8769 6840 l 8665 6899 l 8561 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 6840 m 8665 6900 l 8561 6959 l 8457 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8457 6900 m 8561 6960 l 8457 7019 l 8353 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 6060 m 10223 6120 l 10119 6179 l 10015 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 6120 m 10119 6180 l 10015 6239 l 9911 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 6180 m 10015 6240 l 9911 6299 l 9807 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 6240 m 9911 6300 l 9807 6359 l 9703 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 6300 m 9807 6360 l 9703 6419 l 9600 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 6360 m 9703 6420 l 9600 6479 l 9497 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 6420 m 9600 6480 l 9497 6539 l 9393 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 6480 m 9497 6540 l 9393 6599 l 9289 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 6540 m 9393 6600 l 9289 6659 l 9185 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 6600 m 9289 6660 l 9185 6719 l 9081 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 6660 m 9185 6720 l 9081 6779 l 8977 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 6720 m 9081 6780 l 8977 6839 l 8873 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 6780 m 8977 6840 l 8873 6899 l 8769 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 6840 m 8873 6900 l 8769 6959 l 8665 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 6900 m 8769 6960 l 8665 7019 l 8561 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8561 6960 m 8665 7020 l 8561 7079 l 8457 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 6120 m 10327 6180 l 10223 6239 l 10119 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 6180 m 10223 6240 l 10119 6299 l 10015 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 6240 m 10119 6300 l 10015 6359 l 9911 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 6300 m 10015 6360 l 9911 6419 l 9807 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 6360 m 9911 6420 l 9807 6479 l 9703 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 6420 m 9807 6480 l 9703 6539 l 9600 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 6480 m 9703 6540 l 9600 6599 l 9497 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 6540 m 9600 6600 l 9497 6659 l 9393 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 6600 m 9497 6660 l 9393 6719 l 9289 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 6660 m 9393 6720 l 9289 6779 l 9185 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 6720 m 9289 6780 l 9185 6839 l 9081 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 6780 m 9185 6840 l 9081 6899 l 8977 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 6840 m 9081 6900 l 8977 6959 l 8873 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 6900 m 8977 6960 l 8873 7019 l 8769 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 6960 m 8873 7020 l 8769 7079 l 8665 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8665 7020 m 8769 7080 l 8665 7139 l 8561 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 6180 m 10431 6240 l 10327 6299 l 10223 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 6240 m 10327 6300 l 10223 6359 l 10119 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 6300 m 10223 6360 l 10119 6419 l 10015 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 6360 m 10119 6420 l 10015 6479 l 9911 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 6420 m 10015 6480 l 9911 6539 l 9807 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 6480 m 9911 6540 l 9807 6599 l 9703 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 6540 m 9807 6600 l 9703 6659 l 9600 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 6600 m 9703 6660 l 9600 6719 l 9497 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 6660 m 9600 6720 l 9497 6779 l 9393 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 6720 m 9497 6780 l 9393 6839 l 9289 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 6780 m 9393 6840 l 9289 6899 l 9185 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 6840 m 9289 6900 l 9185 6959 l 9081 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 6900 m 9185 6960 l 9081 7019 l 8977 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 6960 m 9081 7020 l 8977 7079 l 8873 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 7020 m 8977 7080 l 8873 7139 l 8769 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8769 7080 m 8873 7140 l 8769 7199 l 8665 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 6240 m 10535 6300 l 10431 6359 l 10327 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 6300 m 10431 6360 l 10327 6419 l 10223 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 6360 m 10327 6420 l 10223 6479 l 10119 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 6420 m 10223 6480 l 10119 6539 l 10015 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 6480 m 10119 6540 l 10015 6599 l 9911 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 6540 m 10015 6600 l 9911 6659 l 9807 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 6600 m 9911 6660 l 9807 6719 l 9703 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 6660 m 9807 6720 l 9703 6779 l 9600 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 6720 m 9703 6780 l 9600 6839 l 9497 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 6780 m 9600 6840 l 9497 6899 l 9393 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 6840 m 9497 6900 l 9393 6959 l 9289 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 6900 m 9393 6960 l 9289 7019 l 9185 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 6960 m 9289 7020 l 9185 7079 l 9081 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 7020 m 9185 7080 l 9081 7139 l 8977 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 7080 m 9081 7140 l 8977 7199 l 8873 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8873 7140 m 8977 7200 l 8873 7259 l 8769 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 6300 m 10639 6360 l 10535 6419 l 10431 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 6360 m 10535 6420 l 10431 6479 l 10327 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 6420 m 10431 6480 l 10327 6539 l 10223 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 6480 m 10327 6540 l 10223 6599 l 10119 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 6540 m 10223 6600 l 10119 6659 l 10015 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 6600 m 10119 6660 l 10015 6719 l 9911 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 6660 m 10015 6720 l 9911 6779 l 9807 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 6720 m 9911 6780 l 9807 6839 l 9703 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 6780 m 9807 6840 l 9703 6899 l 9600 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 6840 m 9703 6900 l 9600 6959 l 9497 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 6900 m 9600 6960 l 9497 7019 l 9393 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 6960 m 9497 7020 l 9393 7079 l 9289 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 7020 m 9393 7080 l 9289 7139 l 9185 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 7080 m 9289 7140 l 9185 7199 l 9081 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 7140 m 9185 7200 l 9081 7259 l 8977 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 8977 7200 m 9081 7260 l 8977 7319 l 8873 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 6360 m 10743 6420 l 10639 6479 l 10535 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 6420 m 10639 6480 l 10535 6539 l 10431 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 6480 m 10535 6540 l 10431 6599 l 10327 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 6540 m 10431 6600 l 10327 6659 l 10223 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 6600 m 10327 6660 l 10223 6719 l 10119 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 6660 m 10223 6720 l 10119 6779 l 10015 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 6720 m 10119 6780 l 10015 6839 l 9911 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 6780 m 10015 6840 l 9911 6899 l 9807 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 6840 m 9911 6900 l 9807 6959 l 9703 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 6900 m 9807 6960 l 9703 7019 l 9600 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 6960 m 9703 7020 l 9600 7079 l 9497 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 7020 m 9600 7080 l 9497 7139 l 9393 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 7080 m 9497 7140 l 9393 7199 l 9289 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 7140 m 9393 7200 l 9289 7259 l 9185 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 7200 m 9289 7260 l 9185 7319 l 9081 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9081 7260 m 9185 7320 l 9081 7379 l 8977 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 6420 m 10847 6480 l 10743 6539 l 10639 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 6480 m 10743 6540 l 10639 6599 l 10535 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 6540 m 10639 6600 l 10535 6659 l 10431 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 6600 m 10535 6660 l 10431 6719 l 10327 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 6660 m 10431 6720 l 10327 6779 l 10223 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 6720 m 10327 6780 l 10223 6839 l 10119 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 6780 m 10223 6840 l 10119 6899 l 10015 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 6840 m 10119 6900 l 10015 6959 l 9911 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 6900 m 10015 6960 l 9911 7019 l 9807 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 6960 m 9911 7020 l 9807 7079 l 9703 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 7020 m 9807 7080 l 9703 7139 l 9600 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 7080 m 9703 7140 l 9600 7199 l 9497 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 7140 m 9600 7200 l 9497 7259 l 9393 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 7200 m 9497 7260 l 9393 7319 l 9289 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 7260 m 9393 7320 l 9289 7379 l 9185 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9185 7320 m 9289 7380 l 9185 7439 l 9081 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 6480 m 10950 6540 l 10847 6599 l 10743 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 6540 m 10847 6600 l 10743 6659 l 10639 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 6600 m 10743 6660 l 10639 6719 l 10535 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 6660 m 10639 6720 l 10535 6779 l 10431 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 6720 m 10535 6780 l 10431 6839 l 10327 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 6780 m 10431 6840 l 10327 6899 l 10223 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 6840 m 10327 6900 l 10223 6959 l 10119 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 6900 m 10223 6960 l 10119 7019 l 10015 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 6960 m 10119 7020 l 10015 7079 l 9911 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 7020 m 10015 7080 l 9911 7139 l 9807 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 7080 m 9911 7140 l 9807 7199 l 9703 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 7140 m 9807 7200 l 9703 7259 l 9600 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 7200 m 9703 7260 l 9600 7319 l 9497 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 7260 m 9600 7320 l 9497 7379 l 9393 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 7320 m 9497 7380 l 9393 7439 l 9289 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9289 7380 m 9393 7440 l 9289 7499 l 9185 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 6540 m 11054 6600 l 10950 6659 l 10847 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 6600 m 10950 6660 l 10847 6719 l 10743 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 6660 m 10847 6720 l 10743 6779 l 10639 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 6720 m 10743 6780 l 10639 6839 l 10535 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 6780 m 10639 6840 l 10535 6899 l 10431 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 6840 m 10535 6900 l 10431 6959 l 10327 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 6900 m 10431 6960 l 10327 7019 l 10223 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 6960 m 10327 7020 l 10223 7079 l 10119 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 7020 m 10223 7080 l 10119 7139 l 10015 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 7080 m 10119 7140 l 10015 7199 l 9911 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 7140 m 10015 7200 l 9911 7259 l 9807 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 7200 m 9911 7260 l 9807 7319 l 9703 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 7260 m 9807 7320 l 9703 7379 l 9600 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 7320 m 9703 7380 l 9600 7439 l 9497 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 7380 m 9600 7440 l 9497 7499 l 9393 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9393 7440 m 9497 7500 l 9393 7559 l 9289 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 6600 m 11158 6660 l 11054 6719 l 10950 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 6660 m 11054 6720 l 10950 6779 l 10847 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 6720 m 10950 6780 l 10847 6839 l 10743 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 6780 m 10847 6840 l 10743 6899 l 10639 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 6840 m 10743 6900 l 10639 6959 l 10535 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 6900 m 10639 6960 l 10535 7019 l 10431 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 6960 m 10535 7020 l 10431 7079 l 10327 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 7020 m 10431 7080 l 10327 7139 l 10223 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 7080 m 10327 7140 l 10223 7199 l 10119 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 7140 m 10223 7200 l 10119 7259 l 10015 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 7200 m 10119 7260 l 10015 7319 l 9911 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 7260 m 10015 7320 l 9911 7379 l 9807 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 7320 m 9911 7380 l 9807 7439 l 9703 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 7380 m 9807 7440 l 9703 7499 l 9600 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 7440 m 9703 7500 l 9600 7559 l 9497 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9497 7500 m 9600 7560 l 9497 7619 l 9393 7559 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11158 6660 m 11262 6720 l 11158 6779 l 11054 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11054 6720 m 11158 6780 l 11054 6839 l 10950 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10950 6780 m 11054 6840 l 10950 6899 l 10847 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10847 6840 m 10950 6900 l 10847 6959 l 10743 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10743 6900 m 10847 6960 l 10743 7019 l 10639 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10639 6960 m 10743 7020 l 10639 7079 l 10535 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10535 7020 m 10639 7080 l 10535 7139 l 10431 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10431 7080 m 10535 7140 l 10431 7199 l 10327 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10327 7140 m 10431 7200 l 10327 7259 l 10223 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10223 7200 m 10327 7260 l 10223 7319 l 10119 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10119 7260 m 10223 7320 l 10119 7379 l 10015 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 10015 7320 m 10119 7380 l 10015 7439 l 9911 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9911 7380 m 10015 7440 l 9911 7499 l 9807 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9807 7440 m 9911 7500 l 9807 7559 l 9703 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9703 7500 m 9807 7560 l 9703 7619 l 9600 7559 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 9600 7560 m 9703 7620 l 9600 7679 l 9497 7619 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 5820 m 13440 5879 l 13440 5760 l 13543 5701 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 13440 5640 m 13337 5700 l 13337 5580 l 13440 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5520 m 13337 5580 l 13337 5460 l 13440 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5400 m 13337 5460 l 13337 5340 l 13440 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5280 m 13337 5340 l 13337 5220 l 13440 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5160 m 13337 5220 l 13337 5100 l 13440 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5040 m 13337 5100 l 13337 4980 l 13440 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4920 m 13337 4980 l 13337 4860 l 13440 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4800 m 13337 4860 l 13337 4740 l 13440 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4680 m 13337 4740 l 13337 4620 l 13440 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4560 m 13337 4620 l 13337 4500 l 13440 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4440 m 13337 4500 l 13337 4380 l 13440 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4320 m 13337 4380 l 13337 4260 l 13440 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4200 m 13337 4260 l 13337 4140 l 13440 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4080 m 13337 4140 l 13337 4020 l 13440 3961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 3960 m 13337 4020 l 13337 3900 l 13440 3841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5880 m 13337 5939 l 13337 5819 l 13440 5760 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 13337 5700 m 13233 5760 l 13233 5640 l 13337 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 5580 m 13233 5640 l 13233 5520 l 13337 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 5460 m 13233 5520 l 13233 5400 l 13337 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 5340 m 13233 5400 l 13233 5280 l 13337 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 5220 m 13233 5280 l 13233 5160 l 13337 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 5100 m 13233 5160 l 13233 5040 l 13337 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 4980 m 13233 5040 l 13233 4920 l 13337 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 4860 m 13233 4920 l 13233 4800 l 13337 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 4740 m 13233 4800 l 13233 4680 l 13337 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 4620 m 13233 4680 l 13233 4560 l 13337 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 4500 m 13233 4560 l 13233 4440 l 13337 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 4380 m 13233 4440 l 13233 4320 l 13337 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 4260 m 13233 4320 l 13233 4200 l 13337 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 4140 m 13233 4200 l 13233 4080 l 13337 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 4020 m 13233 4080 l 13233 3960 l 13337 3901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 5940 m 13233 5999 l 13233 5879 l 13337 5820 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 13233 5760 m 13129 5819 l 13129 5700 l 13233 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 5640 m 13129 5700 l 13129 5580 l 13233 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 5520 m 13129 5580 l 13129 5460 l 13233 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 5400 m 13129 5460 l 13129 5340 l 13233 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 5280 m 13129 5340 l 13129 5220 l 13233 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 5160 m 13129 5220 l 13129 5100 l 13233 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 5040 m 13129 5100 l 13129 4980 l 13233 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 4920 m 13129 4980 l 13129 4860 l 13233 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 4800 m 13129 4860 l 13129 4740 l 13233 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 4680 m 13129 4740 l 13129 4620 l 13233 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 4560 m 13129 4620 l 13129 4500 l 13233 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 4440 m 13129 4500 l 13129 4380 l 13233 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 4320 m 13129 4380 l 13129 4260 l 13233 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 4200 m 13129 4260 l 13129 4140 l 13233 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 4080 m 13129 4140 l 13129 4020 l 13233 3961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 6000 m 13129 6059 l 13129 5939 l 13233 5880 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 13129 5820 m 13025 5879 l 13025 5760 l 13129 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 5700 m 13025 5760 l 13025 5640 l 13129 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 5580 m 13025 5640 l 13025 5520 l 13129 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 5460 m 13025 5520 l 13025 5400 l 13129 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 5340 m 13025 5400 l 13025 5280 l 13129 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 5220 m 13025 5280 l 13025 5160 l 13129 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 5100 m 13025 5160 l 13025 5040 l 13129 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 4980 m 13025 5040 l 13025 4920 l 13129 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 4860 m 13025 4920 l 13025 4800 l 13129 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 4740 m 13025 4800 l 13025 4680 l 13129 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 4620 m 13025 4680 l 13025 4560 l 13129 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 4500 m 13025 4560 l 13025 4440 l 13129 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 4380 m 13025 4440 l 13025 4320 l 13129 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 4260 m 13025 4320 l 13025 4200 l 13129 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 4140 m 13025 4200 l 13025 4080 l 13129 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 6060 m 13025 6119 l 13025 5999 l 13129 5940 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 13025 5880 m 12921 5939 l 12921 5819 l 13025 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 5760 m 12921 5819 l 12921 5700 l 13025 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 5640 m 12921 5700 l 12921 5580 l 13025 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 5520 m 12921 5580 l 12921 5460 l 13025 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 5400 m 12921 5460 l 12921 5340 l 13025 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 5280 m 12921 5340 l 12921 5220 l 13025 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 5160 m 12921 5220 l 12921 5100 l 13025 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 5040 m 12921 5100 l 12921 4980 l 13025 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 4920 m 12921 4980 l 12921 4860 l 13025 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 4800 m 12921 4860 l 12921 4740 l 13025 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 4680 m 12921 4740 l 12921 4620 l 13025 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 4560 m 12921 4620 l 12921 4500 l 13025 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 4440 m 12921 4500 l 12921 4380 l 13025 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 4320 m 12921 4380 l 12921 4260 l 13025 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 4200 m 12921 4260 l 12921 4140 l 13025 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 6120 m 12921 6179 l 12921 6059 l 13025 6000 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 12921 5940 m 12817 5999 l 12817 5879 l 12921 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 5820 m 12817 5879 l 12817 5760 l 12921 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 5700 m 12817 5760 l 12817 5640 l 12921 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 5580 m 12817 5640 l 12817 5520 l 12921 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 5460 m 12817 5520 l 12817 5400 l 12921 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 5340 m 12817 5400 l 12817 5280 l 12921 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 5220 m 12817 5280 l 12817 5160 l 12921 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 5100 m 12817 5160 l 12817 5040 l 12921 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 4980 m 12817 5040 l 12817 4920 l 12921 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 4860 m 12817 4920 l 12817 4800 l 12921 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 4740 m 12817 4800 l 12817 4680 l 12921 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 4620 m 12817 4680 l 12817 4560 l 12921 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 4500 m 12817 4560 l 12817 4440 l 12921 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 4380 m 12817 4440 l 12817 4320 l 12921 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 4260 m 12817 4320 l 12817 4200 l 12921 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 6180 m 12817 6239 l 12817 6119 l 12921 6060 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 12817 6000 m 12713 6059 l 12713 5939 l 12817 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 5880 m 12713 5939 l 12713 5819 l 12817 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 5760 m 12713 5819 l 12713 5700 l 12817 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 5640 m 12713 5700 l 12713 5580 l 12817 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 5520 m 12713 5580 l 12713 5460 l 12817 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 5400 m 12713 5460 l 12713 5340 l 12817 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 5280 m 12713 5340 l 12713 5220 l 12817 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 5160 m 12713 5220 l 12713 5100 l 12817 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 5040 m 12713 5100 l 12713 4980 l 12817 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 4920 m 12713 4980 l 12713 4860 l 12817 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 4800 m 12713 4860 l 12713 4740 l 12817 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 4680 m 12713 4740 l 12713 4620 l 12817 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 4560 m 12713 4620 l 12713 4500 l 12817 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 4440 m 12713 4500 l 12713 4380 l 12817 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 4320 m 12713 4380 l 12713 4260 l 12817 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 6240 m 12713 6299 l 12713 6179 l 12817 6120 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 12713 6060 m 12609 6119 l 12609 5999 l 12713 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 5940 m 12609 5999 l 12609 5879 l 12713 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 5820 m 12609 5879 l 12609 5760 l 12713 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 5700 m 12609 5760 l 12609 5640 l 12713 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 5580 m 12609 5640 l 12609 5520 l 12713 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 5460 m 12609 5520 l 12609 5400 l 12713 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 5340 m 12609 5400 l 12609 5280 l 12713 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 5220 m 12609 5280 l 12609 5160 l 12713 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 5100 m 12609 5160 l 12609 5040 l 12713 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 4980 m 12609 5040 l 12609 4920 l 12713 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 4860 m 12609 4920 l 12609 4800 l 12713 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 4740 m 12609 4800 l 12609 4680 l 12713 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 4620 m 12609 4680 l 12609 4560 l 12713 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 4500 m 12609 4560 l 12609 4440 l 12713 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 4380 m 12609 4440 l 12609 4320 l 12713 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 6300 m 12609 6359 l 12609 6239 l 12713 6180 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 12609 6120 m 12505 6179 l 12505 6059 l 12609 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 6000 m 12505 6059 l 12505 5939 l 12609 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 5880 m 12505 5939 l 12505 5819 l 12609 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 5760 m 12505 5819 l 12505 5700 l 12609 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 5640 m 12505 5700 l 12505 5580 l 12609 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 5520 m 12505 5580 l 12505 5460 l 12609 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 5400 m 12505 5460 l 12505 5340 l 12609 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 5280 m 12505 5340 l 12505 5220 l 12609 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 5160 m 12505 5220 l 12505 5100 l 12609 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 5040 m 12505 5100 l 12505 4980 l 12609 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 4920 m 12505 4980 l 12505 4860 l 12609 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 4800 m 12505 4860 l 12505 4740 l 12609 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 4680 m 12505 4740 l 12505 4620 l 12609 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 4560 m 12505 4620 l 12505 4500 l 12609 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 4440 m 12505 4500 l 12505 4380 l 12609 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 6360 m 12505 6419 l 12505 6299 l 12609 6240 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 12505 6180 m 12401 6239 l 12401 6119 l 12505 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 6060 m 12401 6119 l 12401 5999 l 12505 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 5940 m 12401 5999 l 12401 5879 l 12505 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 5820 m 12401 5879 l 12401 5760 l 12505 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 5700 m 12401 5760 l 12401 5640 l 12505 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 5580 m 12401 5640 l 12401 5520 l 12505 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 5460 m 12401 5520 l 12401 5400 l 12505 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 5340 m 12401 5400 l 12401 5280 l 12505 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 5220 m 12401 5280 l 12401 5160 l 12505 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 5100 m 12401 5160 l 12401 5040 l 12505 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 4980 m 12401 5040 l 12401 4920 l 12505 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 4860 m 12401 4920 l 12401 4800 l 12505 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 4740 m 12401 4800 l 12401 4680 l 12505 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 4620 m 12401 4680 l 12401 4560 l 12505 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 4500 m 12401 4560 l 12401 4440 l 12505 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 6420 m 12401 6479 l 12401 6359 l 12505 6300 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 12401 6240 m 12297 6299 l 12297 6179 l 12401 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 6120 m 12297 6179 l 12297 6059 l 12401 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 6000 m 12297 6059 l 12297 5939 l 12401 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 5880 m 12297 5939 l 12297 5819 l 12401 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 5760 m 12297 5819 l 12297 5700 l 12401 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 5640 m 12297 5700 l 12297 5580 l 12401 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 5520 m 12297 5580 l 12297 5460 l 12401 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 5400 m 12297 5460 l 12297 5340 l 12401 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 5280 m 12297 5340 l 12297 5220 l 12401 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 5160 m 12297 5220 l 12297 5100 l 12401 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 5040 m 12297 5100 l 12297 4980 l 12401 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 4920 m 12297 4980 l 12297 4860 l 12401 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 4800 m 12297 4860 l 12297 4740 l 12401 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 4680 m 12297 4740 l 12297 4620 l 12401 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 4560 m 12297 4620 l 12297 4500 l 12401 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 6480 m 12297 6539 l 12297 6419 l 12401 6360 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 12297 6300 m 12193 6359 l 12193 6239 l 12297 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 6180 m 12193 6239 l 12193 6119 l 12297 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 6060 m 12193 6119 l 12193 5999 l 12297 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 5940 m 12193 5999 l 12193 5879 l 12297 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 5820 m 12193 5879 l 12193 5760 l 12297 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 5700 m 12193 5760 l 12193 5640 l 12297 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 5580 m 12193 5640 l 12193 5520 l 12297 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 5460 m 12193 5520 l 12193 5400 l 12297 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 5340 m 12193 5400 l 12193 5280 l 12297 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 5220 m 12193 5280 l 12193 5160 l 12297 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 5100 m 12193 5160 l 12193 5040 l 12297 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 4980 m 12193 5040 l 12193 4920 l 12297 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 4860 m 12193 4920 l 12193 4800 l 12297 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 4740 m 12193 4800 l 12193 4680 l 12297 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 4620 m 12193 4680 l 12193 4560 l 12297 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 6540 m 12193 6599 l 12193 6479 l 12297 6420 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 12193 6360 m 12090 6419 l 12090 6299 l 12193 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 6240 m 12090 6299 l 12090 6179 l 12193 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 6120 m 12090 6179 l 12090 6059 l 12193 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 6000 m 12090 6059 l 12090 5939 l 12193 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 5880 m 12090 5939 l 12090 5819 l 12193 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 5760 m 12090 5819 l 12090 5700 l 12193 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 5640 m 12090 5700 l 12090 5580 l 12193 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 5520 m 12090 5580 l 12090 5460 l 12193 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 5400 m 12090 5460 l 12090 5340 l 12193 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 5280 m 12090 5340 l 12090 5220 l 12193 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 5160 m 12090 5220 l 12090 5100 l 12193 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 5040 m 12090 5100 l 12090 4980 l 12193 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 4920 m 12090 4980 l 12090 4860 l 12193 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 4800 m 12090 4860 l 12090 4740 l 12193 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 4680 m 12090 4740 l 12090 4620 l 12193 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 6600 m 12090 6659 l 12090 6539 l 12193 6480 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 12090 6420 m 11986 6479 l 11986 6359 l 12090 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 6300 m 11986 6359 l 11986 6239 l 12090 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 6180 m 11986 6239 l 11986 6119 l 12090 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 6060 m 11986 6119 l 11986 5999 l 12090 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 5940 m 11986 5999 l 11986 5879 l 12090 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 5820 m 11986 5879 l 11986 5760 l 12090 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 5700 m 11986 5760 l 11986 5640 l 12090 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 5580 m 11986 5640 l 11986 5520 l 12090 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 5460 m 11986 5520 l 11986 5400 l 12090 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 5340 m 11986 5400 l 11986 5280 l 12090 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 5220 m 11986 5280 l 11986 5160 l 12090 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 5100 m 11986 5160 l 11986 5040 l 12090 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 4980 m 11986 5040 l 11986 4920 l 12090 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 4860 m 11986 4920 l 11986 4800 l 12090 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 4740 m 11986 4800 l 11986 4680 l 12090 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 6660 m 11986 6719 l 11986 6599 l 12090 6540 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 11986 6480 m 11882 6539 l 11882 6419 l 11986 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 6360 m 11882 6419 l 11882 6299 l 11986 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 6240 m 11882 6299 l 11882 6179 l 11986 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 6120 m 11882 6179 l 11882 6059 l 11986 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 6000 m 11882 6059 l 11882 5939 l 11986 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 5880 m 11882 5939 l 11882 5819 l 11986 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 5760 m 11882 5819 l 11882 5700 l 11986 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 5640 m 11882 5700 l 11882 5580 l 11986 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 5520 m 11882 5580 l 11882 5460 l 11986 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 5400 m 11882 5460 l 11882 5340 l 11986 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 5280 m 11882 5340 l 11882 5220 l 11986 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 5160 m 11882 5220 l 11882 5100 l 11986 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 5040 m 11882 5100 l 11882 4980 l 11986 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 4920 m 11882 4980 l 11882 4860 l 11986 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 4800 m 11882 4860 l 11882 4740 l 11986 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 6660 m 11778 6719 l 11778 6599 l 11882 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 6540 m 11778 6599 l 11778 6479 l 11882 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 6420 m 11778 6479 l 11778 6359 l 11882 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 6300 m 11778 6359 l 11778 6239 l 11882 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 6180 m 11778 6239 l 11778 6119 l 11882 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 6060 m 11778 6119 l 11778 5999 l 11882 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 5940 m 11778 5999 l 11778 5879 l 11882 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 5820 m 11778 5879 l 11778 5760 l 11882 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 5700 m 11778 5760 l 11778 5640 l 11882 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 5580 m 11778 5640 l 11778 5520 l 11882 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 5460 m 11778 5520 l 11778 5400 l 11882 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 5340 m 11778 5400 l 11778 5280 l 11882 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 5220 m 11778 5280 l 11778 5160 l 11882 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 5100 m 11778 5160 l 11778 5040 l 11882 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 4980 m 11778 5040 l 11778 4920 l 11882 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 4860 m 11778 4920 l 11778 4800 l 11882 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11882 6660 m 11882 6540 l 11986 6600 l 11986 6720 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 13440 5640 m 13440 5520 l 13543 5581 l 13543 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5520 m 13440 5400 l 13543 5461 l 13543 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5400 m 13440 5280 l 13543 5341 l 13543 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5280 m 13440 5160 l 13543 5221 l 13543 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5160 m 13440 5040 l 13543 5101 l 13543 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5040 m 13440 4920 l 13543 4981 l 13543 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4920 m 13440 4800 l 13543 4861 l 13543 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4800 m 13440 4680 l 13543 4741 l 13543 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4680 m 13440 4560 l 13543 4621 l 13543 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4560 m 13440 4440 l 13543 4501 l 13543 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4440 m 13440 4320 l 13543 4381 l 13543 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4320 m 13440 4200 l 13543 4261 l 13543 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4200 m 13440 4080 l 13543 4141 l 13543 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 4080 m 13440 3960 l 13543 4021 l 13543 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 3960 m 13440 3840 l 13543 3901 l 13543 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 5820 m 13543 5700 l 13647 5760 l 13647 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 5700 m 13543 5580 l 13647 5641 l 13647 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 5580 m 13543 5460 l 13647 5521 l 13647 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 5460 m 13543 5340 l 13647 5401 l 13647 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 5340 m 13543 5220 l 13647 5281 l 13647 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 5220 m 13543 5100 l 13647 5161 l 13647 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 5100 m 13543 4980 l 13647 5041 l 13647 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 4980 m 13543 4860 l 13647 4921 l 13647 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 4860 m 13543 4740 l 13647 4801 l 13647 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 4740 m 13543 4620 l 13647 4681 l 13647 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 4620 m 13543 4500 l 13647 4561 l 13647 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 4500 m 13543 4380 l 13647 4441 l 13647 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 4380 m 13543 4260 l 13647 4321 l 13647 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 4260 m 13543 4140 l 13647 4201 l 13647 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 4140 m 13543 4020 l 13647 4081 l 13647 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 4020 m 13543 3900 l 13647 3961 l 13647 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 5880 m 13647 5760 l 13751 5820 l 13751 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 5760 m 13647 5640 l 13751 5701 l 13751 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 5640 m 13647 5520 l 13751 5581 l 13751 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 5520 m 13647 5400 l 13751 5461 l 13751 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 5400 m 13647 5280 l 13751 5341 l 13751 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 5280 m 13647 5160 l 13751 5221 l 13751 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 5160 m 13647 5040 l 13751 5101 l 13751 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 5040 m 13647 4920 l 13751 4981 l 13751 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 4920 m 13647 4800 l 13751 4861 l 13751 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 4800 m 13647 4680 l 13751 4741 l 13751 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 4680 m 13647 4560 l 13751 4621 l 13751 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 4560 m 13647 4440 l 13751 4501 l 13751 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 4440 m 13647 4320 l 13751 4381 l 13751 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 4320 m 13647 4200 l 13751 4261 l 13751 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 4200 m 13647 4080 l 13751 4141 l 13751 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 4080 m 13647 3960 l 13751 4021 l 13751 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 5940 m 13751 5820 l 13855 5880 l 13855 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 5820 m 13751 5700 l 13855 5760 l 13855 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 5700 m 13751 5580 l 13855 5641 l 13855 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 5580 m 13751 5460 l 13855 5521 l 13855 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 5460 m 13751 5340 l 13855 5401 l 13855 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 5340 m 13751 5220 l 13855 5281 l 13855 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 5220 m 13751 5100 l 13855 5161 l 13855 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 5100 m 13751 4980 l 13855 5041 l 13855 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 4980 m 13751 4860 l 13855 4921 l 13855 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 4860 m 13751 4740 l 13855 4801 l 13855 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 4740 m 13751 4620 l 13855 4681 l 13855 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 4620 m 13751 4500 l 13855 4561 l 13855 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 4500 m 13751 4380 l 13855 4441 l 13855 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 4380 m 13751 4260 l 13855 4321 l 13855 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 4260 m 13751 4140 l 13855 4201 l 13855 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 4140 m 13751 4020 l 13855 4081 l 13855 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 6000 m 13855 5880 l 13959 5940 l 13959 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 5880 m 13855 5760 l 13959 5820 l 13959 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 5760 m 13855 5640 l 13959 5701 l 13959 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 5640 m 13855 5520 l 13959 5581 l 13959 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 5520 m 13855 5400 l 13959 5461 l 13959 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 5400 m 13855 5280 l 13959 5341 l 13959 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 5280 m 13855 5160 l 13959 5221 l 13959 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 5160 m 13855 5040 l 13959 5101 l 13959 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 5040 m 13855 4920 l 13959 4981 l 13959 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 4920 m 13855 4800 l 13959 4861 l 13959 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 4800 m 13855 4680 l 13959 4741 l 13959 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 4680 m 13855 4560 l 13959 4621 l 13959 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 4560 m 13855 4440 l 13959 4501 l 13959 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 4440 m 13855 4320 l 13959 4381 l 13959 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 4320 m 13855 4200 l 13959 4261 l 13959 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 4200 m 13855 4080 l 13959 4141 l 13959 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 6060 m 13959 5940 l 14063 6000 l 14063 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 5940 m 13959 5820 l 14063 5880 l 14063 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 5820 m 13959 5700 l 14063 5760 l 14063 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 5700 m 13959 5580 l 14063 5641 l 14063 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 5580 m 13959 5460 l 14063 5521 l 14063 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 5460 m 13959 5340 l 14063 5401 l 14063 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 5340 m 13959 5220 l 14063 5281 l 14063 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 5220 m 13959 5100 l 14063 5161 l 14063 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 5100 m 13959 4980 l 14063 5041 l 14063 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 4980 m 13959 4860 l 14063 4921 l 14063 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 4860 m 13959 4740 l 14063 4801 l 14063 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 4740 m 13959 4620 l 14063 4681 l 14063 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 4620 m 13959 4500 l 14063 4561 l 14063 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 4500 m 13959 4380 l 14063 4441 l 14063 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 4380 m 13959 4260 l 14063 4321 l 14063 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 4260 m 13959 4140 l 14063 4201 l 14063 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 6120 m 14063 6000 l 14167 6060 l 14167 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 6000 m 14063 5880 l 14167 5940 l 14167 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 5880 m 14063 5760 l 14167 5820 l 14167 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 5760 m 14063 5640 l 14167 5701 l 14167 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 5640 m 14063 5520 l 14167 5581 l 14167 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 5520 m 14063 5400 l 14167 5461 l 14167 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 5400 m 14063 5280 l 14167 5341 l 14167 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 5280 m 14063 5160 l 14167 5221 l 14167 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 5160 m 14063 5040 l 14167 5101 l 14167 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 5040 m 14063 4920 l 14167 4981 l 14167 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 4920 m 14063 4800 l 14167 4861 l 14167 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 4800 m 14063 4680 l 14167 4741 l 14167 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 4680 m 14063 4560 l 14167 4621 l 14167 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 4560 m 14063 4440 l 14167 4501 l 14167 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 4440 m 14063 4320 l 14167 4381 l 14167 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 4320 m 14063 4200 l 14167 4261 l 14167 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 6180 m 14167 6060 l 14271 6120 l 14271 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 6060 m 14167 5940 l 14271 6000 l 14271 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 5940 m 14167 5820 l 14271 5880 l 14271 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 5820 m 14167 5700 l 14271 5760 l 14271 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 5700 m 14167 5580 l 14271 5641 l 14271 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 5580 m 14167 5460 l 14271 5521 l 14271 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 5460 m 14167 5340 l 14271 5401 l 14271 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 5340 m 14167 5220 l 14271 5281 l 14271 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 5220 m 14167 5100 l 14271 5161 l 14271 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 5100 m 14167 4980 l 14271 5041 l 14271 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 4980 m 14167 4860 l 14271 4921 l 14271 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 4860 m 14167 4740 l 14271 4801 l 14271 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 4740 m 14167 4620 l 14271 4681 l 14271 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 4620 m 14167 4500 l 14271 4561 l 14271 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 4500 m 14167 4380 l 14271 4441 l 14271 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 4380 m 14167 4260 l 14271 4321 l 14271 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 6240 m 14271 6120 l 14375 6180 l 14375 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 6120 m 14271 6000 l 14375 6060 l 14375 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 6000 m 14271 5880 l 14375 5940 l 14375 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 5880 m 14271 5760 l 14375 5820 l 14375 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 5760 m 14271 5640 l 14375 5701 l 14375 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 5640 m 14271 5520 l 14375 5581 l 14375 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 5520 m 14271 5400 l 14375 5461 l 14375 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 5400 m 14271 5280 l 14375 5341 l 14375 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 5280 m 14271 5160 l 14375 5221 l 14375 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 5160 m 14271 5040 l 14375 5101 l 14375 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 5040 m 14271 4920 l 14375 4981 l 14375 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 4920 m 14271 4800 l 14375 4861 l 14375 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 4800 m 14271 4680 l 14375 4741 l 14375 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 4680 m 14271 4560 l 14375 4621 l 14375 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 4560 m 14271 4440 l 14375 4501 l 14375 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 4440 m 14271 4320 l 14375 4381 l 14375 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 6300 m 14375 6180 l 14479 6240 l 14479 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 6180 m 14375 6060 l 14479 6120 l 14479 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 6060 m 14375 5940 l 14479 6000 l 14479 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 5940 m 14375 5820 l 14479 5880 l 14479 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 5820 m 14375 5700 l 14479 5760 l 14479 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 5700 m 14375 5580 l 14479 5641 l 14479 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 5580 m 14375 5460 l 14479 5521 l 14479 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 5460 m 14375 5340 l 14479 5401 l 14479 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 5340 m 14375 5220 l 14479 5281 l 14479 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 5220 m 14375 5100 l 14479 5161 l 14479 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 5100 m 14375 4980 l 14479 5041 l 14479 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 4980 m 14375 4860 l 14479 4921 l 14479 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 4860 m 14375 4740 l 14479 4801 l 14479 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 4740 m 14375 4620 l 14479 4681 l 14479 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 4620 m 14375 4500 l 14479 4561 l 14479 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 4500 m 14375 4380 l 14479 4441 l 14479 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 6360 m 14479 6240 l 14583 6300 l 14583 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 6240 m 14479 6120 l 14583 6180 l 14583 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 6120 m 14479 6000 l 14583 6060 l 14583 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 6000 m 14479 5880 l 14583 5940 l 14583 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 5880 m 14479 5760 l 14583 5820 l 14583 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 5760 m 14479 5640 l 14583 5701 l 14583 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 5640 m 14479 5520 l 14583 5581 l 14583 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 5520 m 14479 5400 l 14583 5461 l 14583 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 5400 m 14479 5280 l 14583 5341 l 14583 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 5280 m 14479 5160 l 14583 5221 l 14583 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 5160 m 14479 5040 l 14583 5101 l 14583 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 5040 m 14479 4920 l 14583 4981 l 14583 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 4920 m 14479 4800 l 14583 4861 l 14583 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 4800 m 14479 4680 l 14583 4741 l 14583 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 4680 m 14479 4560 l 14583 4621 l 14583 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 4560 m 14479 4440 l 14583 4501 l 14583 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 6420 m 14583 6300 l 14687 6360 l 14687 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 6300 m 14583 6180 l 14687 6240 l 14687 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 6180 m 14583 6060 l 14687 6120 l 14687 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 6060 m 14583 5940 l 14687 6000 l 14687 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 5940 m 14583 5820 l 14687 5880 l 14687 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 5820 m 14583 5700 l 14687 5760 l 14687 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 5700 m 14583 5580 l 14687 5641 l 14687 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 5580 m 14583 5460 l 14687 5521 l 14687 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 5460 m 14583 5340 l 14687 5401 l 14687 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 5340 m 14583 5220 l 14687 5281 l 14687 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 5220 m 14583 5100 l 14687 5161 l 14687 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 5100 m 14583 4980 l 14687 5041 l 14687 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 4980 m 14583 4860 l 14687 4921 l 14687 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 4860 m 14583 4740 l 14687 4801 l 14687 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 4740 m 14583 4620 l 14687 4681 l 14687 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 4620 m 14583 4500 l 14687 4561 l 14687 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 6480 m 14687 6360 l 14790 6420 l 14790 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 6360 m 14687 6240 l 14790 6300 l 14790 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 6240 m 14687 6120 l 14790 6180 l 14790 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 6120 m 14687 6000 l 14790 6060 l 14790 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 6000 m 14687 5880 l 14790 5940 l 14790 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 5880 m 14687 5760 l 14790 5820 l 14790 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 5760 m 14687 5640 l 14790 5701 l 14790 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 5640 m 14687 5520 l 14790 5581 l 14790 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 5520 m 14687 5400 l 14790 5461 l 14790 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 5400 m 14687 5280 l 14790 5341 l 14790 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 5280 m 14687 5160 l 14790 5221 l 14790 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 5160 m 14687 5040 l 14790 5101 l 14790 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 5040 m 14687 4920 l 14790 4981 l 14790 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 4920 m 14687 4800 l 14790 4861 l 14790 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 4800 m 14687 4680 l 14790 4741 l 14790 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 4680 m 14687 4560 l 14790 4621 l 14790 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 6540 m 14790 6420 l 14894 6480 l 14894 6600 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 6420 m 14790 6300 l 14894 6360 l 14894 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 6300 m 14790 6180 l 14894 6240 l 14894 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 6180 m 14790 6060 l 14894 6120 l 14894 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 6060 m 14790 5940 l 14894 6000 l 14894 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 5940 m 14790 5820 l 14894 5880 l 14894 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 5820 m 14790 5700 l 14894 5760 l 14894 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 5700 m 14790 5580 l 14894 5641 l 14894 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 5580 m 14790 5460 l 14894 5521 l 14894 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 5460 m 14790 5340 l 14894 5401 l 14894 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 5340 m 14790 5220 l 14894 5281 l 14894 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 5220 m 14790 5100 l 14894 5161 l 14894 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 5100 m 14790 4980 l 14894 5041 l 14894 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 4980 m 14790 4860 l 14894 4921 l 14894 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 4860 m 14790 4740 l 14894 4801 l 14894 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 4740 m 14790 4620 l 14894 4681 l 14894 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 6600 m 14894 6480 l 14998 6540 l 14998 6660 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 6480 m 14894 6360 l 14998 6420 l 14998 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 6360 m 14894 6240 l 14998 6300 l 14998 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 6240 m 14894 6120 l 14998 6180 l 14998 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 6120 m 14894 6000 l 14998 6060 l 14998 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 6000 m 14894 5880 l 14998 5940 l 14998 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 5880 m 14894 5760 l 14998 5820 l 14998 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 5760 m 14894 5640 l 14998 5701 l 14998 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 5640 m 14894 5520 l 14998 5581 l 14998 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 5520 m 14894 5400 l 14998 5461 l 14998 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 5400 m 14894 5280 l 14998 5341 l 14998 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 5280 m 14894 5160 l 14998 5221 l 14998 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 5160 m 14894 5040 l 14998 5101 l 14998 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 5040 m 14894 4920 l 14998 4981 l 14998 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 4920 m 14894 4800 l 14998 4861 l 14998 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 4800 m 14894 4680 l 14998 4741 l 14998 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 6660 m 14998 6540 l 15102 6600 l 15102 6720 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 6540 m 14998 6420 l 15102 6480 l 15102 6600 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 6420 m 14998 6300 l 15102 6360 l 15102 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 6300 m 14998 6180 l 15102 6240 l 15102 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 6180 m 14998 6060 l 15102 6120 l 15102 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 6060 m 14998 5940 l 15102 6000 l 15102 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 5940 m 14998 5820 l 15102 5880 l 15102 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 5820 m 14998 5700 l 15102 5760 l 15102 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 5700 m 14998 5580 l 15102 5641 l 15102 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 5580 m 14998 5460 l 15102 5521 l 15102 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 5460 m 14998 5340 l 15102 5401 l 15102 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 5340 m 14998 5220 l 15102 5281 l 15102 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 5220 m 14998 5100 l 15102 5161 l 15102 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 5100 m 14998 4980 l 15102 5041 l 15102 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 4980 m 14998 4860 l 15102 4921 l 15102 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 4860 m 14998 4740 l 15102 4801 l 15102 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5640 m 13543 5701 l 13440 5760 l 13337 5700 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13337 5700 m 13440 5760 l 13337 5819 l 13233 5760 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13233 5760 m 13337 5820 l 13233 5879 l 13129 5819 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13129 5820 m 13233 5880 l 13129 5939 l 13025 5879 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 13025 5880 m 13129 5940 l 13025 5999 l 12921 5939 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 12921 5940 m 13025 6000 l 12921 6059 l 12817 5999 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 12817 6000 m 12921 6060 l 12817 6119 l 12713 6059 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 12713 6060 m 12817 6120 l 12713 6179 l 12609 6119 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 12609 6120 m 12713 6180 l 12609 6239 l 12505 6179 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 12505 6180 m 12609 6240 l 12505 6299 l 12401 6239 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 12401 6240 m 12505 6300 l 12401 6359 l 12297 6299 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 12297 6300 m 12401 6360 l 12297 6419 l 12193 6359 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 12193 6360 m 12297 6420 l 12193 6479 l 12090 6419 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 12090 6420 m 12193 6480 l 12090 6539 l 11986 6479 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 11986 6480 m 12090 6540 l 11986 6599 l 11882 6539 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 11882 6660 m 11986 6720 l 11882 6779 l 11778 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 5820 m 13647 5880 l 13543 5939 l 13440 5879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 5880 m 13543 5940 l 13440 5999 l 13337 5939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 5940 m 13440 6000 l 13337 6059 l 13233 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 6000 m 13337 6060 l 13233 6119 l 13129 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 6060 m 13233 6120 l 13129 6179 l 13025 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 6120 m 13129 6180 l 13025 6239 l 12921 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 6180 m 13025 6240 l 12921 6299 l 12817 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 6240 m 12921 6300 l 12817 6359 l 12713 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 6300 m 12817 6360 l 12713 6419 l 12609 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 6360 m 12713 6420 l 12609 6479 l 12505 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 6420 m 12609 6480 l 12505 6539 l 12401 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 6480 m 12505 6540 l 12401 6599 l 12297 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 6540 m 12401 6600 l 12297 6659 l 12193 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 6600 m 12297 6660 l 12193 6719 l 12090 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 6660 m 12193 6720 l 12090 6779 l 11986 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 11986 6720 m 12090 6780 l 11986 6839 l 11882 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 5880 m 13751 5940 l 13647 5999 l 13543 5939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 5940 m 13647 6000 l 13543 6059 l 13440 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 6000 m 13543 6060 l 13440 6119 l 13337 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 6060 m 13440 6120 l 13337 6179 l 13233 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 6120 m 13337 6180 l 13233 6239 l 13129 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 6180 m 13233 6240 l 13129 6299 l 13025 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 6240 m 13129 6300 l 13025 6359 l 12921 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 6300 m 13025 6360 l 12921 6419 l 12817 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 6360 m 12921 6420 l 12817 6479 l 12713 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 6420 m 12817 6480 l 12713 6539 l 12609 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 6480 m 12713 6540 l 12609 6599 l 12505 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 6540 m 12609 6600 l 12505 6659 l 12401 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 6600 m 12505 6660 l 12401 6719 l 12297 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 6660 m 12401 6720 l 12297 6779 l 12193 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 6720 m 12297 6780 l 12193 6839 l 12090 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12090 6780 m 12193 6840 l 12090 6899 l 11986 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 5940 m 13855 6000 l 13751 6059 l 13647 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 6000 m 13751 6060 l 13647 6119 l 13543 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 6060 m 13647 6120 l 13543 6179 l 13440 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 6120 m 13543 6180 l 13440 6239 l 13337 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 6180 m 13440 6240 l 13337 6299 l 13233 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 6240 m 13337 6300 l 13233 6359 l 13129 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 6300 m 13233 6360 l 13129 6419 l 13025 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 6360 m 13129 6420 l 13025 6479 l 12921 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 6420 m 13025 6480 l 12921 6539 l 12817 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 6480 m 12921 6540 l 12817 6599 l 12713 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 6540 m 12817 6600 l 12713 6659 l 12609 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 6600 m 12713 6660 l 12609 6719 l 12505 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 6660 m 12609 6720 l 12505 6779 l 12401 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 6720 m 12505 6780 l 12401 6839 l 12297 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 6780 m 12401 6840 l 12297 6899 l 12193 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12193 6840 m 12297 6900 l 12193 6959 l 12090 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 6000 m 13959 6060 l 13855 6119 l 13751 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 6060 m 13855 6120 l 13751 6179 l 13647 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 6120 m 13751 6180 l 13647 6239 l 13543 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 6180 m 13647 6240 l 13543 6299 l 13440 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 6240 m 13543 6300 l 13440 6359 l 13337 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 6300 m 13440 6360 l 13337 6419 l 13233 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 6360 m 13337 6420 l 13233 6479 l 13129 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 6420 m 13233 6480 l 13129 6539 l 13025 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 6480 m 13129 6540 l 13025 6599 l 12921 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 6540 m 13025 6600 l 12921 6659 l 12817 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 6600 m 12921 6660 l 12817 6719 l 12713 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 6660 m 12817 6720 l 12713 6779 l 12609 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 6720 m 12713 6780 l 12609 6839 l 12505 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 6780 m 12609 6840 l 12505 6899 l 12401 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 6840 m 12505 6900 l 12401 6959 l 12297 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12297 6900 m 12401 6960 l 12297 7019 l 12193 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 6060 m 14063 6120 l 13959 6179 l 13855 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 6120 m 13959 6180 l 13855 6239 l 13751 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 6180 m 13855 6240 l 13751 6299 l 13647 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 6240 m 13751 6300 l 13647 6359 l 13543 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 6300 m 13647 6360 l 13543 6419 l 13440 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 6360 m 13543 6420 l 13440 6479 l 13337 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 6420 m 13440 6480 l 13337 6539 l 13233 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 6480 m 13337 6540 l 13233 6599 l 13129 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 6540 m 13233 6600 l 13129 6659 l 13025 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 6600 m 13129 6660 l 13025 6719 l 12921 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 6660 m 13025 6720 l 12921 6779 l 12817 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 6720 m 12921 6780 l 12817 6839 l 12713 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 6780 m 12817 6840 l 12713 6899 l 12609 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 6840 m 12713 6900 l 12609 6959 l 12505 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 6900 m 12609 6960 l 12505 7019 l 12401 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12401 6960 m 12505 7020 l 12401 7079 l 12297 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 6120 m 14167 6180 l 14063 6239 l 13959 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 6180 m 14063 6240 l 13959 6299 l 13855 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 6240 m 13959 6300 l 13855 6359 l 13751 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 6300 m 13855 6360 l 13751 6419 l 13647 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 6360 m 13751 6420 l 13647 6479 l 13543 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 6420 m 13647 6480 l 13543 6539 l 13440 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 6480 m 13543 6540 l 13440 6599 l 13337 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 6540 m 13440 6600 l 13337 6659 l 13233 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 6600 m 13337 6660 l 13233 6719 l 13129 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 6660 m 13233 6720 l 13129 6779 l 13025 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 6720 m 13129 6780 l 13025 6839 l 12921 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 6780 m 13025 6840 l 12921 6899 l 12817 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 6840 m 12921 6900 l 12817 6959 l 12713 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 6900 m 12817 6960 l 12713 7019 l 12609 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 6960 m 12713 7020 l 12609 7079 l 12505 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12505 7020 m 12609 7080 l 12505 7139 l 12401 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 6180 m 14271 6240 l 14167 6299 l 14063 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 6240 m 14167 6300 l 14063 6359 l 13959 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 6300 m 14063 6360 l 13959 6419 l 13855 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 6360 m 13959 6420 l 13855 6479 l 13751 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 6420 m 13855 6480 l 13751 6539 l 13647 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 6480 m 13751 6540 l 13647 6599 l 13543 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 6540 m 13647 6600 l 13543 6659 l 13440 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 6600 m 13543 6660 l 13440 6719 l 13337 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 6660 m 13440 6720 l 13337 6779 l 13233 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 6720 m 13337 6780 l 13233 6839 l 13129 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 6780 m 13233 6840 l 13129 6899 l 13025 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 6840 m 13129 6900 l 13025 6959 l 12921 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 6900 m 13025 6960 l 12921 7019 l 12817 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 6960 m 12921 7020 l 12817 7079 l 12713 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 7020 m 12817 7080 l 12713 7139 l 12609 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12609 7080 m 12713 7140 l 12609 7199 l 12505 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 6240 m 14375 6300 l 14271 6359 l 14167 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 6300 m 14271 6360 l 14167 6419 l 14063 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 6360 m 14167 6420 l 14063 6479 l 13959 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 6420 m 14063 6480 l 13959 6539 l 13855 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 6480 m 13959 6540 l 13855 6599 l 13751 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 6540 m 13855 6600 l 13751 6659 l 13647 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 6600 m 13751 6660 l 13647 6719 l 13543 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 6660 m 13647 6720 l 13543 6779 l 13440 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 6720 m 13543 6780 l 13440 6839 l 13337 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 6780 m 13440 6840 l 13337 6899 l 13233 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 6840 m 13337 6900 l 13233 6959 l 13129 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 6900 m 13233 6960 l 13129 7019 l 13025 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 6960 m 13129 7020 l 13025 7079 l 12921 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 7020 m 13025 7080 l 12921 7139 l 12817 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 7080 m 12921 7140 l 12817 7199 l 12713 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12713 7140 m 12817 7200 l 12713 7259 l 12609 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 6300 m 14479 6360 l 14375 6419 l 14271 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 6360 m 14375 6420 l 14271 6479 l 14167 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 6420 m 14271 6480 l 14167 6539 l 14063 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 6480 m 14167 6540 l 14063 6599 l 13959 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 6540 m 14063 6600 l 13959 6659 l 13855 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 6600 m 13959 6660 l 13855 6719 l 13751 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 6660 m 13855 6720 l 13751 6779 l 13647 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 6720 m 13751 6780 l 13647 6839 l 13543 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 6780 m 13647 6840 l 13543 6899 l 13440 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 6840 m 13543 6900 l 13440 6959 l 13337 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 6900 m 13440 6960 l 13337 7019 l 13233 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 6960 m 13337 7020 l 13233 7079 l 13129 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 7020 m 13233 7080 l 13129 7139 l 13025 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 7080 m 13129 7140 l 13025 7199 l 12921 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 7140 m 13025 7200 l 12921 7259 l 12817 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12817 7200 m 12921 7260 l 12817 7319 l 12713 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 6360 m 14583 6420 l 14479 6479 l 14375 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 6420 m 14479 6480 l 14375 6539 l 14271 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 6480 m 14375 6540 l 14271 6599 l 14167 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 6540 m 14271 6600 l 14167 6659 l 14063 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 6600 m 14167 6660 l 14063 6719 l 13959 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 6660 m 14063 6720 l 13959 6779 l 13855 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 6720 m 13959 6780 l 13855 6839 l 13751 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 6780 m 13855 6840 l 13751 6899 l 13647 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 6840 m 13751 6900 l 13647 6959 l 13543 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 6900 m 13647 6960 l 13543 7019 l 13440 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 6960 m 13543 7020 l 13440 7079 l 13337 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 7020 m 13440 7080 l 13337 7139 l 13233 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 7080 m 13337 7140 l 13233 7199 l 13129 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 7140 m 13233 7200 l 13129 7259 l 13025 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 7200 m 13129 7260 l 13025 7319 l 12921 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 12921 7260 m 13025 7320 l 12921 7379 l 12817 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 6420 m 14687 6480 l 14583 6539 l 14479 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 6480 m 14583 6540 l 14479 6599 l 14375 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 6540 m 14479 6600 l 14375 6659 l 14271 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 6600 m 14375 6660 l 14271 6719 l 14167 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 6660 m 14271 6720 l 14167 6779 l 14063 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 6720 m 14167 6780 l 14063 6839 l 13959 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 6780 m 14063 6840 l 13959 6899 l 13855 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 6840 m 13959 6900 l 13855 6959 l 13751 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 6900 m 13855 6960 l 13751 7019 l 13647 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 6960 m 13751 7020 l 13647 7079 l 13543 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 7020 m 13647 7080 l 13543 7139 l 13440 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 7080 m 13543 7140 l 13440 7199 l 13337 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 7140 m 13440 7200 l 13337 7259 l 13233 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 7200 m 13337 7260 l 13233 7319 l 13129 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 7260 m 13233 7320 l 13129 7379 l 13025 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13025 7320 m 13129 7380 l 13025 7439 l 12921 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 6480 m 14790 6540 l 14687 6599 l 14583 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 6540 m 14687 6600 l 14583 6659 l 14479 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 6600 m 14583 6660 l 14479 6719 l 14375 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 6660 m 14479 6720 l 14375 6779 l 14271 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 6720 m 14375 6780 l 14271 6839 l 14167 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 6780 m 14271 6840 l 14167 6899 l 14063 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 6840 m 14167 6900 l 14063 6959 l 13959 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 6900 m 14063 6960 l 13959 7019 l 13855 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 6960 m 13959 7020 l 13855 7079 l 13751 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 7020 m 13855 7080 l 13751 7139 l 13647 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 7080 m 13751 7140 l 13647 7199 l 13543 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 7140 m 13647 7200 l 13543 7259 l 13440 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 7200 m 13543 7260 l 13440 7319 l 13337 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 7260 m 13440 7320 l 13337 7379 l 13233 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 7320 m 13337 7380 l 13233 7439 l 13129 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13129 7380 m 13233 7440 l 13129 7499 l 13025 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 6540 m 14894 6600 l 14790 6659 l 14687 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 6600 m 14790 6660 l 14687 6719 l 14583 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 6660 m 14687 6720 l 14583 6779 l 14479 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 6720 m 14583 6780 l 14479 6839 l 14375 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 6780 m 14479 6840 l 14375 6899 l 14271 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 6840 m 14375 6900 l 14271 6959 l 14167 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 6900 m 14271 6960 l 14167 7019 l 14063 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 6960 m 14167 7020 l 14063 7079 l 13959 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 7020 m 14063 7080 l 13959 7139 l 13855 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 7080 m 13959 7140 l 13855 7199 l 13751 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 7140 m 13855 7200 l 13751 7259 l 13647 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 7200 m 13751 7260 l 13647 7319 l 13543 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 7260 m 13647 7320 l 13543 7379 l 13440 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 7320 m 13543 7380 l 13440 7439 l 13337 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 7380 m 13440 7440 l 13337 7499 l 13233 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13233 7440 m 13337 7500 l 13233 7559 l 13129 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 6600 m 14998 6660 l 14894 6719 l 14790 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 6660 m 14894 6720 l 14790 6779 l 14687 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 6720 m 14790 6780 l 14687 6839 l 14583 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 6780 m 14687 6840 l 14583 6899 l 14479 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 6840 m 14583 6900 l 14479 6959 l 14375 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 6900 m 14479 6960 l 14375 7019 l 14271 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 6960 m 14375 7020 l 14271 7079 l 14167 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 7020 m 14271 7080 l 14167 7139 l 14063 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 7080 m 14167 7140 l 14063 7199 l 13959 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 7140 m 14063 7200 l 13959 7259 l 13855 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 7200 m 13959 7260 l 13855 7319 l 13751 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 7260 m 13855 7320 l 13751 7379 l 13647 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 7320 m 13751 7380 l 13647 7439 l 13543 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 7380 m 13647 7440 l 13543 7499 l 13440 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 7440 m 13543 7500 l 13440 7559 l 13337 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13337 7500 m 13440 7560 l 13337 7619 l 13233 7559 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14998 6660 m 15102 6720 l 14998 6779 l 14894 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14894 6720 m 14998 6780 l 14894 6839 l 14790 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14790 6780 m 14894 6840 l 14790 6899 l 14687 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14687 6840 m 14790 6900 l 14687 6959 l 14583 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14583 6900 m 14687 6960 l 14583 7019 l 14479 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14479 6960 m 14583 7020 l 14479 7079 l 14375 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14375 7020 m 14479 7080 l 14375 7139 l 14271 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14271 7080 m 14375 7140 l 14271 7199 l 14167 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14167 7140 m 14271 7200 l 14167 7259 l 14063 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 14063 7200 m 14167 7260 l 14063 7319 l 13959 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13959 7260 m 14063 7320 l 13959 7379 l 13855 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13855 7320 m 13959 7380 l 13855 7439 l 13751 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13751 7380 m 13855 7440 l 13751 7499 l 13647 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13647 7440 m 13751 7500 l 13647 7559 l 13543 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13543 7500 m 13647 7560 l 13543 7619 l 13440 7559 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 13440 7560 m 13543 7620 l 13440 7679 l 13337 7619 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 5820 m 17280 5879 l 17280 5760 l 17383 5701 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 5700 m 17280 5760 l 17280 5640 l 17383 5581 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 5580 m 17280 5640 l 17280 5520 l 17383 5461 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 5460 m 17280 5520 l 17280 5400 l 17383 5341 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 5340 m 17280 5400 l 17280 5280 l 17383 5221 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 5220 m 17280 5280 l 17280 5160 l 17383 5101 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 5100 m 17280 5160 l 17280 5040 l 17383 4981 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 4980 m 17280 5040 l 17280 4920 l 17383 4861 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 4860 m 17280 4920 l 17280 4800 l 17383 4741 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 4740 m 17280 4800 l 17280 4680 l 17383 4621 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17383 4620 m 17280 4680 l 17280 4560 l 17383 4501 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17280 4440 m 17177 4500 l 17177 4380 l 17280 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 4320 m 17177 4380 l 17177 4260 l 17280 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 4200 m 17177 4260 l 17177 4140 l 17280 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 4080 m 17177 4140 l 17177 4020 l 17280 3961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 3960 m 17177 4020 l 17177 3900 l 17280 3841 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 5880 m 17177 5939 l 17177 5819 l 17280 5760 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17280 5760 m 17177 5819 l 17177 5700 l 17280 5641 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17280 5640 m 17177 5700 l 17177 5580 l 17280 5521 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17280 5520 m 17177 5580 l 17177 5460 l 17280 5401 l cp gs col7 0.50 shd ef gr gs col0 s gr % Polyline n 17177 5340 m 17073 5400 l 17073 5280 l 17177 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 5220 m 17073 5280 l 17073 5160 l 17177 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 5100 m 17073 5160 l 17073 5040 l 17177 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 4980 m 17073 5040 l 17073 4920 l 17177 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 4860 m 17073 4920 l 17073 4800 l 17177 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 4740 m 17073 4800 l 17073 4680 l 17177 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 4620 m 17073 4680 l 17073 4560 l 17177 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 4500 m 17073 4560 l 17073 4440 l 17177 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 4380 m 17073 4440 l 17073 4320 l 17177 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 4260 m 17073 4320 l 17073 4200 l 17177 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 4140 m 17073 4200 l 17073 4080 l 17177 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 4020 m 17073 4080 l 17073 3960 l 17177 3901 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 5880 m 16969 5939 l 16969 5819 l 17073 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 5760 m 16969 5819 l 16969 5700 l 17073 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 5640 m 16969 5700 l 16969 5580 l 17073 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 5520 m 16969 5580 l 16969 5460 l 17073 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 5400 m 16969 5460 l 16969 5340 l 17073 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 5280 m 16969 5340 l 16969 5220 l 17073 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 5160 m 16969 5220 l 16969 5100 l 17073 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 5040 m 16969 5100 l 16969 4980 l 17073 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 4920 m 16969 4980 l 16969 4860 l 17073 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 4800 m 16969 4860 l 16969 4740 l 17073 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 4680 m 16969 4740 l 16969 4620 l 17073 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 4560 m 16969 4620 l 16969 4500 l 17073 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 4440 m 16969 4500 l 16969 4380 l 17073 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 4320 m 16969 4380 l 16969 4260 l 17073 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 4200 m 16969 4260 l 16969 4140 l 17073 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 4080 m 16969 4140 l 16969 4020 l 17073 3961 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 5940 m 16865 5999 l 16865 5879 l 16969 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 5820 m 16865 5879 l 16865 5760 l 16969 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 5700 m 16865 5760 l 16865 5640 l 16969 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 5580 m 16865 5640 l 16865 5520 l 16969 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 5460 m 16865 5520 l 16865 5400 l 16969 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 5340 m 16865 5400 l 16865 5280 l 16969 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 5220 m 16865 5280 l 16865 5160 l 16969 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 5100 m 16865 5160 l 16865 5040 l 16969 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 4980 m 16865 5040 l 16865 4920 l 16969 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 4860 m 16865 4920 l 16865 4800 l 16969 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 4740 m 16865 4800 l 16865 4680 l 16969 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 4620 m 16865 4680 l 16865 4560 l 16969 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 4500 m 16865 4560 l 16865 4440 l 16969 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 4380 m 16865 4440 l 16865 4320 l 16969 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 4260 m 16865 4320 l 16865 4200 l 16969 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 4140 m 16865 4200 l 16865 4080 l 16969 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 6000 m 16761 6059 l 16761 5939 l 16865 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 5880 m 16761 5939 l 16761 5819 l 16865 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 5760 m 16761 5819 l 16761 5700 l 16865 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 5640 m 16761 5700 l 16761 5580 l 16865 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 5520 m 16761 5580 l 16761 5460 l 16865 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 5400 m 16761 5460 l 16761 5340 l 16865 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 5280 m 16761 5340 l 16761 5220 l 16865 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 5160 m 16761 5220 l 16761 5100 l 16865 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 5040 m 16761 5100 l 16761 4980 l 16865 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 4920 m 16761 4980 l 16761 4860 l 16865 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 4800 m 16761 4860 l 16761 4740 l 16865 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 4680 m 16761 4740 l 16761 4620 l 16865 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 4560 m 16761 4620 l 16761 4500 l 16865 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 4440 m 16761 4500 l 16761 4380 l 16865 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 4320 m 16761 4380 l 16761 4260 l 16865 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 4200 m 16761 4260 l 16761 4140 l 16865 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 6060 m 16657 6119 l 16657 5999 l 16761 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 5940 m 16657 5999 l 16657 5879 l 16761 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 5820 m 16657 5879 l 16657 5760 l 16761 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 5700 m 16657 5760 l 16657 5640 l 16761 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 5580 m 16657 5640 l 16657 5520 l 16761 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 5460 m 16657 5520 l 16657 5400 l 16761 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 5340 m 16657 5400 l 16657 5280 l 16761 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 5220 m 16657 5280 l 16657 5160 l 16761 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 5100 m 16657 5160 l 16657 5040 l 16761 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 4980 m 16657 5040 l 16657 4920 l 16761 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 4860 m 16657 4920 l 16657 4800 l 16761 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 4740 m 16657 4800 l 16657 4680 l 16761 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 4620 m 16657 4680 l 16657 4560 l 16761 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 4500 m 16657 4560 l 16657 4440 l 16761 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 4380 m 16657 4440 l 16657 4320 l 16761 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 4260 m 16657 4320 l 16657 4200 l 16761 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 6120 m 16553 6179 l 16553 6059 l 16657 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 6000 m 16553 6059 l 16553 5939 l 16657 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 5880 m 16553 5939 l 16553 5819 l 16657 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 5760 m 16553 5819 l 16553 5700 l 16657 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 5640 m 16553 5700 l 16553 5580 l 16657 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 5520 m 16553 5580 l 16553 5460 l 16657 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 5400 m 16553 5460 l 16553 5340 l 16657 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 5280 m 16553 5340 l 16553 5220 l 16657 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 5160 m 16553 5220 l 16553 5100 l 16657 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 5040 m 16553 5100 l 16553 4980 l 16657 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 4920 m 16553 4980 l 16553 4860 l 16657 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 4800 m 16553 4860 l 16553 4740 l 16657 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 4680 m 16553 4740 l 16553 4620 l 16657 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 4560 m 16553 4620 l 16553 4500 l 16657 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 4440 m 16553 4500 l 16553 4380 l 16657 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 4320 m 16553 4380 l 16553 4260 l 16657 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 6180 m 16449 6239 l 16449 6119 l 16553 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 6060 m 16449 6119 l 16449 5999 l 16553 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 5940 m 16449 5999 l 16449 5879 l 16553 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 5820 m 16449 5879 l 16449 5760 l 16553 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 5700 m 16449 5760 l 16449 5640 l 16553 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 5580 m 16449 5640 l 16449 5520 l 16553 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 5460 m 16449 5520 l 16449 5400 l 16553 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 5340 m 16449 5400 l 16449 5280 l 16553 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 5220 m 16449 5280 l 16449 5160 l 16553 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 5100 m 16449 5160 l 16449 5040 l 16553 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 4980 m 16449 5040 l 16449 4920 l 16553 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 4860 m 16449 4920 l 16449 4800 l 16553 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 4740 m 16449 4800 l 16449 4680 l 16553 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 4620 m 16449 4680 l 16449 4560 l 16553 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 4500 m 16449 4560 l 16449 4440 l 16553 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 4380 m 16449 4440 l 16449 4320 l 16553 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 6240 m 16345 6299 l 16345 6179 l 16449 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 6120 m 16345 6179 l 16345 6059 l 16449 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 6000 m 16345 6059 l 16345 5939 l 16449 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 5880 m 16345 5939 l 16345 5819 l 16449 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 5760 m 16345 5819 l 16345 5700 l 16449 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 5640 m 16345 5700 l 16345 5580 l 16449 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 5520 m 16345 5580 l 16345 5460 l 16449 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 5400 m 16345 5460 l 16345 5340 l 16449 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 5280 m 16345 5340 l 16345 5220 l 16449 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 5160 m 16345 5220 l 16345 5100 l 16449 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 5040 m 16345 5100 l 16345 4980 l 16449 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 4920 m 16345 4980 l 16345 4860 l 16449 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 4800 m 16345 4860 l 16345 4740 l 16449 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 4680 m 16345 4740 l 16345 4620 l 16449 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 4560 m 16345 4620 l 16345 4500 l 16449 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 4440 m 16345 4500 l 16345 4380 l 16449 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 6300 m 16241 6359 l 16241 6239 l 16345 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 6180 m 16241 6239 l 16241 6119 l 16345 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 6060 m 16241 6119 l 16241 5999 l 16345 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 5940 m 16241 5999 l 16241 5879 l 16345 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 5820 m 16241 5879 l 16241 5760 l 16345 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 5700 m 16241 5760 l 16241 5640 l 16345 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 5580 m 16241 5640 l 16241 5520 l 16345 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 5460 m 16241 5520 l 16241 5400 l 16345 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 5340 m 16241 5400 l 16241 5280 l 16345 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 5220 m 16241 5280 l 16241 5160 l 16345 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 5100 m 16241 5160 l 16241 5040 l 16345 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 4980 m 16241 5040 l 16241 4920 l 16345 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 4860 m 16241 4920 l 16241 4800 l 16345 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 4740 m 16241 4800 l 16241 4680 l 16345 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 4620 m 16241 4680 l 16241 4560 l 16345 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 4500 m 16241 4560 l 16241 4440 l 16345 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 6360 m 16137 6419 l 16137 6299 l 16241 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 6240 m 16137 6299 l 16137 6179 l 16241 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 6120 m 16137 6179 l 16137 6059 l 16241 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 6000 m 16137 6059 l 16137 5939 l 16241 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 5880 m 16137 5939 l 16137 5819 l 16241 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 5760 m 16137 5819 l 16137 5700 l 16241 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 5640 m 16137 5700 l 16137 5580 l 16241 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 5520 m 16137 5580 l 16137 5460 l 16241 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 5400 m 16137 5460 l 16137 5340 l 16241 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 5280 m 16137 5340 l 16137 5220 l 16241 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 5160 m 16137 5220 l 16137 5100 l 16241 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 5040 m 16137 5100 l 16137 4980 l 16241 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 4920 m 16137 4980 l 16137 4860 l 16241 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 4800 m 16137 4860 l 16137 4740 l 16241 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 4680 m 16137 4740 l 16137 4620 l 16241 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 4560 m 16137 4620 l 16137 4500 l 16241 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 6420 m 16033 6479 l 16033 6359 l 16137 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 6300 m 16033 6359 l 16033 6239 l 16137 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 6180 m 16033 6239 l 16033 6119 l 16137 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 6060 m 16033 6119 l 16033 5999 l 16137 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 5940 m 16033 5999 l 16033 5879 l 16137 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 5820 m 16033 5879 l 16033 5760 l 16137 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 5700 m 16033 5760 l 16033 5640 l 16137 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 5580 m 16033 5640 l 16033 5520 l 16137 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 5460 m 16033 5520 l 16033 5400 l 16137 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 5340 m 16033 5400 l 16033 5280 l 16137 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 5220 m 16033 5280 l 16033 5160 l 16137 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 5100 m 16033 5160 l 16033 5040 l 16137 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 4980 m 16033 5040 l 16033 4920 l 16137 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 4860 m 16033 4920 l 16033 4800 l 16137 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 4740 m 16033 4800 l 16033 4680 l 16137 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 4620 m 16033 4680 l 16033 4560 l 16137 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 6480 m 15930 6539 l 15930 6419 l 16033 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 6360 m 15930 6419 l 15930 6299 l 16033 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 6240 m 15930 6299 l 15930 6179 l 16033 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 6120 m 15930 6179 l 15930 6059 l 16033 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 6000 m 15930 6059 l 15930 5939 l 16033 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 5880 m 15930 5939 l 15930 5819 l 16033 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 5760 m 15930 5819 l 15930 5700 l 16033 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 5640 m 15930 5700 l 15930 5580 l 16033 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 5520 m 15930 5580 l 15930 5460 l 16033 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 5400 m 15930 5460 l 15930 5340 l 16033 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 5280 m 15930 5340 l 15930 5220 l 16033 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 5160 m 15930 5220 l 15930 5100 l 16033 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 5040 m 15930 5100 l 15930 4980 l 16033 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 4920 m 15930 4980 l 15930 4860 l 16033 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 4800 m 15930 4860 l 15930 4740 l 16033 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 4680 m 15930 4740 l 15930 4620 l 16033 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 6540 m 15826 6599 l 15826 6479 l 15930 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 6420 m 15826 6479 l 15826 6359 l 15930 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 6300 m 15826 6359 l 15826 6239 l 15930 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 6180 m 15826 6239 l 15826 6119 l 15930 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 6060 m 15826 6119 l 15826 5999 l 15930 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 5940 m 15826 5999 l 15826 5879 l 15930 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 5820 m 15826 5879 l 15826 5760 l 15930 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 5700 m 15826 5760 l 15826 5640 l 15930 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 5580 m 15826 5640 l 15826 5520 l 15930 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 5460 m 15826 5520 l 15826 5400 l 15930 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 5340 m 15826 5400 l 15826 5280 l 15930 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 5220 m 15826 5280 l 15826 5160 l 15930 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 5100 m 15826 5160 l 15826 5040 l 15930 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 4980 m 15826 5040 l 15826 4920 l 15930 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 4860 m 15826 4920 l 15826 4800 l 15930 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 4740 m 15826 4800 l 15826 4680 l 15930 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 6600 m 15722 6659 l 15722 6539 l 15826 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 6480 m 15722 6539 l 15722 6419 l 15826 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 6360 m 15722 6419 l 15722 6299 l 15826 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 6240 m 15722 6299 l 15722 6179 l 15826 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 6120 m 15722 6179 l 15722 6059 l 15826 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 6000 m 15722 6059 l 15722 5939 l 15826 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 5880 m 15722 5939 l 15722 5819 l 15826 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 5760 m 15722 5819 l 15722 5700 l 15826 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 5640 m 15722 5700 l 15722 5580 l 15826 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 5520 m 15722 5580 l 15722 5460 l 15826 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 5400 m 15722 5460 l 15722 5340 l 15826 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 5280 m 15722 5340 l 15722 5220 l 15826 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 5160 m 15722 5220 l 15722 5100 l 15826 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 5040 m 15722 5100 l 15722 4980 l 15826 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 4920 m 15722 4980 l 15722 4860 l 15826 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 4800 m 15722 4860 l 15722 4740 l 15826 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 6660 m 15618 6719 l 15618 6599 l 15722 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 6540 m 15618 6599 l 15618 6479 l 15722 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 6420 m 15618 6479 l 15618 6359 l 15722 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 6300 m 15618 6359 l 15618 6239 l 15722 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 6180 m 15618 6239 l 15618 6119 l 15722 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 6060 m 15618 6119 l 15618 5999 l 15722 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 5940 m 15618 5999 l 15618 5879 l 15722 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 5820 m 15618 5879 l 15618 5760 l 15722 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 5700 m 15618 5760 l 15618 5640 l 15722 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 5580 m 15618 5640 l 15618 5520 l 15722 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 5460 m 15618 5520 l 15618 5400 l 15722 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 5340 m 15618 5400 l 15618 5280 l 15722 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 5220 m 15618 5280 l 15618 5160 l 15722 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 5100 m 15618 5160 l 15618 5040 l 15722 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 4980 m 15618 5040 l 15618 4920 l 15722 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 4860 m 15618 4920 l 15618 4800 l 15722 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 5880 m 17073 5760 l 17177 5820 l 17177 5940 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17073 5760 m 17073 5640 l 17177 5701 l 17177 5820 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17073 5640 m 17073 5520 l 17177 5581 l 17177 5701 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17073 5520 m 17073 5400 l 17177 5461 l 17177 5581 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17177 5340 m 17177 5220 l 17280 5281 l 17280 5401 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17177 5220 m 17177 5100 l 17280 5161 l 17280 5281 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17177 5100 m 17177 4980 l 17280 5041 l 17280 5161 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17177 4980 m 17177 4860 l 17280 4921 l 17280 5041 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17177 4860 m 17177 4740 l 17280 4801 l 17280 4921 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17177 4740 m 17177 4620 l 17280 4681 l 17280 4801 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17177 4620 m 17177 4500 l 17280 4561 l 17280 4681 l cp gs col7 0.60 shd ef gr gs col0 s gr % Polyline n 17280 4440 m 17280 4320 l 17383 4381 l 17383 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 4320 m 17280 4200 l 17383 4261 l 17383 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 4200 m 17280 4080 l 17383 4141 l 17383 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 4080 m 17280 3960 l 17383 4021 l 17383 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 3960 m 17280 3840 l 17383 3901 l 17383 4021 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 5820 m 17383 5700 l 17487 5760 l 17487 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 5700 m 17383 5580 l 17487 5641 l 17487 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 5580 m 17383 5460 l 17487 5521 l 17487 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 5460 m 17383 5340 l 17487 5401 l 17487 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 5340 m 17383 5220 l 17487 5281 l 17487 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 5220 m 17383 5100 l 17487 5161 l 17487 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 5100 m 17383 4980 l 17487 5041 l 17487 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 4980 m 17383 4860 l 17487 4921 l 17487 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 4860 m 17383 4740 l 17487 4801 l 17487 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 4740 m 17383 4620 l 17487 4681 l 17487 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 4620 m 17383 4500 l 17487 4561 l 17487 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 4500 m 17383 4380 l 17487 4441 l 17487 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 4380 m 17383 4260 l 17487 4321 l 17487 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 4260 m 17383 4140 l 17487 4201 l 17487 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 4140 m 17383 4020 l 17487 4081 l 17487 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 4020 m 17383 3900 l 17487 3961 l 17487 4081 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 5880 m 17487 5760 l 17591 5820 l 17591 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 5760 m 17487 5640 l 17591 5701 l 17591 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 5640 m 17487 5520 l 17591 5581 l 17591 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 5520 m 17487 5400 l 17591 5461 l 17591 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 5400 m 17487 5280 l 17591 5341 l 17591 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 5280 m 17487 5160 l 17591 5221 l 17591 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 5160 m 17487 5040 l 17591 5101 l 17591 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 5040 m 17487 4920 l 17591 4981 l 17591 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 4920 m 17487 4800 l 17591 4861 l 17591 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 4800 m 17487 4680 l 17591 4741 l 17591 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 4680 m 17487 4560 l 17591 4621 l 17591 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 4560 m 17487 4440 l 17591 4501 l 17591 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 4440 m 17487 4320 l 17591 4381 l 17591 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 4320 m 17487 4200 l 17591 4261 l 17591 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 4200 m 17487 4080 l 17591 4141 l 17591 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 4080 m 17487 3960 l 17591 4021 l 17591 4141 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 5940 m 17591 5820 l 17695 5880 l 17695 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 5820 m 17591 5700 l 17695 5760 l 17695 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 5700 m 17591 5580 l 17695 5641 l 17695 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 5580 m 17591 5460 l 17695 5521 l 17695 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 5460 m 17591 5340 l 17695 5401 l 17695 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 5340 m 17591 5220 l 17695 5281 l 17695 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 5220 m 17591 5100 l 17695 5161 l 17695 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 5100 m 17591 4980 l 17695 5041 l 17695 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 4980 m 17591 4860 l 17695 4921 l 17695 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 4860 m 17591 4740 l 17695 4801 l 17695 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 4740 m 17591 4620 l 17695 4681 l 17695 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 4620 m 17591 4500 l 17695 4561 l 17695 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 4500 m 17591 4380 l 17695 4441 l 17695 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 4380 m 17591 4260 l 17695 4321 l 17695 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 4260 m 17591 4140 l 17695 4201 l 17695 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 4140 m 17591 4020 l 17695 4081 l 17695 4201 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 6000 m 17695 5880 l 17799 5940 l 17799 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 5880 m 17695 5760 l 17799 5820 l 17799 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 5760 m 17695 5640 l 17799 5701 l 17799 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 5640 m 17695 5520 l 17799 5581 l 17799 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 5520 m 17695 5400 l 17799 5461 l 17799 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 5400 m 17695 5280 l 17799 5341 l 17799 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 5280 m 17695 5160 l 17799 5221 l 17799 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 5160 m 17695 5040 l 17799 5101 l 17799 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 5040 m 17695 4920 l 17799 4981 l 17799 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 4920 m 17695 4800 l 17799 4861 l 17799 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 4800 m 17695 4680 l 17799 4741 l 17799 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 4680 m 17695 4560 l 17799 4621 l 17799 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 4560 m 17695 4440 l 17799 4501 l 17799 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 4440 m 17695 4320 l 17799 4381 l 17799 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 4320 m 17695 4200 l 17799 4261 l 17799 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 4200 m 17695 4080 l 17799 4141 l 17799 4261 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 6060 m 17799 5940 l 17903 6000 l 17903 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 5940 m 17799 5820 l 17903 5880 l 17903 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 5820 m 17799 5700 l 17903 5760 l 17903 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 5700 m 17799 5580 l 17903 5641 l 17903 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 5580 m 17799 5460 l 17903 5521 l 17903 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 5460 m 17799 5340 l 17903 5401 l 17903 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 5340 m 17799 5220 l 17903 5281 l 17903 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 5220 m 17799 5100 l 17903 5161 l 17903 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 5100 m 17799 4980 l 17903 5041 l 17903 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 4980 m 17799 4860 l 17903 4921 l 17903 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 4860 m 17799 4740 l 17903 4801 l 17903 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 4740 m 17799 4620 l 17903 4681 l 17903 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 4620 m 17799 4500 l 17903 4561 l 17903 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 4500 m 17799 4380 l 17903 4441 l 17903 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 4380 m 17799 4260 l 17903 4321 l 17903 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 4260 m 17799 4140 l 17903 4201 l 17903 4321 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 6120 m 17903 6000 l 18007 6060 l 18007 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 6000 m 17903 5880 l 18007 5940 l 18007 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 5880 m 17903 5760 l 18007 5820 l 18007 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 5760 m 17903 5640 l 18007 5701 l 18007 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 5640 m 17903 5520 l 18007 5581 l 18007 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 5520 m 17903 5400 l 18007 5461 l 18007 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 5400 m 17903 5280 l 18007 5341 l 18007 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 5280 m 17903 5160 l 18007 5221 l 18007 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 5160 m 17903 5040 l 18007 5101 l 18007 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 5040 m 17903 4920 l 18007 4981 l 18007 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 4920 m 17903 4800 l 18007 4861 l 18007 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 4800 m 17903 4680 l 18007 4741 l 18007 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 4680 m 17903 4560 l 18007 4621 l 18007 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 4560 m 17903 4440 l 18007 4501 l 18007 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 4440 m 17903 4320 l 18007 4381 l 18007 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 4320 m 17903 4200 l 18007 4261 l 18007 4381 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 6180 m 18007 6060 l 18111 6120 l 18111 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 6060 m 18007 5940 l 18111 6000 l 18111 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 5940 m 18007 5820 l 18111 5880 l 18111 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 5820 m 18007 5700 l 18111 5760 l 18111 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 5700 m 18007 5580 l 18111 5641 l 18111 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 5580 m 18007 5460 l 18111 5521 l 18111 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 5460 m 18007 5340 l 18111 5401 l 18111 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 5340 m 18007 5220 l 18111 5281 l 18111 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 5220 m 18007 5100 l 18111 5161 l 18111 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 5100 m 18007 4980 l 18111 5041 l 18111 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 4980 m 18007 4860 l 18111 4921 l 18111 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 4860 m 18007 4740 l 18111 4801 l 18111 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 4740 m 18007 4620 l 18111 4681 l 18111 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 4620 m 18007 4500 l 18111 4561 l 18111 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 4500 m 18007 4380 l 18111 4441 l 18111 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 4380 m 18007 4260 l 18111 4321 l 18111 4441 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 6240 m 18111 6120 l 18215 6180 l 18215 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 6120 m 18111 6000 l 18215 6060 l 18215 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 6000 m 18111 5880 l 18215 5940 l 18215 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 5880 m 18111 5760 l 18215 5820 l 18215 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 5760 m 18111 5640 l 18215 5701 l 18215 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 5640 m 18111 5520 l 18215 5581 l 18215 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 5520 m 18111 5400 l 18215 5461 l 18215 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 5400 m 18111 5280 l 18215 5341 l 18215 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 5280 m 18111 5160 l 18215 5221 l 18215 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 5160 m 18111 5040 l 18215 5101 l 18215 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 5040 m 18111 4920 l 18215 4981 l 18215 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 4920 m 18111 4800 l 18215 4861 l 18215 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 4800 m 18111 4680 l 18215 4741 l 18215 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 4680 m 18111 4560 l 18215 4621 l 18215 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 4560 m 18111 4440 l 18215 4501 l 18215 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 4440 m 18111 4320 l 18215 4381 l 18215 4501 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 6300 m 18215 6180 l 18319 6240 l 18319 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 6180 m 18215 6060 l 18319 6120 l 18319 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 6060 m 18215 5940 l 18319 6000 l 18319 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 5940 m 18215 5820 l 18319 5880 l 18319 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 5820 m 18215 5700 l 18319 5760 l 18319 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 5700 m 18215 5580 l 18319 5641 l 18319 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 5580 m 18215 5460 l 18319 5521 l 18319 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 5460 m 18215 5340 l 18319 5401 l 18319 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 5340 m 18215 5220 l 18319 5281 l 18319 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 5220 m 18215 5100 l 18319 5161 l 18319 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 5100 m 18215 4980 l 18319 5041 l 18319 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 4980 m 18215 4860 l 18319 4921 l 18319 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 4860 m 18215 4740 l 18319 4801 l 18319 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 4740 m 18215 4620 l 18319 4681 l 18319 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 4620 m 18215 4500 l 18319 4561 l 18319 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 4500 m 18215 4380 l 18319 4441 l 18319 4561 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 6360 m 18319 6240 l 18423 6300 l 18423 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 6240 m 18319 6120 l 18423 6180 l 18423 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 6120 m 18319 6000 l 18423 6060 l 18423 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 6000 m 18319 5880 l 18423 5940 l 18423 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 5880 m 18319 5760 l 18423 5820 l 18423 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 5760 m 18319 5640 l 18423 5701 l 18423 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 5640 m 18319 5520 l 18423 5581 l 18423 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 5520 m 18319 5400 l 18423 5461 l 18423 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 5400 m 18319 5280 l 18423 5341 l 18423 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 5280 m 18319 5160 l 18423 5221 l 18423 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 5160 m 18319 5040 l 18423 5101 l 18423 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 5040 m 18319 4920 l 18423 4981 l 18423 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 4920 m 18319 4800 l 18423 4861 l 18423 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 4800 m 18319 4680 l 18423 4741 l 18423 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 4680 m 18319 4560 l 18423 4621 l 18423 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 4560 m 18319 4440 l 18423 4501 l 18423 4621 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 6420 m 18423 6300 l 18527 6360 l 18527 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 6300 m 18423 6180 l 18527 6240 l 18527 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 6180 m 18423 6060 l 18527 6120 l 18527 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 6060 m 18423 5940 l 18527 6000 l 18527 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 5940 m 18423 5820 l 18527 5880 l 18527 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 5820 m 18423 5700 l 18527 5760 l 18527 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 5700 m 18423 5580 l 18527 5641 l 18527 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 5580 m 18423 5460 l 18527 5521 l 18527 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 5460 m 18423 5340 l 18527 5401 l 18527 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 5340 m 18423 5220 l 18527 5281 l 18527 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 5220 m 18423 5100 l 18527 5161 l 18527 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 5100 m 18423 4980 l 18527 5041 l 18527 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 4980 m 18423 4860 l 18527 4921 l 18527 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 4860 m 18423 4740 l 18527 4801 l 18527 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 4740 m 18423 4620 l 18527 4681 l 18527 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 4620 m 18423 4500 l 18527 4561 l 18527 4681 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 6480 m 18527 6360 l 18630 6420 l 18630 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 6360 m 18527 6240 l 18630 6300 l 18630 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 6240 m 18527 6120 l 18630 6180 l 18630 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 6120 m 18527 6000 l 18630 6060 l 18630 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 6000 m 18527 5880 l 18630 5940 l 18630 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 5880 m 18527 5760 l 18630 5820 l 18630 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 5760 m 18527 5640 l 18630 5701 l 18630 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 5640 m 18527 5520 l 18630 5581 l 18630 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 5520 m 18527 5400 l 18630 5461 l 18630 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 5400 m 18527 5280 l 18630 5341 l 18630 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 5280 m 18527 5160 l 18630 5221 l 18630 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 5160 m 18527 5040 l 18630 5101 l 18630 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 5040 m 18527 4920 l 18630 4981 l 18630 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 4920 m 18527 4800 l 18630 4861 l 18630 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 4800 m 18527 4680 l 18630 4741 l 18630 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 4680 m 18527 4560 l 18630 4621 l 18630 4741 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 6540 m 18630 6420 l 18734 6480 l 18734 6600 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 6420 m 18630 6300 l 18734 6360 l 18734 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 6300 m 18630 6180 l 18734 6240 l 18734 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 6180 m 18630 6060 l 18734 6120 l 18734 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 6060 m 18630 5940 l 18734 6000 l 18734 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 5940 m 18630 5820 l 18734 5880 l 18734 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 5820 m 18630 5700 l 18734 5760 l 18734 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 5700 m 18630 5580 l 18734 5641 l 18734 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 5580 m 18630 5460 l 18734 5521 l 18734 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 5460 m 18630 5340 l 18734 5401 l 18734 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 5340 m 18630 5220 l 18734 5281 l 18734 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 5220 m 18630 5100 l 18734 5161 l 18734 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 5100 m 18630 4980 l 18734 5041 l 18734 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 4980 m 18630 4860 l 18734 4921 l 18734 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 4860 m 18630 4740 l 18734 4801 l 18734 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 4740 m 18630 4620 l 18734 4681 l 18734 4801 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 6600 m 18734 6480 l 18838 6540 l 18838 6660 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 6480 m 18734 6360 l 18838 6420 l 18838 6540 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 6360 m 18734 6240 l 18838 6300 l 18838 6420 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 6240 m 18734 6120 l 18838 6180 l 18838 6300 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 6120 m 18734 6000 l 18838 6060 l 18838 6180 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 6000 m 18734 5880 l 18838 5940 l 18838 6060 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 5880 m 18734 5760 l 18838 5820 l 18838 5940 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 5760 m 18734 5640 l 18838 5701 l 18838 5820 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 5640 m 18734 5520 l 18838 5581 l 18838 5701 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 5520 m 18734 5400 l 18838 5461 l 18838 5581 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 5400 m 18734 5280 l 18838 5341 l 18838 5461 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 5280 m 18734 5160 l 18838 5221 l 18838 5341 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 5160 m 18734 5040 l 18838 5101 l 18838 5221 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 5040 m 18734 4920 l 18838 4981 l 18838 5101 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 4920 m 18734 4800 l 18838 4861 l 18838 4981 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 4800 m 18734 4680 l 18838 4741 l 18838 4861 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 6660 m 18838 6540 l 18942 6600 l 18942 6720 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 6540 m 18838 6420 l 18942 6480 l 18942 6600 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 6420 m 18838 6300 l 18942 6360 l 18942 6480 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 6300 m 18838 6180 l 18942 6240 l 18942 6360 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 6180 m 18838 6060 l 18942 6120 l 18942 6240 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 6060 m 18838 5940 l 18942 6000 l 18942 6120 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 5940 m 18838 5820 l 18942 5880 l 18942 6000 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 5820 m 18838 5700 l 18942 5760 l 18942 5880 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 5700 m 18838 5580 l 18942 5641 l 18942 5760 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 5580 m 18838 5460 l 18942 5521 l 18942 5641 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 5460 m 18838 5340 l 18942 5401 l 18942 5521 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 5340 m 18838 5220 l 18942 5281 l 18942 5401 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 5220 m 18838 5100 l 18942 5161 l 18942 5281 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 5100 m 18838 4980 l 18942 5041 l 18942 5161 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 4980 m 18838 4860 l 18942 4921 l 18942 5041 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 4860 m 18838 4740 l 18942 4801 l 18942 4921 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 4440 m 17383 4501 l 17280 4560 l 17177 4500 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 17177 5340 m 17280 5401 l 17177 5460 l 17073 5400 l cp gs col7 0.70 shd ef gr gs col0 s gr % Polyline n 17073 5880 m 17177 5940 l 17073 5999 l 16969 5939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 5940 m 17073 6000 l 16969 6059 l 16865 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 6000 m 16969 6060 l 16865 6119 l 16761 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 6060 m 16865 6120 l 16761 6179 l 16657 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 6120 m 16761 6180 l 16657 6239 l 16553 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 6180 m 16657 6240 l 16553 6299 l 16449 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 6240 m 16553 6300 l 16449 6359 l 16345 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 6300 m 16449 6360 l 16345 6419 l 16241 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 6360 m 16345 6420 l 16241 6479 l 16137 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 6420 m 16241 6480 l 16137 6539 l 16033 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 6480 m 16137 6540 l 16033 6599 l 15930 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 6540 m 16033 6600 l 15930 6659 l 15826 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 6600 m 15930 6660 l 15826 6719 l 15722 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15722 6660 m 15826 6720 l 15722 6779 l 15618 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 5820 m 17487 5880 l 17383 5939 l 17280 5879 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 5880 m 17383 5940 l 17280 5999 l 17177 5939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 5940 m 17280 6000 l 17177 6059 l 17073 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 6000 m 17177 6060 l 17073 6119 l 16969 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 6060 m 17073 6120 l 16969 6179 l 16865 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 6120 m 16969 6180 l 16865 6239 l 16761 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 6180 m 16865 6240 l 16761 6299 l 16657 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 6240 m 16761 6300 l 16657 6359 l 16553 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 6300 m 16657 6360 l 16553 6419 l 16449 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 6360 m 16553 6420 l 16449 6479 l 16345 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 6420 m 16449 6480 l 16345 6539 l 16241 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 6480 m 16345 6540 l 16241 6599 l 16137 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 6540 m 16241 6600 l 16137 6659 l 16033 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 6600 m 16137 6660 l 16033 6719 l 15930 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 6660 m 16033 6720 l 15930 6779 l 15826 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15826 6720 m 15930 6780 l 15826 6839 l 15722 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 5880 m 17591 5940 l 17487 5999 l 17383 5939 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 5940 m 17487 6000 l 17383 6059 l 17280 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 6000 m 17383 6060 l 17280 6119 l 17177 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 6060 m 17280 6120 l 17177 6179 l 17073 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 6120 m 17177 6180 l 17073 6239 l 16969 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 6180 m 17073 6240 l 16969 6299 l 16865 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 6240 m 16969 6300 l 16865 6359 l 16761 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 6300 m 16865 6360 l 16761 6419 l 16657 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 6360 m 16761 6420 l 16657 6479 l 16553 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 6420 m 16657 6480 l 16553 6539 l 16449 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 6480 m 16553 6540 l 16449 6599 l 16345 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 6540 m 16449 6600 l 16345 6659 l 16241 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 6600 m 16345 6660 l 16241 6719 l 16137 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 6660 m 16241 6720 l 16137 6779 l 16033 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 6720 m 16137 6780 l 16033 6839 l 15930 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 15930 6780 m 16033 6840 l 15930 6899 l 15826 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 5940 m 17695 6000 l 17591 6059 l 17487 5999 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 6000 m 17591 6060 l 17487 6119 l 17383 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 6060 m 17487 6120 l 17383 6179 l 17280 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 6120 m 17383 6180 l 17280 6239 l 17177 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 6180 m 17280 6240 l 17177 6299 l 17073 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 6240 m 17177 6300 l 17073 6359 l 16969 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 6300 m 17073 6360 l 16969 6419 l 16865 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 6360 m 16969 6420 l 16865 6479 l 16761 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 6420 m 16865 6480 l 16761 6539 l 16657 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 6480 m 16761 6540 l 16657 6599 l 16553 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 6540 m 16657 6600 l 16553 6659 l 16449 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 6600 m 16553 6660 l 16449 6719 l 16345 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 6660 m 16449 6720 l 16345 6779 l 16241 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 6720 m 16345 6780 l 16241 6839 l 16137 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 6780 m 16241 6840 l 16137 6899 l 16033 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16033 6840 m 16137 6900 l 16033 6959 l 15930 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 6000 m 17799 6060 l 17695 6119 l 17591 6059 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 6060 m 17695 6120 l 17591 6179 l 17487 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 6120 m 17591 6180 l 17487 6239 l 17383 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 6180 m 17487 6240 l 17383 6299 l 17280 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 6240 m 17383 6300 l 17280 6359 l 17177 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 6300 m 17280 6360 l 17177 6419 l 17073 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 6360 m 17177 6420 l 17073 6479 l 16969 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 6420 m 17073 6480 l 16969 6539 l 16865 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 6480 m 16969 6540 l 16865 6599 l 16761 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 6540 m 16865 6600 l 16761 6659 l 16657 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 6600 m 16761 6660 l 16657 6719 l 16553 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 6660 m 16657 6720 l 16553 6779 l 16449 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 6720 m 16553 6780 l 16449 6839 l 16345 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 6780 m 16449 6840 l 16345 6899 l 16241 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 6840 m 16345 6900 l 16241 6959 l 16137 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16137 6900 m 16241 6960 l 16137 7019 l 16033 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 6060 m 17903 6120 l 17799 6179 l 17695 6119 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 6120 m 17799 6180 l 17695 6239 l 17591 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 6180 m 17695 6240 l 17591 6299 l 17487 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 6240 m 17591 6300 l 17487 6359 l 17383 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 6300 m 17487 6360 l 17383 6419 l 17280 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 6360 m 17383 6420 l 17280 6479 l 17177 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 6420 m 17280 6480 l 17177 6539 l 17073 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 6480 m 17177 6540 l 17073 6599 l 16969 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 6540 m 17073 6600 l 16969 6659 l 16865 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 6600 m 16969 6660 l 16865 6719 l 16761 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 6660 m 16865 6720 l 16761 6779 l 16657 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 6720 m 16761 6780 l 16657 6839 l 16553 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 6780 m 16657 6840 l 16553 6899 l 16449 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 6840 m 16553 6900 l 16449 6959 l 16345 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 6900 m 16449 6960 l 16345 7019 l 16241 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16241 6960 m 16345 7020 l 16241 7079 l 16137 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 6120 m 18007 6180 l 17903 6239 l 17799 6179 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 6180 m 17903 6240 l 17799 6299 l 17695 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 6240 m 17799 6300 l 17695 6359 l 17591 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 6300 m 17695 6360 l 17591 6419 l 17487 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 6360 m 17591 6420 l 17487 6479 l 17383 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 6420 m 17487 6480 l 17383 6539 l 17280 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 6480 m 17383 6540 l 17280 6599 l 17177 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 6540 m 17280 6600 l 17177 6659 l 17073 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 6600 m 17177 6660 l 17073 6719 l 16969 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 6660 m 17073 6720 l 16969 6779 l 16865 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 6720 m 16969 6780 l 16865 6839 l 16761 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 6780 m 16865 6840 l 16761 6899 l 16657 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 6840 m 16761 6900 l 16657 6959 l 16553 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 6900 m 16657 6960 l 16553 7019 l 16449 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 6960 m 16553 7020 l 16449 7079 l 16345 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16345 7020 m 16449 7080 l 16345 7139 l 16241 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 6180 m 18111 6240 l 18007 6299 l 17903 6239 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 6240 m 18007 6300 l 17903 6359 l 17799 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 6300 m 17903 6360 l 17799 6419 l 17695 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 6360 m 17799 6420 l 17695 6479 l 17591 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 6420 m 17695 6480 l 17591 6539 l 17487 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 6480 m 17591 6540 l 17487 6599 l 17383 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 6540 m 17487 6600 l 17383 6659 l 17280 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 6600 m 17383 6660 l 17280 6719 l 17177 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 6660 m 17280 6720 l 17177 6779 l 17073 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 6720 m 17177 6780 l 17073 6839 l 16969 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 6780 m 17073 6840 l 16969 6899 l 16865 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 6840 m 16969 6900 l 16865 6959 l 16761 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 6900 m 16865 6960 l 16761 7019 l 16657 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 6960 m 16761 7020 l 16657 7079 l 16553 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 7020 m 16657 7080 l 16553 7139 l 16449 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16449 7080 m 16553 7140 l 16449 7199 l 16345 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 6240 m 18215 6300 l 18111 6359 l 18007 6299 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 6300 m 18111 6360 l 18007 6419 l 17903 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 6360 m 18007 6420 l 17903 6479 l 17799 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 6420 m 17903 6480 l 17799 6539 l 17695 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 6480 m 17799 6540 l 17695 6599 l 17591 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 6540 m 17695 6600 l 17591 6659 l 17487 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 6600 m 17591 6660 l 17487 6719 l 17383 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 6660 m 17487 6720 l 17383 6779 l 17280 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 6720 m 17383 6780 l 17280 6839 l 17177 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 6780 m 17280 6840 l 17177 6899 l 17073 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 6840 m 17177 6900 l 17073 6959 l 16969 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 6900 m 17073 6960 l 16969 7019 l 16865 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 6960 m 16969 7020 l 16865 7079 l 16761 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 7020 m 16865 7080 l 16761 7139 l 16657 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 7080 m 16761 7140 l 16657 7199 l 16553 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16553 7140 m 16657 7200 l 16553 7259 l 16449 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 6300 m 18319 6360 l 18215 6419 l 18111 6359 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 6360 m 18215 6420 l 18111 6479 l 18007 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 6420 m 18111 6480 l 18007 6539 l 17903 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 6480 m 18007 6540 l 17903 6599 l 17799 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 6540 m 17903 6600 l 17799 6659 l 17695 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 6600 m 17799 6660 l 17695 6719 l 17591 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 6660 m 17695 6720 l 17591 6779 l 17487 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 6720 m 17591 6780 l 17487 6839 l 17383 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 6780 m 17487 6840 l 17383 6899 l 17280 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 6840 m 17383 6900 l 17280 6959 l 17177 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 6900 m 17280 6960 l 17177 7019 l 17073 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 6960 m 17177 7020 l 17073 7079 l 16969 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 7020 m 17073 7080 l 16969 7139 l 16865 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 7080 m 16969 7140 l 16865 7199 l 16761 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 7140 m 16865 7200 l 16761 7259 l 16657 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16657 7200 m 16761 7260 l 16657 7319 l 16553 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 6360 m 18423 6420 l 18319 6479 l 18215 6419 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 6420 m 18319 6480 l 18215 6539 l 18111 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 6480 m 18215 6540 l 18111 6599 l 18007 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 6540 m 18111 6600 l 18007 6659 l 17903 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 6600 m 18007 6660 l 17903 6719 l 17799 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 6660 m 17903 6720 l 17799 6779 l 17695 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 6720 m 17799 6780 l 17695 6839 l 17591 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 6780 m 17695 6840 l 17591 6899 l 17487 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 6840 m 17591 6900 l 17487 6959 l 17383 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 6900 m 17487 6960 l 17383 7019 l 17280 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 6960 m 17383 7020 l 17280 7079 l 17177 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 7020 m 17280 7080 l 17177 7139 l 17073 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 7080 m 17177 7140 l 17073 7199 l 16969 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 7140 m 17073 7200 l 16969 7259 l 16865 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 7200 m 16969 7260 l 16865 7319 l 16761 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16761 7260 m 16865 7320 l 16761 7379 l 16657 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 6420 m 18527 6480 l 18423 6539 l 18319 6479 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 6480 m 18423 6540 l 18319 6599 l 18215 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 6540 m 18319 6600 l 18215 6659 l 18111 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 6600 m 18215 6660 l 18111 6719 l 18007 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 6660 m 18111 6720 l 18007 6779 l 17903 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 6720 m 18007 6780 l 17903 6839 l 17799 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 6780 m 17903 6840 l 17799 6899 l 17695 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 6840 m 17799 6900 l 17695 6959 l 17591 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 6900 m 17695 6960 l 17591 7019 l 17487 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 6960 m 17591 7020 l 17487 7079 l 17383 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 7020 m 17487 7080 l 17383 7139 l 17280 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 7080 m 17383 7140 l 17280 7199 l 17177 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 7140 m 17280 7200 l 17177 7259 l 17073 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 7200 m 17177 7260 l 17073 7319 l 16969 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 7260 m 17073 7320 l 16969 7379 l 16865 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16865 7320 m 16969 7380 l 16865 7439 l 16761 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 6480 m 18630 6540 l 18527 6599 l 18423 6539 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 6540 m 18527 6600 l 18423 6659 l 18319 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 6600 m 18423 6660 l 18319 6719 l 18215 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 6660 m 18319 6720 l 18215 6779 l 18111 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 6720 m 18215 6780 l 18111 6839 l 18007 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 6780 m 18111 6840 l 18007 6899 l 17903 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 6840 m 18007 6900 l 17903 6959 l 17799 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 6900 m 17903 6960 l 17799 7019 l 17695 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 6960 m 17799 7020 l 17695 7079 l 17591 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 7020 m 17695 7080 l 17591 7139 l 17487 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 7080 m 17591 7140 l 17487 7199 l 17383 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 7140 m 17487 7200 l 17383 7259 l 17280 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 7200 m 17383 7260 l 17280 7319 l 17177 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 7260 m 17280 7320 l 17177 7379 l 17073 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 7320 m 17177 7380 l 17073 7439 l 16969 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 16969 7380 m 17073 7440 l 16969 7499 l 16865 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 6540 m 18734 6600 l 18630 6659 l 18527 6599 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 6600 m 18630 6660 l 18527 6719 l 18423 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 6660 m 18527 6720 l 18423 6779 l 18319 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 6720 m 18423 6780 l 18319 6839 l 18215 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 6780 m 18319 6840 l 18215 6899 l 18111 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 6840 m 18215 6900 l 18111 6959 l 18007 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 6900 m 18111 6960 l 18007 7019 l 17903 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 6960 m 18007 7020 l 17903 7079 l 17799 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 7020 m 17903 7080 l 17799 7139 l 17695 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 7080 m 17799 7140 l 17695 7199 l 17591 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 7140 m 17695 7200 l 17591 7259 l 17487 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 7200 m 17591 7260 l 17487 7319 l 17383 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 7260 m 17487 7320 l 17383 7379 l 17280 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 7320 m 17383 7380 l 17280 7439 l 17177 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 7380 m 17280 7440 l 17177 7499 l 17073 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17073 7440 m 17177 7500 l 17073 7559 l 16969 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 6600 m 18838 6660 l 18734 6719 l 18630 6659 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 6660 m 18734 6720 l 18630 6779 l 18527 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 6720 m 18630 6780 l 18527 6839 l 18423 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 6780 m 18527 6840 l 18423 6899 l 18319 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 6840 m 18423 6900 l 18319 6959 l 18215 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 6900 m 18319 6960 l 18215 7019 l 18111 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 6960 m 18215 7020 l 18111 7079 l 18007 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 7020 m 18111 7080 l 18007 7139 l 17903 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 7080 m 18007 7140 l 17903 7199 l 17799 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 7140 m 17903 7200 l 17799 7259 l 17695 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 7200 m 17799 7260 l 17695 7319 l 17591 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 7260 m 17695 7320 l 17591 7379 l 17487 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 7320 m 17591 7380 l 17487 7439 l 17383 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 7380 m 17487 7440 l 17383 7499 l 17280 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 7440 m 17383 7500 l 17280 7559 l 17177 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17177 7500 m 17280 7560 l 17177 7619 l 17073 7559 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18838 6660 m 18942 6720 l 18838 6779 l 18734 6719 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18734 6720 m 18838 6780 l 18734 6839 l 18630 6779 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18630 6780 m 18734 6840 l 18630 6899 l 18527 6839 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18527 6840 m 18630 6900 l 18527 6959 l 18423 6899 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18423 6900 m 18527 6960 l 18423 7019 l 18319 6959 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18319 6960 m 18423 7020 l 18319 7079 l 18215 7019 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18215 7020 m 18319 7080 l 18215 7139 l 18111 7079 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18111 7080 m 18215 7140 l 18111 7199 l 18007 7139 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 18007 7140 m 18111 7200 l 18007 7259 l 17903 7199 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17903 7200 m 18007 7260 l 17903 7319 l 17799 7259 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17799 7260 m 17903 7320 l 17799 7379 l 17695 7319 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17695 7320 m 17799 7380 l 17695 7439 l 17591 7379 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17591 7380 m 17695 7440 l 17591 7499 l 17487 7439 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17487 7440 m 17591 7500 l 17487 7559 l 17383 7499 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17383 7500 m 17487 7560 l 17383 7619 l 17280 7559 l cp gs col7 1.00 shd ef gr gs col0 s gr % Polyline n 17280 7560 m 17383 7620 l 17280 7679 l 17177 7619 l cp gs col7 1.00 shd ef gr gs col0 s gr % here ends figure; $F2psEnd rs showpage gfan0.8beta/doc/gfan.eps0000664000175000017500000001335415177170257014602 0ustar andersanders%!PS-Adobe-2.0 EPSF-2.0 %%Title: gfan.fig %%Creator: fig2dev Version 3.2 Patchlevel 4 %%CreationDate: Thu Mar 31 14:03:35 2005 %%For: anders@paula (Anders Nedergaard Jensen) %%BoundingBox: 0 0 850 737 %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save newpath 0 737 moveto 0 0 lineto 850 0 lineto 850 737 lineto closepath clip newpath 0.7 735.5 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def $F2psBegin 10 setmiterlimit 0 slj 0 slc 0.06000 0.06000 sc % % Fig objects follow % % % here starts figure with depth 50 % Polyline 7.500 slw n 14142 12247 m 0 12247 l 6397 11664 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 14142 12247 m 6397 11664 l 9596 11372 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 14142 12247 m 9596 11372 l 9764 10497 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 14142 12247 m 9764 10497 l 10101 8748 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 14142 12247 m 10101 8748 l 10438 6998 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 14142 12247 m 10438 6998 l 7071 0 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 10438 6998 m 8586 4374 l 7071 0 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 10438 6998 m 10101 8748 l 8586 4374 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 10101 8748 m 7744 4665 l 8586 4374 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 10101 8748 m 8081 6998 l 7744 4665 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 8081 6998 m 6060 5248 l 7744 4665 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 8586 4374 m 7744 4665 l 7071 0 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 7744 4665 m 6060 5248 l 7071 0 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 6060 5248 m 4377 5832 l 7071 0 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 9764 10497 m 7576 9622 l 10101 8748 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 10101 8748 m 7576 9622 l 7071 8164 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 10101 8748 m 7071 8164 l 8081 6998 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 8081 6998 m 7071 8164 l 6060 5248 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 7071 8164 m 5555 7873 l 6060 5248 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 9596 11372 m 5050 10497 l 9764 10497 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 9764 10497 m 5050 10497 l 7576 9622 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 7576 9622 m 5050 10497 l 7071 8164 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 7071 8164 m 5050 10497 l 5555 7873 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 5050 10497 m 3703 9331 l 5555 7873 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 5555 7873 m 3703 9331 l 6060 5248 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 3703 9331 m 3030 8748 l 6060 5248 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 6060 5248 m 3030 8748 l 4377 5832 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 3030 8748 m 0 12247 l 4377 5832 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 4377 5832 m 0 12247 l 7071 0 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 9596 11372 m 6397 11664 l 5050 10497 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 6397 11664 m 0 12247 l 5050 10497 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 5050 10497 m 0 12247 l 3703 9331 l cp gs col7 0.25 tnt ef gr gs col0 s gr % Polyline n 3703 9331 m 0 12247 l 3030 8748 l cp gs col7 0.25 tnt ef gr gs col0 s gr % here ends figure; $F2psEnd rs showpage gfan0.8beta/doc/manual.tex0000664000175000017500000005071615177170257015160 0ustar andersanders\include{defines} \def\name{Gfan } \def\nameversion{gfan0.8beta} \def\exename{gfan} \begin{document} \title{\name version 0.8beta: A User's Manual} \author{Anders Nedergaard Jensen \thanks{Research partially supported by the Faculty of Science, University of Aarhus, Danish Research Training Council (Forskeruddannelsesr\aa det, FUR) , Institute for Operations Research ETH, grants DMS 0222452 and DMS 0100141 of the U.S. National Science Foundation and the American Institute of Mathematics. } \\ \\ %\small %Department of Mathematical Sciences, University of Aarhus %and\\ %\small %Institute for Operations Research, ETH Z\"urich } \maketitle \begin{abstract} \name is a software package for computing Gr\"obner fans and tropical varieties. These are polyhedral fans associated to polynomial ideals. The maximal cones of a Gr\"obner fan are in bijection with the marked reduced Gr\"obner bases of its defining ideal. The software computes all marked reduced Gr\"obner bases of an ideal. Their union is a universal Gr\"obner basis. The tropical variety of a polynomial ideal is a certain subcomplex of the Gr\"obner fan. \name contains algorithms for computing this complex for general ideals and specialized algorithms for tropical curves, tropical hypersurfaces and tropical varieties of prime ideals. In addition to the above core functions the package contains many tools which are useful in the study of Gr\"obner bases, initial ideals and tropical geometry. % Among these are an interactive traversal program % for Gr\"obner fans and programs for graphical renderings. The full list of commands can be found in Appendix~\ref{sec:applist}. For ordinary Gr\"obner basis computations \name is not competitive in speed compared to programs such as CoCoA, Singular and Macaulay2. %whose main function is to enumerate all % reduced Gr\"obner bases of a polynomial ideal. The reduced Gr\"obner bases yield the maximal cones in the Gr\"obner fan of the ideal. Several subcomputations can be issued and additional tools are included. Among these the highlights are:\\ %\noindent $\bullet$ commands for computing tropical varieties.\\ % \noindent $\bullet$ \texttt{\exename\_interactive} which allows % interactive walks in the Gr\"obner fan of an ideal,\\ % \noindent $\bullet$ commands for graphical renderings of Gr\"obner fans and monomial ideals.\\ % The full list of commands can be found in Section \ref{sec:applist}. % \name is a generalised version of the software \cite{cats} by the same author, but only little code is commen for the two projects. % CaTS began as a re-implementation of TiGERS, a software package to % compute state polytopes of toric ideals, written by Birkett Huber % based on algorithms in \cite{huber}. % Essential for most computations in \name are the field operations and the solving of linear programs. For this the libraries \texttt{gmp} and \cite{gmp} and \texttt{cdd} \cite{cdd} are used. In the link proces the libraries are configured to do exact arithmetics. It is not possible to compile \name without these libraries installed. \end{abstract} \tableofcontents \newpage \normalsize \section{Introduction} \name is a software package for computing \emph{Gr\"obner fans}~\cite{MoRo} and \emph{tropical varieties}~\cite{tropgrass} of polynomial ideals. It is an implementation of the algorithms appearing in \cite{fukuda} and \cite{ctv}. These two papers are joint work with Tristram Bogart, Komei Fukuda, David Speyer, Bernd Sturmfels and Rekha Thomas. A combined presentation can be found in~\cite{thesis}. For toric and lattice ideals, Gr\"obner fan programs already existed: TiGERS~\cite{huber} and CaTS~\cite{cats}. \name works on any ideal in $\Q[x_1,\dots,x_n]$. Gfan is based on Buchberger's algorithm~\cite{Buch} and the local basis change procedure~\cite{collart}. For traversal of Gr\"obner fans the simplex method, the reverse search technique \cite{avis} and symmetry exploiting algorithms are used. This allows enumeration of fans with millions of cones. For tropical computations these methods have been developed further. \name has been used for studying the structure of the Gr\"obner fan. Among the new results is an example of a Gr\"obner fan which is not the normal fan of a polyhedron \cite{jensen}. The software is intended to be run in a UNIX style environment. In particular, the software works on GNU/Linux and on Mac OS X (with some effort). Gfan uses the GNU multi-precision arithmetic library \cite{gmp} and cddlib \cite{cdd} for doing exact arithmetics and solving linear programming problems, respectively. A new feature of version 0.4 is the possibility to use the SoPlex \cite{wunderling} linear programming solver which does its computations in floating point arithmetics. \name verifies LP certificates in exact arithmetics and falls back on cddlib in case of a rounding error. The first section of this manual is a very short introduction to Gr\"obner fans and algorithms for computing them. The second section describes the installation procedure of the software and the third gives some examples of how to use it. Section \ref{sec:tropical} explains how Gfan can be used for computing tropical varieties, prevarieties and tropical bases. More details on the data formats and programs are given in Appendix \ref{sec:dataformats} and \ref{sec:applist}. {\bf Note for the reader:} As opposed to scientific journals the World Wide Web has the advantage that its contents can be changed after publication. If you have suggestions for improvements of this manual do not hesitate to let me know. Suggestions for the installation instructions are of particular interest since I only have access to / experience with a limited number of computer systems. \vspace{1cm} \noindent {\bf Acknowledgments:} The first version of this software was written in the fall 2003 during the authors visit to the Institute for Operations Research, ETH Z\"urich. Many features have been added since then. Rekha Thomas and Komei Fukuda have been involved in the development of the Gr\"obner fan algorithms, see the joint paper \cite{fukuda}. The tropical algorithms were developed in the joint paper \cite{ctv} with Tristram Bogart, David Speyer, Bernd Sturmfels and Rekha Thomas. The author is thankful to the following people and institutions for initially supporting the research: Komei Fukuda and Hans-Jakob L\"uthi (Institute for Operations Research, ETH Z\"urich), Douglas Lind and Rekha Thomas (University of Washington, Seattle) and the American Institute of Mathematics. The research has later been supported by University of Aarhus, University of Minnesota, TU-Berlin, the German Research Foundation (DFG) through the institutional strategy of Georg-August-Universit\"at G\"ottingen and The Danish Council for Independent Research. The author would also like to thank his former advisor Niels Lauritzen for encouraging the study in the area and the many people who have been testing, been using and helped improving the software. Other contributors to the Gfan source code include: \begin{itemize} \item Bjarne Knudsen (abstract parallel graph traverser used for mixed volume computation and tropical prevarieties) \item Anton Leykin \item Yue Ren \item Josephine Yu \end{itemize} \subsection{The Gr\"obner fan of an ideal} The Gr\"obner fan of an ideal $I\subseteq k[x_1,\dots,x_n]$ in a polynomial ring over a field $k$ is a polyhedral complex consisting of cones in $\R^n$. We provide a short definition and refer the reader to the papers mentioned above for details. \begin{definition} Let $\omega\in\R^n$ and $a\in\N^n$. We define $x^a:=x_1^{a_1}\cdots x_n^{a_n}$. The \emph{$\omega$-weight} of $\alpha x^a$ with $\alpha\in k\setminus\{0\}$ is $\omega\cdot a$. For $f\in k[x_1,\dots,x_n]$ we define its \emph{initial form} $\init_\omega(f)$ to be the sum of all terms in $f$ with maximal $\omega$-weight. For an ideal $I\subseteq k[x_1,\dots,x_n]$ we define the \emph{initial ideal} to be $\init_\omega(I):=\langle \init_\omega(f):f\in I\rangle$. \end{definition} Notice that initial ideals might not be monomial ideals. If for some $\omega\in\R_{>0}^n$ we have $\init_\omega(I)=I$ then we say that $I$ is \emph{homogeneous} in the $\omega$-grading. We now fix the ideal $I\subseteq k[x_1,\dots,x_n]$ and consider the equivalence relation: $$u\sim v \Leftrightarrow \init_u(I)=\init_v(I)$$ on vectors $u,v\in \R^n$. If $I$ is homogeneous then any equivalence class contains a positive vector. Any equivalence class containing a positive vector is convex. Moreover, its closure is a polyhedral cone. We use the notation $$C_\omega(I):=\overline{\{u\in\R^n:\init_u(I)=\init_\omega(I)\}}$$ to denote the closure of the equivalence class containing $\omega$. \begin{definition}\cite[Definition~2.8]{fukuda} \label{def:gfan} Let $I\subseteq k[x_1,\dots,x_n]$ be an ideal. The \emph{Gr\"obner fan} of $I$ is the collection of cones $C_\omega(I)$ where $\omega\in\R_{>0}^n$ together with all their non-empty faces. \end{definition} Any cone in the Gr\"obner fan is called a \emph{Gr\"obner cone}. The relative interior of any Gr\"obner cone is an equivalence class. The equivalence class containing $0$ is a subspace of $\R^n$ called the \emph{homogeneity space} of $I$. The Gr\"obner fan is a polyhedral fan; see \cite{sturmfels} or \cite{fukuda}. The \emph{support} of the Gr\"obner fan i.e. the union of its cones is called the \emph{Gr\"obner region} of $I$. If $I$ is homogeneous then the Gr\"obner region is $\R^n$ and, moreover, the Gr\"obner fan is the normal fan of the \emph{state polytope} of $I$; see \cite{sturmfels} for a construction of this polytope. The \emph{lineality space} of a polyhedral cone is defined as the largest subspace contained in the cone. The common lineality space of all cones in the Gr\"obner fan equals the homogeneity space of $I$. \begin{remark} Definition~\ref{def:gfan} was chosen since it gives the nicest Gr\"obner cones. In general our Gr\"obner fan does not coincide with the ``restricted'' Gr\"obner fan nor the ``extended'' Gr\"obner fan defined in \cite{MoRo}. The common refinement (i.e. ``intersection'') of $\R_{\geq 0}^n$ and our Gr\"obner fan is the restricted Gr\"obner fan. For homogeneous ideals our definition coincides with \cite[page~13]{sturmfels} (which only contains a definition for homogeneous ideals). \end{remark} \subsection{Gr\"obner bases} Given a \emph{term order} $\prec$ the \emph{initial term} $\init_\prec(f)$ of a polynomial $f$ is defined and, analogously to the $\omega$-initial ideal above, so is the \emph{initial ideal} $\init_\prec(I)$ of an ideal $I$. We remind the reader that given generators for and ideal $I\subseteq k[x_1,\dots,x_n]$ and a term order $\prec$ Buchberger's Algorithm produces a \emph{reduced} Gr\"obner basis $\G_\prec(I)$. This basis is unique. It is useful to introduce the notion of a \emph{marked} polynomial and a \emph{marked} reduced Gr\"obner basis. A polynomial is marked if one of its terms has been distinguished. When writing such a polynomial we may either underline the distinguished term or we may by convention write the distinguished term as the first one listed. Gfan uses this second convention. A Gr\"obner basis $\G_\prec(I)$ is marked if the initial term $\init_\prec(f)$ of every polynomial $f\in\G_\prec(I)$ has been marked i.e. distinguished. \begin{example} The polynomial ideal $I=\langle x+y\rangle\subseteq \Q[x,y]$ has two marked reduced Gr\"obner bases: $\{\underline{x}+y\}$ and $\{x+\underline{y}\}$. Gfan would write these Gr\"obner bases as $\{x+y\}$ and $\{y+x\}$. \end{example} By definition of Gr\"obner bases the initial ideal $\init_\prec(I)$ is easily read off from the marked (reduced) Gr\"obner basis $\G_\prec(I)$, namely, it is generated by the marked terms. In fact, for $I\subseteq k[x_1,\dots,x_n]$ fixed the follow three finite sets are in bijection: \begin{itemize} \item The set of marked reduced Gr\"obner bases for $I$. \item The set of monomial initial ideals $\init_\prec(I)$ with respect to term orders. \item The set of $n$-dimensional Gr\"obner cones in the Gr\"obner fan of $I$. \end{itemize} The map from the first set to the second set has already been described. A monomial ideal $\init_\prec(I)$ in the second set is mapped to $\overline{\{v\in\R^n:\init_v(I)=\init_\prec(I)\}}$ in the third set. Going from the first set to the third is easy, namely the inequalities can be read off from the exponents of the marked reduced Gr\"obner basis. % The monomial initial ideals (with respect to term %orders) of $I$ are in bijection with the marked reduced Gr\"obner %bases of $I$ and with the full dimensional cones in the Gr\"obner fan %of $I$. By a %\emph{marked Gr\"obner basis} we mean a set of polynomials which is a %Gr\"obner basis with respect to some term order with the initial term %of each polynomial, with respect to the term order, being %distinguished. We write the distinguished term as the first in the %list of terms when writing a polynomial. Knowing a marked reduced %Gr\"obner basis, its initial ideal and equations defining its %Gr\"obner cone are easily read off. Thus a useful way to represent the Gr\"obner fan of an ideal is by the set of its marked reduced Gr\"obner bases. %The original definition of the Gr\"obner fan was given in %\cite{MoRo}. Another reference is \cite{sturmfels}. %We need to be precise about which cones are computed. A full dimensional Gr\"obner cones of $I$ is a set of the form %$$C_\prec(I):=\overline{\{\omega\in\R^n:in_\omega(I)=in_\prec(I)\} }$$ %where $\prec$ is a term order. The output of a Gr\"obner fan computation is the list of these full-dimensional cones as $\prec$ varies over all term orders. Each cone is represented by the reduced Gr\"obner basis of $I$ with respect to $\prec$. The reduced Gr\"obner basis is denoted by $\G_\prec(I)$. %If $I$ is a homogeneous ideal the full-dimensional Gr\"obner cones cover $\R^n$. If $I$ is not homogeneous this might not be the case. In any case the full-dimensional Gr\"obner cones cover $\R^n_{\geq 0}$. \subsection{Algorithmic background} We briefly describe the algorithms implemented in \name for computing Gr\"obner fans. The algorithms are divided into two parts, the local algorithms and the global algorithms. For more details we refer to \cite{fukuda} and \cite{symmetricfans}. \subsubsection{Local computations} There are two local computations that need to be done: \begin{itemize} \item Given a full-dimensional Gr\"obner cone by its reduced Gr\"obner basis, we need to find its facets. To be precise we need to find a normal for each facet. \item Given a full-dimensional Gr\"obner cone represented by its reduced Gr\"obner basis and a normal for one of its facets we need to compute the other full-dimensional cone having this facet as a facet (if one exists). Again, the computed cone should be represented by a reduced Gr\"obner basis. \end{itemize} To do the first computation we need the following theorem telling us how to read of the cone inequalities from the reduced Gr\"obner basis: \begin{theorem} Let $\G_\prec(I)$ be a reduced Gr\"obner basis. For any vector $u\in\R^n$ $$\init_u(I)=\init_\prec(I) \Leftrightarrow \forall g\in\G_\prec(I):\init_u(g)=\init_\prec(g)$$ \end{theorem} Each $g$ introduces a set of strict linear inequalities on $u$. By making these inequalities non-strict we get a description of the closed Gr\"obner cone of $\G_\prec(I)$. This gives us a list of possible facet normals of the cone. Linear programming techniques are now applied to find the true set of normals among these. Suppose we know a reduced Gr\"obner basis $\G_\prec(I)$ and a normal of one of its facets. If $\omega$ is a vector in the relative interior of the facet we can compute a Gr\"obner basis of $\init_\omega(I)$ with respect to $\prec$ by picking out a certain subset of the terms in $\G_\prec(I)$, see \cite[Corollary 1.9]{sturmfels}. The initial ideal $\init_\omega(I)$ has at most two reduced Gr\"obner bases since it is homogeneous with respect to any grading given by vectors in the $n-1$ dimensional subspace spanned by the facet. The other Gr\"obner basis of $\init_\omega(I)$ can be computed using a term order represented by the outer normal of the facet. A lifting step will take the Gr\"obner basis for $\init_\omega(I)$ to a Gr\"obner basis for $I$ representing the neighbouring cone. See \cite[Subroutine 3.7]{sturmfels}. The method described above is the local change procedure due to \cite{collart}. The procedure simplifies in our case since: \begin{itemize} \item We only walk through facets. Thus, the ideal $\init_\omega(I)$ has at most two reduced Gr\"obner bases. \item We know the facet normal. Thus, there is no reason for computing $\omega$. \end{itemize} \subsubsection{Global computations} \label{subsec:global computations} We define the graph $G$ whose set of vertices consists of all reduced Gr\"obner bases of $I$ with two bases being connected if their cones share a common facet containing a strictly positive vector. With the two subroutines in the previous section it is easy to do a traditional vertex enumeration of $G$ starting from some reduced Gr\"obner basis. However, for such algorithm to work it would need to store the boundary of the already enumerated vertices to guarantee that we do not enumerate the same vertex more than ones. For a planar graph this might not seem too bad but as the dimension grows the boundary can contain a huge number of elements. Storing these elements would require a lot of memory and sometimes more memory than the size of the computers RAM which would cause the computation to slow down. A better way to do the enumeration is by the reverse search strategy \cite{avis}. If there is an easy rule for orienting the edges of a graph so that it has a unique sink and no cycles it is also easy to find a spanning tree for the graph. The reverse search will traverse this spanning tree. The method works well for enumerating vertices of polytopes since an orientation of the edges with respect to a generic vector will have a unique sink and no cycles. A proof in \cite{fukuda} shows that a similar orientation orienting $G$ with respect to a term order will also give an acyclic orientation with a unique sink and thus allow enumeration by reverse search. Reverse search is the default enumeration method in \name. If the ideal is symmetric we may want to do the Gr\"obner basis enumeration up to symmetry. For example the ideal $I=\langle a-b\rangle\subseteq k[a,b]$ is invariant under the exchange of $a$ and $b$. The ideal has two marked Gr\"obner bases $\{\underline{a}-b\}$ and $\{\underline{b}-a\}$, each defining a full dimensional Gr\"obner cone in $\R^2$. Up to symmetry they are equal. We only want to compute one of them. In general $I\subseteq k[x_1,\dots,x_n]$ is invariant under all permutations of some subgroup ${\bf G}\subseteq S_n$. Applying a permutation in ${\bf G}$ to a marked reduced Gr\"obner basis of $I$ we get another marked reduced Gr\"obner basis of $I$. Hence, ${\bf G}$ acts on the set of marked reduced Gr\"obner bases of $I$. We wish to compute only one representative for each orbit. We apply techniques similar to the ones used in \cite{rambau} for computing regular triangulations of point configurations up to symmetry. Often the number of orbits is much smaller than the number of reduced Gr\"obner bases and we save a lot of time by not computing them all. \input{installation} \input{using} \input{tropical} \newpage \appendix \input{dataformats} \newpage \section{Application list} \label{sec:applist} This section contains the full list of programs in Gfan. For each program its help file is listed. The help file of a program can also be displayed by specifying the \texttt{--help} option when running the program. Besides the options listed in this section all programs have options {\bf -\hspace{0.013cm}-log1}, {\bf -\hspace{0.013cm}-log2},... which tell Gfan how much information to write to ``standard error'' while a computation is running. {\bf These options are VERY USEFUL when you wish to know if Gfan is making any progress in its computation.} Additional options which can be used for all programs, but which are not listed in the following subsections are: \begin{description} \item{\bf -\hspace{0.013cm}-stdin value} Specify a file to use as input instead of reading from the standard input. \item{\bf -\hspace{0.013cm}-stdout value} Specify a file to write output to instead of writing to the standard output. \item{\bf -\hspace{0.013cm}-xml} To let polyhedral fans be output in an XML format instead of in the text format. (The XML files are not readable by Gfan.) \end{description} \input{apptable.tex} \newpage \bibliographystyle {hplain} \bibliography{jensen.bib} \end{document} gfan0.8beta/doc/tropical.tex0000664000175000017500000007473015177170257015522 0ustar andersanders\newpage \section{Doing tropical computations} \label{sec:tropical} \emph{This section follows the max convention for tropical arithmetic. For the non-constant coefficient case tropical varieties are defined as in \cite{lifting} and \cite{thesis}.} \vspace{0.5cm} In this section we explain how to use Gfan to do tropical computations. For a fixed ideal $I\subseteq k[x_1,\dots,x_n]$ the set of all faces of all full-dimensional Gr\"obner cones is a polyhedral complex which we call the Gr\"obner fan of $I$. For tropical computations the lower dimensional cones of the complex will be of our interest. In general every Gr\"obner cone is of the form: $$C_\omega(I):=\overline{\{\omega'\in\R^n:\init_{\omega'}(I)=\init_\omega(I)\} }.$$ We define the tropical variety $\T(I)$ of an ideal $I$ to be the the set of all $\omega$ such that $\init_\omega(I)$ does not contain a monomial. If the ideal $I$ is homogeneous with respect to a positive grading, then the Gr\"obner cones cover all of $\R^n$ and $\T(I)$ is a union of Gr\"obner cones. Thus for a homogeneous ideal the tropical variety gets the structure of a polyhedral fan which it inherits from the Gr\"obner fan. %collection of all Gr\"obner cones with monomial-free initial %ideals. We therefore also define the tropical variety $\T(I)$ to be the collection of all Gr\"obner cones $C_\omega(I)$ such that $\init_\omega(I)$ is monomial-free. We start by noticing that for computational purposes it is no restriction to only consider the case of a homogeneous ideal: \begin{lemma}\cite[Lemma~6.2.5]{thesis} \label{lem:tropical by homogenisation} Let $I\subseteq k[x_1,\dots,x_n]$ be an ideal generated by $f_1,\dots,f_m\in k[x_1,\dots,x_n]$. Let $J=\langle f_1^h,\dots,f_m^h\rangle\subseteq k[x_0,\dots,x_n]$. Then $\init_\omega(I)$ is monomial-free if and only if $\init_{(0,\omega)}(J)$ is monomial-free where $\omega\in\R^n$. In particular we have the following identity of sets in $\R^{n+1}$: $$\{0\}\times\T(I)=\T(J)\cap(\{0\}\times\R^n).$$ \end{lemma} Here $f^h$ denotes the homogenization of the polynomial $f$. The homogenization of a list of polynomials can be computed by the program \texttt{gfan\_homogenize}. Notice that the lemma only requires the generators to be homogenized as a set of polynomials and not in the sense of a polynomial ideal. The tropical algorithms implemented in Gfan are explained in \cite{ctv}. % The reference also %contains definitions and theorems needed for understanding this %section of the manual. Notice that Gfan follows the usual conventions for signs of weight vectors defining initial forms while \cite{ctv} uses opposite signs. This means that \name is compatible with the max-plus convention whereas \cite{ctv} is compatible with the min-plus convention. \subsection{Tropical variety by brute force} The command \texttt{gfan\_tropicalbruteforce} will compute all Gr\"obner cones of a homogeneous ideal and for each check if its initial ideal contains a monomial. The output is the tropical variety of the ideal. Since the tropical variety is usually much smaller than the Gr\"obner fan this is a rather slow method for computing the tropical variety. The line \begin{verbatim} gfan_buchberger | gfan_tropicalbruteforce \end{verbatim} run on the input \begin{verbatim} Q[a,b,c,d,e,f,g,h,i,j] { bf-ah-ce, bg-ai-de, cg-aj-df, ci-bj-dh, fi-ej-gh } \end{verbatim} produces a tropical variety of the input ideal in a few minutes as a polyhedral fan, see Section~\ref{format:fan}. We use \texttt{gfan\_buchberger} since \texttt{gfan\_tropicalbruteforce} requires its input to be a marked reduced Gr\"obner basis. \begin{remark} Notice that if $k'\supseteq k$ is a field extension and $I\subseteq k[x_1,\dots,x_n]$ an ideal then $\T(I)=\T(\langle I\rangle_{k'[x_1,\dots,x_n]})$ as a polyhedral fan. This identity follows since both objects can be computed by Gr\"obner basis methods and Gr\"obner bases are independent of such field extensions. The same argument of course also applies to the Gr\"obner fans of the two ideals. \end{remark} \subsection{Traversing tropical varieties of prime ideals} Let $I\subseteq \CC[x_1,\dots,x_n]$ be a homogeneous monomial-free prime ideal of dimension $d$. By the Bieri Groves Theorem \cite{bg} the tropical variety of $I$ is a pure $d$-dimensional polyhedral fan. It is connected in codimension one (\cite[Theorem~14]{ctv}) and can be traversed by Gfan. Let $\omega$ be a relative interior point of a $d$-dimensional Gr\"obner cone in the tropical variety of $I$. Fix some term order $\prec$. Gfan represents $C_\omega(I)$ by the pair of marked reduced Gr\"obner bases $(\G_{\prec_\omega}(\init_\omega(I)),\G_{\prec_\omega}(I))$. To compute the tropical variety of an ideal we must begin by finding a starting $d$-dimensional Gr\"obner cone. For this \texttt{gfan\_tropicalstartingcone} is used. % This programs guesses a %starting cone by heuristic methods. The guessing might fail. In that %case the program will terminate with an error message. After having computed a starting cone we use the program \texttt{gfan\_tropicaltraverse} to traverse the tropical variety. %There are several options for the output. In general the choice of output we request can have a huge influence on the running time for the program. We illustrate the procedure with an example. \begin{remark} Gfan does its computations over $\Q$ and thus the input should be an ideal generated by polynomials in $\Q[x_1,\dots,x_n]$. The assumption that $I$ is an ideal in $\CC[x_1,\dots,x_n]$ is needed since by ``prime ideal'' in the above we mean ``prime ideal in the polynomial ring over the algebraically closed field $\CC$''. If $I$ is a prime ideal in $\Q[x_1,\dots,x_n]$ we do not know that its tropical variety is connected. In Section~\ref{sec:non-constant} we address the problem of specifying non-rational coefficients. \end{remark} \begin{example} Let $I\subseteq\Q[a,\dots,o]$ be the ideal generated by the relations on the 2 by 2 minors of a 2 by 6 generic matrix. In $\CC[x_1,\dots,x_n]$ the ideal $I$ generates a prime ideal. To get a starting cone for the traversal of $\T(I)$ we run the command \begin{verbatim} gfan_tropicalstartingcone \end{verbatim} on the input \begin{verbatim} Q[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o] { bg-aj-cf, bh-ak-df, bi-al-ef, ck-bm-dj, ch-am-dg, cl-ej-bn, ci-eg-an, dn-co-em, dl-bo-ek, di-ao-eh, gk-fm-jh, gl-fn-ij, hl-fo-ik, kn-jo-lm, hn-im-go } \end{verbatim} and get a pair of marked reduced Gr\"obner bases \begin{verbatim} Q[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o] { l*m+j*o, i*m+g*o, i*k-h*l, i*j-g*l, h*j-g*k, e*m+c*o, e*k+b*o, e*j-c*l, e*h+a*o, e*g-c*i, c*k-b*m, c*h-a*m, b*i-a*l, b*h-a*k, b*g-a*j} { l*m-k*n+j*o, i*m-h*n+g*o, i*k-h*l+f*o, i*j-g*l+f*n, h*j-g*k+f*m, e*m-d*n+c*o, e*k-d*l+b*o, e*j-c*l+b*n, e*h-d*i+a*o, e*g-c*i+a*n, c*k-d*j-b*m, c*h-d*g-a*m, b*i-e*f-a*l, b*h-d*f-a*k, b*g-c*f-a*j} \end{verbatim} This takes about a second. We store the output in the file \texttt{grassmann2\_6.cone} for later use. Since $I$ has many symmetries we add the following lines describing the symmetry group to the end of the file: \begin{verbatim} { (0,8,7,6,5,4,3,2,1,14,13,11,12,10,9), (5,6,7,8,0,9,10,11,1,12,13,2,14,3,4) } \end{verbatim} We are ready to traverse $\T(I)$. % We start by running the program with the simplest possible output and using symmetries: We run the following command \begin{verbatim} gfan_tropicaltraverse --symmetry tmpfile1.poly Q[x_1,x_2,x_3] {x_2x_3+x_1x_3+x_1x_2+x_1x_2x_3} \end{verbatim} The weights/multiplicities are stored in the MULTIPLICITIES section of the Polymake file. It is harder specifying the rational function. We make the following file and call in \texttt{func.poly}. \begin{footnotesize} \begin{verbatim} _application PolyhedralFan _version 2.2 _type PolyhedralFan AMBIENT_DIM 3 DIM 2 LINEALITY_DIM 0 RAYS 1 0 0 # 0 0 1 0 # 1 0 0 1 # 2 -1 -1 -1 # 3 1 1 0 # 4 -1 -1 0 # 5 N_RAYS 6 LINEALITY_SPACE ORTH_LINEALITY_SPACE 1 0 0 0 1 0 0 0 1 MAXIMAL_CONES {3 5} # Dimension 2 {5 2} {0 2} {1 2} {1 3} {0 3} {1 4} {0 4} MULTIPLICITIES 1 1 1 1 1 1 1 1 RAY_VALUES 0 0 0 1 -1 0 LINEALITY_VALUES \end{verbatim} \end{footnotesize} Instead of specifying the linear function on each maximal cone we have to specify its values on each of the rays in the fan and each of the generators of the lineality space. Then Gfan will automatically interpolate the function. Since the lineality space of the fan is empty we leave the LINEALITY\_VALUES section empty. We now compute the Weil divisor: \begin{footnotesize} \begin{verbatim} gfan_tropicalweildivisor -i1 tmpfile1.poly -i2 func.poly >tmpfile2.poly \end{verbatim} \end{footnotesize} ...and compute the Weil divisor again as in \cite{allermannRau}... \begin{footnotesize} \begin{verbatim} gfan_tropicalweildivisor -i1 tmpfile2.poly -i2 func.poly >tmpfile3.poly \end{verbatim} \end{footnotesize} We get a fan with the origin being the only cone. It has multiplicity $-1$: \begin{verbatim} MULTIPLICITIES -1 # Dimension 0 \end{verbatim} There is another useful command for computing polyhedral fans for rational functions. The command \texttt{gfan\_tropicalfunction} takes a polynomial and turns it into a fan representing its tropicalization which is a tropical rational function. \subsection{Non-constant coefficients (partially deprecated)} \label{sec:non-constant} {\bf The easiest way to compute tropical prevarieties is by using the command {\texttt gfan\_tropicalprevariety} introduced in gfan0.7. See Section~\ref{subsec:tropicalprevariety}. The current section is kept for compatibility reasons.} In tropical geometry it is common to take the valuation of $\CC\{\{t\}\}$ into account when defining the tropical variety of an ideal in $\CC\{\{t\}\}[x_1,\dots,x_n]$. Here $\CC\{\{t\}\}$ denotes the field of Puiseux series. The valuation $\textup{val}(p)$ of a non-zero Puiseux series $p$ is the degree of its lowest order term. \begin{definition} \label{def:tomegadegree} For $\omega\in\R^n$ the \emph{t-$\omega$-degree}\index{t-$\omega$-degree} of a term $ct^ax^v$ with $c\in\CC^*$, $a\in \Q$ and $v\in\Z^n$ is defined as $-\val(ct^a)+\omega\cdot v=-a+\omega\cdot v$. The \emph{t-initial form}\index{t-initial form} $\tinit_\omega(f)\in\CC[x_1,\dots,x_n]$ of a polynomial $f\in\puiseux[x_1,\dots,x_n]$ is the sum of all terms in $f$ of maximal t-$\omega$-weight but with $1$ substituted for $t$. \end{definition} \begin{remark} Notice that since $t$ has t-$\omega$-degree $-1$, the maximal t-$\omega$-weight \emph{is} attained by a term if the polynomial is non-zero. Furthermore, only a finite number of terms attain the maximum. Therefore, it makes sense to substitute $t=1$ and consider the finite sum of terms as a polynomial in $\CC[x_1,\dots,x_n]$. \end{remark} \begin{example} Consider $f=(1+t)+t^2x+tx^2\in\puiseux[x_1,\dots,x_n]$. Let $\omega=({1\over 2})\in\R^1$. Then $\tinit_\omega(f)=1+x^2$. For any other choice of $\omega$ the t-initial form is a monomial. \end{example} \begin{definition} Let $I\subseteq \puiseux[x_1,\dots,x_n]$ and $\omega\in\R^n$. The \emph{t-initial ideal}\index{t-initial ideal} of $I$ with respect to $\omega$ is defined as: $$\tinit_\omega(I):=\langle \tinit_\omega(f):f\in I\rangle\subseteq\CC[x_1,\dots,x_n].$$ \end{definition} \begin{definition} \label{def:tropvar} Let $I\subseteq \puiseux[x_1,\dots,x_n]$ be an ideal. The \emph{tropical variety} of $I$ is the set $$\T'(I):=\{\omega\in\R^n:\tinit_\omega(I) \textup{ is monomial-free}\}.$$ %Here monomial-free\index{monomial-free} means that the ideal does not contain a monomial. \end{definition} We use the notation $\T'(I)$ to avoid contradicting our original definition of the tropical variety of an ideal in the polynomial ring over a field. %An important theorem says that the tropical variety of $I$ is also the %negative of the closure of the image of $V(I)\subseteq \CC\{\{t\}\}^*$ %under the coordinatewise valuation. \begin{proposition} \cite[Proposition~7.3]{lifting} \label{prop:computing tinit} Let $I\subseteq \CC[t,x_1,\dots,x_n]$ be an ideal, $J=\langle I\rangle_{\puiseux[x_1,\dots,x_n]}$ and $\omega\in\R^n$. Then $\textup{t-in}_\omega(I)=\textup{t-in}_\omega(J)$. \end{proposition} \begin{remark} \label{rem:computing tinit} For $f\in\CC[t,x_1,\dots,x_n]$ we have $\tinit_\omega(f)=(\init_{(-1,\omega)}(f))|_{t=1}$. Consequently, for $I\subseteq\CC[t,x_1,\dots,x_n]$ we have $\tinit_\omega(I)=(\init_{(-1,\omega)}(I))|_{t=1}$. In order to decide if $\tinit_\omega(I)$ contains a monomial we may simply decide if the initial ideal $\init_{(-1,\omega)}(I)$ contains a monomial. As a corollary we get $$\T(I)\cap(\{-1\}\times\R^n)=\{-1\}\times\T'(J).$$ In fact this gives a method for computing the tropical variety as a set of any ideal $J\subseteq\CC\{\{t\}\}[x_1,\dots,x_n]$ generated by elements in the polynomial ring over the field of rational functions $\Q(t)[x_1,\dots,x_n]$ in Gfan by clearing denominators and intersecting the result with the $t=-1$ plane. (We remind the reader that Lemma~\ref{lem:tropical by homogenisation} shows that for computational purposes it is no restriction if $I$ is not homogeneous.) \end{remark} Intersecting the tropical variety with the $t=-1$ plane can with some difficulty be done by hand. If the tropical (pre)-variety has been computed with \texttt{gfan\_tropicalintersection} then it is also possible to let Gfan do the intersection. What Gfan does is to compute the common refinement of the fan with the fan consisting of the halfspace $t\leq 0$ and its proper face. Of course this does not remove the cones in the $t=0$ plane, but they are easily removed by hand. We illustrate the procedure by an example. \begin{example} \label{ex:nonconstant} Exercise 2 in Chapter 9 of \cite{sturmfelssolving} asks us to draw the variety defined by the \emph{tropical} polynomial $f=1x^2+2xy+1y^2+3x+3y+1$. If we tropically divide this polynomial by $3$ we get $f':=f/3=-2x^2-1xy-2y^2+0x+0y+-2$ which defines the same tropical variety. This variety equals the variety defined by the polynomial $g=t^2x^2+txy+t^2y^2+x+y+t^2\in\CC\{\{t\}\}[x,y]$. Notice that $f'$ is the tropicalisation of $g$. According to Remark~\ref{rem:computing tinit} above the we may compute $\T'(\langle g\rangle)$ by computing the variety of $\langle t^2x^2+txy+t^2y^2+x+y+t^2\rangle\subseteq \CC[t,x,y]$ and intersecting it with the hyperplane $t=-1$. Running \begin{verbatim} gfan_tropicalintersection --tplane \end{verbatim} on \begin{verbatim} Q[t,x,y] {t^2x^2+txy+t^2y^2+x+y+t^2} \end{verbatim} we get \begin{verbatim} RAYS 0 -1 0 # 0 -1 2 1 # 1 0 1 1 # 2 -1 1 1 # 3 -1 -2 -2 # 4 0 0 -1 # 5 -1 1 2 # 6 MAXIMAL_CONES {3 4} # Dimension 2 {2 6} {1 3} {1 2} {3 6} {4 5} {0 4} {0 6} {1 5} \end{verbatim} among other information. We can now draw the two-dimensional picture asked for in the exercise. The rays with non-zero first coordinate become points in the picture. (If the first coordinate is not $-1$ scaling is required to get the rational $x,y$-coordinates.) The rays with zero first coordinate become directions. The maximal cones show how to connect the rays; see Figure~\ref{fig:nonconstant}. Notice that some of the connections could have been ``at infinity''. \begin{figure} \begin{center} \epsfig{file=nonconst.eps,height=5.5cm} \end{center} \caption{The tropical variety defined by the tropical polynomial in Example~\ref{ex:nonconstant}.} \label{fig:nonconstant} \end{figure} \end{example} \subsubsection{Algebraic field extensions of $\Q$} Ignoring time, memory usage and overflows Gfan can compute the tropical variety $\T'(I)$ of any ideal $I\subseteq \puiseux[x_1,\dots,x_n]$ generated by elements of $\overline{\Q}(t)[x_1,\dots,x_n]$. This is a consequence of the following lemma: \begin{lemma}\cite[Lemma~3.12]{lifting} \label{lem:fieldextension} Let $k$ be a field and $M=\langle m\rangle\subseteq k[a]$ a maximal ideal where $m$ is not a monomial. Let $I\subseteq (k[a]/M)[x_1,\dots,x_n]$ be an ideal. For $\omega\in\R^n$ we have $$\init_\omega(I) \textup{ contains a monomial} \Longleftrightarrow \init_{(0,\omega)}(\varphi^{-1}(I)) \textup{ contains a monomial}$$ where $\varphi:k[a,x_1,\dots,x_n]\rightarrow (k[a]/M)[x_1,\dots,x_n]$ is the homomorphism taking elements to their cosets. \end{lemma} \subsection{Tropical prevarieties} \label{subsec:tropicalprevariety} As explained earlier, a tropical prevariety is defined to be an intersection of finitely many tropical hypersurfaces. Such intersection can be computed by either the old command {gfan\_tropicalintersection} or the new command {gfan\_tropicalprevariety} introduced in \name version 0.7. There are several choices to be made when defining the tropical prevariety of a list of polynomials in $\puiseux[x_1,\dots,x_n]$, for example whether $t$ should have valuation $+1$ or $-1$, whether the value group should be ordered in the positive or negativ direction (and whether gfan should ``cone over'' the complex at $x_0=-1$ or $x_0=1$ to get the fan-like output). However, the most sensible choices are just to have the equation $$T(I)\cap\Q^n=\textup{val}(V(I))$$ satisfied, where $\textup{val}$ is cooridinate-wise valuation. This leaves the choice of thinking of $\puiseux$ as having increasing exponents in $t$ (min) or decreasing exponents in $t$ (max) and taking valuation to be $t$-exponent of the leading term of a series. In addition to these choices, part of the literature mixes max and min conventions to have increasing Puiseux series while following conventions of the (global) Gr\"obner fan theory (using \emph{outer} normals). This is consistent with Definition~\ref{def:tomegadegree}. For these choices the following equation holds: $$T(I)\cap\Q^n=-\textup{val}(V(I)).$$ In the following we illustrate these choices on some examples. Note that the \name parser only understands ordinary polynomials at the moment. So although we can specify the coefficient field to be rational functions in $t$, only polynomial of $\CC(t)[x_1,\dots,x_n]\subset\puiseux[x_1,\dots,x_n]$ that are actually in $\CC[t,x_1,\dots,x_n]$ can be parsed at the moment, leading to some inconvenience. Moreover, specifying for example $p$-adic valuations for ideals in $\Q[x_1,\dots,x_n]$ is not possible at the moment. The command {gfan\_tropicalprevariety} has two options to set max/min conventions: \begin{verbatim} --mint --minx \end{verbatim} \begin{example}[Default: Max, max] The Puiseux series are decreasing in $t$-exponent and $T(I)\cap\Q^n=\textup{val}(V(I))$ is satisfied. This convention is compatible with most of \name, but seems to not be used much in the literature. One place it is used is in the introduction of~\cite{ctv}. In the following note that it would not be possible for \name to parse \texttt{(t4+1)x} while \texttt{t4x+1x} can be parsed. \begin{verbatim} gfan _tropicalprevariety --usevaluation Q(t)[x]{t+t4x+1x+tx3} \end{verbatim} gives as part of the output \begin{verbatim} RAYS 1 -3 # 0 2 3 # 1 \end{verbatim} The tropical prevariety is $\{-3,{3\over 2}\}$. %Here the convention is that Puiseux series are increasing in $t$-exponent. %For example taking $(i+higher order terms,0+higher order terms)$ makes equations vanish in $t$-degree 1, when substituting in. \end{example} \begin{example}[Max convention, increasing t-exponents] We now change to the definition that is compatible both with the Gr\"obner basis convention (outer normals) and increasing t-exponents. This convention was used in~\cite{sturmfelssolving}, \cite{lifting} and~\cite{thesis} and satisfies $T(I)\cap\Q^n=-\textup{val}(V(I))$. \begin{verbatim} gfan _tropicalprevariety --usevaluation --mint Q(t)[x]{t+t4x+1x+tx3} \end{verbatim} gives as part of the output \begin{verbatim} RAYS 1 -1 # 0 2 1 # 1 \end{verbatim} %Here the convention is that Puiseux series are increasing in $t$-exponent. %The rays appear in different order. Notice also the change of sign in the $t$-coordinate. The tropical prevariety is $\{-1,{1\over 2}\}$. \end{example} \begin{example}[Min convention, increasing t-exponents] Our final example illustrates the most common convention, since this is the one used in the tropical book by Maclagan and Sturmfels~\cite{tropicalbook}. It was also used in~\cite{tropgrass}. The convention has the advantage that Puiseux series are increasing in $t$ and the equation $T(I)\cap\Q^n=\textup{val}(V(I))$ is satisfied. \begin{verbatim} gfan _tropicalprevariety --usevaluation --mint --minx Q(t)[x]{t+t4x+1x+tx3} \end{verbatim} gives as part of the output \begin{verbatim} RAYS 1 1 # 0 2 -1 # 1 \end{verbatim} The tropical prevariety is $\{1,-{1\over 2}\}$. \end{example} More interesting examples are obtained by introducing more variables and polynomials, but here we only wished to demonstrate various conventions. To speed up computation the arithmetic can be changed to machine-integer using for example option \texttt{--bits64}. Note that in that case overflow checking is not completely implemented. If \texttt{--usevaluation} is not specified, then the output lives in a space of dimension one lower. If a coefficient field without a default valuation is specified in the input, then the trivial valuation is used. gfan0.8beta/doc/using.tex0000664000175000017500000003522515177170257015026 0ustar andersanders\newpage \section{Using the software} In this section we will explain by examples how to use the software for the most common computations. \name consist of a set of subprograms with names like \texttt{gfan\_bases} and \texttt{gfan\_buchberger} each with a different purpose. See Appendix \ref{sec:dataformats} for an explanation of the data formats and Appendix~\ref{sec:applist} for a full list of the various functions and their help files. %\emph{In the %following we will assume that the software has been installed with %\texttt{make install} and that all subprograms have been installed %with \texttt{gfan installlinks} - see Section \ref{sec:installation}}. \subsection{Computing the Gr\"obner fan} The program \texttt{gfan\_bases} computes the set of reduced Gr\"obner bases of an ideal. To use it type in the name in the UNIX shell \footnote{It is actually much more convenient to use the Emacs shell. In Emacs press Meta-x and type \textup{shell}. When you are in the Emacs shell Ctrl-up will allow you to easily reinput old polynomial data to \name.} \begin{verbatim} gfan_bases \end{verbatim} and type in a polynomial ring followed by a set of generators for the ideal \begin{verbatim} Q[a,b,c] {aab-c,bbc-a,cca-b} \end{verbatim} For compatibility reasons the polynomial ring can be left out in which case the ring is assumed to be the polynomial ring over the rationals with variable names $a,b,c,\dots$. The program will output the polynomial ring and the list of reduced Gr\"obner bases of the input ideal. In this example there are 33 such bases. % You may want to filter the output through the UNIX %program \texttt{cat} to separate the debug information and the list of %Gr\"obner bases. Type the following to do this: %\begin{verbatim} %gfan | cat %\end{verbatim} %and type in the input as before. Often it is convenient to store your generators in a text file instead of typing them in every time you use the program. You can redirect the standard input for the program to read from a file instead of the keyboard. For example, if your ring and generators are stored in the file \texttt{myinputfile.txt} you would type: \begin{verbatim} gfan_bases myoutputfile.txt \end{verbatim} The list of reduced Gr\"obner bases can be transformed into a polyhedral representation of the Gr\"obner fan by using the program \texttt{gfan\_topolyhedralfan} as explained in Section~\ref{subsec:combining}. Here is another example of a polynomial ring and an ideal: \begin{verbatim} Z/3Z[x_1,x_2,x_3] {x_1^2x_2-x_3,x_2^2x_3-x_1,x_3^2x_1-x_2} \end{verbatim} \subsubsection{Exploiting symmetry} \label{sec:symmtry} As explained in Subsection \ref{subsec:global computations} the program can do its computations up to symmetry. In the example above we may cycle the three variables without changing the ideal. Hence the subgroup $G\subseteq S_n$ in Subsection \ref{subsec:global computations} is the group generated by a three cycle. A way to write down the subgroup is by writing a list of permutations that generate the subgroup: \begin{verbatim} {(0,1,2),(1,2,0)} \end{verbatim} The first permutation is the identity (which can be left out). The second permutation is three-cycle. Together they generate $G$. See Appendix~\ref{sec:dataformats} for more information on how to specify the permutations. The option \texttt{--symmetry} tells \texttt{gfan} to do its computations up to symmetry. For example, \begin{verbatim} gfan_bases --symmetry myoutputfile.txt %\end{verbatim} We need to use the option \texttt{-m} to tell \texttt{gfan\_leadingterms} that it should expect a list of Gr\"obner bases rather than a single Gr\"obner basis on its input. If we want the union of the Gr\"obner bases instead we should type: \begin{verbatim} gfan_bases myoutputfile.txt \end{verbatim} This will compute a \emph{universal Gr\"obner basis}. In three variables, if we want to draw staircase diagrams of the initial ideals we may use the program \texttt{gfan\_renderstaircase}: \begin{verbatim} gfan_bases --symmetry out.fig \end{verbatim} The output file is the xfig file in Figure \ref{fig:staircase}. To save paper we used the \texttt{--symmetry} option and gave the program the file also containing the group generators as input. \begin{figure} \begin{center} \epsfig{file=staircase.eps,height=4.5cm} \end{center} \caption{Staircase diagrams of the monomial initial ideals in the example - up to symmetry.} \label{fig:staircase} \end{figure} In three variables, if we want to draw the Gr\"obner fan - or rather draw the intersection of the $2$-dimensional standard simplex with the Gr\"obner fan we may use the program \texttt{gfan\_render}: \begin{verbatim} gfan_bases myoutputfile.fig \end{verbatim} The output is shown in Figure \ref{fig:gfan}. If there are more than three variables in the polynomial ring this program can still be used but it is more difficult. See Appendix~\ref{applist:_render}. \begin{figure} \begin{center} \epsfig{file=gfan.eps,height=5.9cm} \end{center} \caption{The Gr\"obner fan of the ideal intersected with the standard simplex.} \label{fig:gfan} \end{figure} \subsection{Interactive mode} To study the local structure of the Gr\"obner fan the program \texttt{gfan\_interactive} is useful. It allows the user to walk along an arbitrary path of full dimensional Gr\"obner cones in the Gr\"obner fan of the ideal. At each step the user will specify which facet to walk through. The input must be a marked Gr\"obner basis. The program will minimise and autoreduce if necessary to get the reduced Gr\"obner basis. For example running the program \begin{verbatim} gfan_interactive \end{verbatim} with input \begin{verbatim} Q[a,b,c] { c^15-c, b-c^11, a-c^9} \end{verbatim} will give us a list of facets to walk through. (One way to get a starting Gr\"obner basis is by using the program \texttt{gfan\_buchberger}.) In this case only two flips are possible, since the third wall does not lead to a new Gr\"obner cone. -- The wall is on the boundary of the Gr\"obner region. We may choose any of the two remaining facets by typing in an index (a number) followed by $<$ enter $>$. See Appendix \ref{applist:_interactive} for more options. %\subsection{Other useful programs} %We list a few more interesting programs in the package. The remaining programs can be found in Appendix \ref{sec:applist}. %\subsubsection{Computing a Gr\"obner cone} %The program \texttt{gfan\_groebnercone} extracts a defining set of half-spaces for a Gr\"obner cone. %The input is a Gr\"obner basis for the cone. The output is a list of vectors - each specifying a half-space. %For example we may compute the restricted Gr\"obner cone of the lexicographic basis above by running %\begin{verbatim} %gfan_groebnercone --restrict %\end{verbatim} %with the reduced Gr\"obner basis as input. % %\subsubsection{Computing the facets of a Gr\"obner cone} %The program \texttt{gfan\_facets} will take a list of vectors - each specifying a half-space whose intersection is a full-dimensional cone and compute a minimal set of defining half-spaces for the cone. Thus, we can compute the inner facet normals of the Gr\"obner cone above by running %\begin{verbatim} %gfan_groebnercone --restrict | gfan_facets %\end{verbatim} %with the reduced Gr\"obner basis as input. % %\subsubsection{Computing a weight vector} %The program \texttt{gfan\_weightvector} will compute a strictly positive interior point of a Gr\"obner cone given by its reduced Gr\"obner basis. In our example, if we run %\begin{verbatim} %gfan_weightvector %\end{verbatim} %on the lexicographic basis we (might) get the vector %\begin{verbatim} %(21,25,2) %\end{verbatim} \subsection{Integers and p-adics} Gfan handles two settings in which the usual division and Buchberger algorithms do not suffice. These are ideals in $\Z[x_1,\dots,x_n]$ and $\Q[x_1,\dots,x_n]$, where, in the latter setting, the $p$-adic valuation is taken into account when defining initial ideals. At the moment these two settings are handled by the commands \texttt{gfan\_overintegers} and \texttt{gfan\_padic}. They allow the computation of Gr\"obner bases, initial ideals, Gr\"obner cones (or polyhedra) and Gr\"obner fans (or complexes). In this section we give two examples. Use the \texttt{--help} option to get the full documentation. \begin{example} To compute the Gr\"obner fan of \cite[Example~3.9]{sturmfels}, with the ideal considered in the ring $\Z[a,b,c]$ we run the command \begin{verbatim} gfan_overintegers --groebnerFan -g --log1 \end{verbatim} on \begin{verbatim} Q[a,b,c] {a^5+b^3+c^2-1, b^2+a^2+c-1, c^3+a^6+b^5-1} \end{verbatim} Since the type-system of Gfan does not understand {\texttt Z[a,b,c]} we need to trick Gfan by specifying the ring $Q[a,b,c]$ when running {\texttt gfan\_overintegers}. From the output we conclude that the ideal has $1659$ reduced Gr\"obner bases over the integers (as opposed to $360$ over a field of characteristic $0$). \end{example} \begin{example} To compute the reduced Gr\"obner basis of $I=\langle x_1+2x_2-3x_3, 3x_2-4x_3+5x_4\rangle\subseteq \Q[x_1,\dots,x_4]$ with respect to the vector $(1,0,0,1)$ (tie-broken lexicographically) and with $\Q$ having the $2$-adic valuation, we run \begin{verbatim} gfan_padic --groebnerBasis -p2 \end{verbatim} on the input \begin{verbatim} Q[x1,x2,x3,x4] { x1+2x2-3x3, 3x2-4x3+5x4 } (1,1,0,0,1) \end{verbatim} The first coordinate of the input vector is a $1$, since {\texttt \_padic} requires ``homogenized'' weight vectors. This is Example 2.4.3 in ~\cite{tropicalbook}. The division algorithm implemented in Gfan used for this computation was proposed by Maclagan. To find all initial ideals, we can use a combination of \texttt{gfan\_padic --groebnerBasis}, \texttt{gfan\_combinerays --section CONES -i filename} and \texttt{gfan\_padic --initialIdeals -m}. Notice that the Gr\"obner complex of $I$, where valuation is taken into account (see Maclagan-Sturmfels), is not a fan. The output of \texttt{gfan\_padic --groebnerComplex}, however, will be a fan. To get the Gr\"obner complex we need to intersect the fan with the hyperplane $\omega_0=1$. NOTICE THAT \texttt{\_padic} USES THE MINIMUM CONVENTION AT THE MOMENT - in order to be consistent with Maclagan and Sturmfels. \end{example} \subsection{Toric ideals and secondary fans} Gfan is a replacement of the software CaTS \cite{cats} which computes Gr\"obner fans of toric and lattice ideals. For convenience a program for computing lattice ideals has been added to Gfan. To compute the lattice ideal of the lattice generated by $(2,-1,0)$ and $(3,0,-1)$ we run: \begin{verbatim} gfan_latticeideal {(2,-1,0),(3,0,-1)} \end{verbatim} Gfan will transform the generators into binomials and compute the saturation of the ideal they generate by the product of all variables. The computation is independent of the characteristic of the field. If on the other hand we wish to compute the toric ideal of a \emph{vector configuration} given by the columns of the $1\times 3$-matrix $(1,2,3)$ we run \begin{verbatim} gfan_latticeideal -t {(1,2,3)} \end{verbatim} More rows can be added to the matrix if we want. The choice of the term ``vector configuration'' is intentional and nonstandard. The reason for this will become clear later in this section. In Gfan terminology a \emph{point configuration} is reserved for the collection of points we have before we add a row of ones to construct a projective toric variety. By adding the row of ones the point configuration is turned into a vector configuration. Notice that scaling a vector of a vector configuration may change its toric ideal. Computing toric ideals Gfan is not optimal. If one needs to do big examples the software 4ti2 \cite{4ti2} is recommended. For a toric ideal the radical of a monomial initial ideal is the Stanley-Reisner ideal of a regular triangulation of the point configuration, see \cite{sturmfels}. Hence the toric Groebner fan is a refinement of the \emph{secondary fan}, indexing all regular triangulation of the point configuration. The secondary fan of the vector configuration $\{(1,0),(1,1),(1,2),(1,3)\}$ can be computed by typing \begin{verbatim} gfan_secondaryfan {(1,0),(1,1),(1,2),(1,3)} \end{verbatim} Comparing this to the finer Gr\"obner fan of the corresponding toric ideal which you get by doing \begin{footnotesize} \begin{verbatim} gfan_transposematrix | gfan_latticeideal -t | gfan_bases | gfan_topolyhedralfan {(1,0),(1,1),(1,2),(1,3)} \end{verbatim} \end{footnotesize} you realise that three monomial initial ideals of the toric ideal have the same radical, while four monomial initial ideals pairwise have the same radical. The secondary fan computation was added for convenience. %For any %serious computation with secondary fans you should use An alternative is to use TOPCOM \cite{rambau}. Notice however, that the vector configurations for gfan\_secondaryfan do not have to be pointed. This means that all combinatorial types of polytopes with a fixed set of normals can be easily enumerated. This is not possible with TOPCOM. gfan0.8beta/doc/nonconst.eps0000664000175000017500000001255115177170257015526 0ustar andersanders%!PS-Adobe-2.0 EPSF-2.0 %%Title: nonconst.fig %%Creator: fig2dev Version 3.2 Patchlevel 4 %%CreationDate: Wed Sep 19 18:47:30 2007 %%For: anders@alice (Anders Nedergaard Jensen) %%BoundingBox: 0 0 173 173 %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save newpath 0 173 moveto 0 0 lineto 173 0 lineto 173 173 lineto closepath clip newpath -179.3 414.7 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y tr xrad yrad sc 0 0 1 startangle endangle arc closepath savematrix setmatrix } def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def $F2psBegin 10 setmiterlimit 0 slj 0 slc 0.06000 0.06000 sc % % Fig objects follow % % % here starts figure with depth 50 % Ellipse 7.500 slw n 4500 5100 32 32 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr % Ellipse n 4800 5400 32 32 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr % Ellipse n 4500 5400 32 32 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr % Ellipse n 3600 6300 32 32 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr % Polyline gs clippath 4230 4185 m 4170 4185 l 4170 4370 l 4200 4220 l 4230 4370 l cp eoclip n 4200 5700 m 4200 4200 l gs col0 s gr gr % arrowhead n 4230 4370 m 4200 4220 l 4170 4370 l 4200 4340 l 4230 4370 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 5715 5730 m 5715 5670 l 5530 5670 l 5680 5700 l 5530 5730 l cp eoclip n 4200 5700 m 5700 5700 l gs col0 s gr gr % arrowhead n 5530 5730 m 5680 5700 l 5530 5670 l 5560 5700 l 5530 5730 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 5731 4210 m 5689 4168 l 5558 4298 l 5686 4214 l 5601 4341 l cp eoclip n 5250 4650 m 5700 4200 l gs col0 s gr gr % arrowhead n 5601 4341 m 5686 4214 l 5558 4298 l 5601 4298 l 5601 4341 l cp gs 0.00 setgray ef gr col0 s % Polyline n 5550 4050 m 4500 5100 l 4500 5400 l 4800 5400 l 5850 4350 l gs col0 s gr % Polyline n 4800 5400 m 4800 6900 l gs col0 s gr % Polyline n 3600 6300 m 3000 6300 l gs col0 s gr % Polyline n 4500 5100 m 3000 5100 l gs col0 s gr % Polyline n 4500 5400 m 3600 6300 l 3600 6900 l gs col0 s gr % Polyline gs clippath 2985 5820 m 2985 5880 l 3170 5880 l 3020 5850 l 3170 5820 l cp eoclip n 3600 5850 m 3000 5850 l gs col0 s gr gr % arrowhead n 3170 5820 m 3020 5850 l 3170 5880 l 3140 5850 l 3170 5820 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 4020 6915 m 4080 6915 l 4080 6730 l 4050 6880 l 4020 6730 l cp eoclip n 4050 6300 m 4050 6900 l gs col0 s gr gr % arrowhead n 4020 6730 m 4050 6880 l 4080 6730 l 4050 6760 l 4020 6730 l cp gs 0.00 setgray ef gr col0 s /Times-Roman ff 180.00 scf sf 3642 6486 m gs 1 -1 sc (4) col0 sh gr /Times-Roman ff 180.00 scf sf 5465 4599 m gs 1 -1 sc (2) col0 sh gr /Times-Roman ff 180.00 scf sf 4346 5066 m gs 1 -1 sc (6) col0 sh gr /Times-Roman ff 180.00 scf sf 4339 5465 m gs 1 -1 sc (3) col0 sh gr /Times-Roman ff 180.00 scf sf 4859 5466 m gs 1 -1 sc (1) col0 sh gr /Times-Roman ff 180.00 scf sf 4086 6625 m gs 1 -1 sc (5) col0 sh gr /Times-Roman ff 180.00 scf sf 3301 5823 m gs 1 -1 sc (0) col0 sh gr % here ends figure; $F2psEnd rs showpage gfan0.8beta/doc/hplain.bst0000664000175000017500000004640015177170257015141 0ustar andersanders% hplain: adds eprint field (www-admin@xxx.lanl.gov) % an extension of: % BibTeX standard bibliography style `plain' % version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09. % Copyright (C) 1985, all rights reserved. % Copying of this file is authorized only if either % (1) you make absolutely no changes to your copy, including name, or % (2) if you do make changes, you name it something other than % btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst. % This restriction helps ensure that all standard styles are identical. % The file btxbst.doc has the documentation for this style. ENTRY { address author booktitle chapter edition editor eprint howpublished institution journal key month note number organization pages publisher school series title type volume year } {} { label } INTEGERS { output.state before.all mid.sentence after.sentence after.block } FUNCTION {init.state.consts} { #0 'before.all := #1 'mid.sentence := #2 'after.sentence := #3 'after.block := } STRINGS { s t } FUNCTION {output.nonnull} { 's := output.state mid.sentence = { ", " * write$ } { output.state after.block = { add.period$ write$ newline$ "\newblock " write$ } { output.state before.all = 'write$ { add.period$ " " * write$ } if$ } if$ mid.sentence 'output.state := } if$ s } FUNCTION {output} { duplicate$ empty$ 'pop$ 'output.nonnull if$ } FUNCTION {output.check} { 't := duplicate$ empty$ { pop$ "empty " t * " in " * cite$ * warning$ } 'output.nonnull if$ } FUNCTION {output.bibitem} { newline$ "\bibitem{" write$ cite$ write$ "}" write$ newline$ "" before.all 'output.state := } FUNCTION {fin.entry} { add.period$ write$ newline$ } FUNCTION {new.block} { output.state before.all = 'skip$ { after.block 'output.state := } if$ } FUNCTION {new.sentence} { output.state after.block = 'skip$ { output.state before.all = 'skip$ { after.sentence 'output.state := } if$ } if$ } FUNCTION {not} { { #0 } { #1 } if$ } FUNCTION {and} { 'skip$ { pop$ #0 } if$ } FUNCTION {or} { { pop$ #1 } 'skip$ if$ } FUNCTION {new.block.checka} { empty$ 'skip$ 'new.block if$ } FUNCTION {new.block.checkb} { empty$ swap$ empty$ and 'skip$ 'new.block if$ } FUNCTION {new.sentence.checka} { empty$ 'skip$ 'new.sentence if$ } FUNCTION {new.sentence.checkb} { empty$ swap$ empty$ and 'skip$ 'new.sentence if$ } FUNCTION {field.or.null} { duplicate$ empty$ { pop$ "" } 'skip$ if$ } FUNCTION {emphasize} { duplicate$ empty$ { pop$ "" } { "{\em " swap$ * "}" * } if$ } INTEGERS { nameptr namesleft numnames } FUNCTION {format.names} { 's := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't := nameptr #1 > { namesleft #1 > { ", " * t * } { numnames #2 > { "," * } 'skip$ if$ t "others" = { " et~al." * } { " and " * t * } if$ } if$ } 't if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } FUNCTION {format.authors} { author empty$ { "" } { author format.names } if$ } FUNCTION {format.editors} { editor empty$ { "" } { editor format.names editor num.names$ #1 > { ", editors" * } { ", editor" * } if$ } if$ } FUNCTION {format.title} { title empty$ { "" } { title "t" change.case$ } if$ } FUNCTION {format.eprint} { eprint empty$ { "" } { eprint } if$ } FUNCTION {n.dashify} { 't := "" { t empty$ not } { t #1 #1 substring$ "-" = { t #1 #2 substring$ "--" = not { "--" * t #2 global.max$ substring$ 't := } { { t #1 #1 substring$ "-" = } { "-" * t #2 global.max$ substring$ 't := } while$ } if$ } { t #1 #1 substring$ * t #2 global.max$ substring$ 't := } if$ } while$ } FUNCTION {format.date} { year empty$ { month empty$ { "" } { "there's a month but no year in " cite$ * warning$ month } if$ } { month empty$ 'year { month " " * year * } if$ } if$ } FUNCTION {format.btitle} { title emphasize } FUNCTION {tie.or.space.connect} { duplicate$ text.length$ #3 < { "~" } { " " } if$ swap$ * * } FUNCTION {either.or.check} { empty$ 'pop$ { "can't use both " swap$ * " fields in " * cite$ * warning$ } if$ } FUNCTION {format.bvolume} { volume empty$ { "" } { "volume" volume tie.or.space.connect series empty$ 'skip$ { " of " * series emphasize * } if$ "volume and number" number either.or.check } if$ } FUNCTION {format.number.series} { volume empty$ { number empty$ { series field.or.null } { output.state mid.sentence = { "number" } { "Number" } if$ number tie.or.space.connect series empty$ { "there's a number but no series in " cite$ * warning$ } { " in " * series * } if$ } if$ } { "" } if$ } FUNCTION {format.edition} { edition empty$ { "" } { output.state mid.sentence = { edition "l" change.case$ " edition" * } { edition "t" change.case$ " edition" * } if$ } if$ } INTEGERS { multiresult } FUNCTION {multi.page.check} { 't := #0 'multiresult := { multiresult not t empty$ not and } { t #1 #1 substring$ duplicate$ "-" = swap$ duplicate$ "," = swap$ "+" = or or { #1 'multiresult := } { t #2 global.max$ substring$ 't := } if$ } while$ multiresult } FUNCTION {format.pages} { pages empty$ { "" } { pages multi.page.check { "pages" pages n.dashify tie.or.space.connect } { "page" pages tie.or.space.connect } if$ } if$ } FUNCTION {format.vol.num.pages} { volume field.or.null number empty$ 'skip$ { "(" number * ")" * * volume empty$ { "there's a number but no volume in " cite$ * warning$ } 'skip$ if$ } if$ pages empty$ 'skip$ { duplicate$ empty$ { pop$ format.pages } { ":" * pages n.dashify * } if$ } if$ } FUNCTION {format.chapter.pages} { chapter empty$ 'format.pages { type empty$ { "chapter" } { type "l" change.case$ } if$ chapter tie.or.space.connect pages empty$ 'skip$ { ", " * format.pages * } if$ } if$ } FUNCTION {format.in.ed.booktitle} { booktitle empty$ { "" } { editor empty$ { "In " booktitle emphasize * } { "In " format.editors * ", " * booktitle emphasize * } if$ } if$ } FUNCTION {empty.misc.check} { author empty$ title empty$ howpublished empty$ month empty$ year empty$ note empty$ and and and and and key empty$ not and { "all relevant fields are empty in " cite$ * warning$ } 'skip$ if$ } FUNCTION {format.thesis.type} { type empty$ 'skip$ { pop$ type "t" change.case$ } if$ } FUNCTION {format.tr.number} { type empty$ { "Technical Report" } 'type if$ number empty$ { "t" change.case$ } { number tie.or.space.connect } if$ } FUNCTION {format.article.crossref} { key empty$ { journal empty$ { "need key or journal for " cite$ * " to crossref " * crossref * warning$ "" } { "In {\em " journal * "\/}" * } if$ } { "In " key * } if$ " \cite{" * crossref * "}" * } FUNCTION {format.crossref.editor} { editor #1 "{vv~}{ll}" format.name$ editor num.names$ duplicate$ #2 > { pop$ " et~al." * } { #2 < 'skip$ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = { " et~al." * } { " and " * editor #2 "{vv~}{ll}" format.name$ * } if$ } if$ } if$ } FUNCTION {format.book.crossref} { volume empty$ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ "In " } { "Volume" volume tie.or.space.connect " of " * } if$ editor empty$ editor field.or.null author field.or.null = or { key empty$ { series empty$ { "need editor, key, or series for " cite$ * " to crossref " * crossref * warning$ "" * } { "{\em " * series * "\/}" * } if$ } { key * } if$ } { format.crossref.editor * } if$ " \cite{" * crossref * "}" * } FUNCTION {format.incoll.inproc.crossref} { editor empty$ editor field.or.null author field.or.null = or { key empty$ { booktitle empty$ { "need editor, key, or booktitle for " cite$ * " to crossref " * crossref * warning$ "" } { "In {\em " booktitle * "\/}" * } if$ } { "In " key * } if$ } { "In " format.crossref.editor * } if$ " \cite{" * crossref * "}" * } FUNCTION {article} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block crossref missing$ { journal emphasize "journal" output.check format.vol.num.pages output format.date "year" output.check } { format.article.crossref output.nonnull format.pages output } if$ format.eprint output new.block note output fin.entry } FUNCTION {book} { output.bibitem author empty$ { format.editors "author and editor" output.check } { format.authors output.nonnull crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ new.block format.btitle "title" output.check crossref missing$ { format.bvolume output new.block format.number.series output new.sentence publisher "publisher" output.check address output } { new.block format.book.crossref output.nonnull } if$ format.edition output format.date "year" output.check format.eprint output new.block note output fin.entry } FUNCTION {booklet} { output.bibitem format.authors output new.block format.title "title" output.check howpublished address new.block.checkb howpublished output address output format.date output format.eprint output new.block note output fin.entry } FUNCTION {inbook} { output.bibitem author empty$ { format.editors "author and editor" output.check } { format.authors output.nonnull crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ new.block format.btitle "title" output.check crossref missing$ { format.bvolume output format.chapter.pages "chapter and pages" output.check new.block format.number.series output new.sentence publisher "publisher" output.check address output } { format.chapter.pages "chapter and pages" output.check new.block format.book.crossref output.nonnull } if$ format.edition output format.date "year" output.check format.eprint output new.block note output fin.entry } FUNCTION {incollection} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block crossref missing$ { format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output format.chapter.pages output new.sentence publisher "publisher" output.check address output format.edition output format.date "year" output.check } { format.incoll.inproc.crossref output.nonnull format.chapter.pages output } if$ format.eprint output new.block note output fin.entry } FUNCTION {inproceedings} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block crossref missing$ { format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output format.pages output address empty$ { organization publisher new.sentence.checkb organization output publisher output format.date "year" output.check } { address output.nonnull format.date "year" output.check new.sentence organization output publisher output } if$ } { format.incoll.inproc.crossref output.nonnull format.pages output } if$ format.eprint output new.block note output fin.entry } FUNCTION {conference} { inproceedings } FUNCTION {manual} { output.bibitem author empty$ { organization empty$ 'skip$ { organization output.nonnull address output } if$ } { format.authors output.nonnull } if$ new.block format.btitle "title" output.check author empty$ { organization empty$ { address new.block.checka address output } 'skip$ if$ } { organization address new.block.checkb organization output address output } if$ format.edition output format.date output format.eprint output new.block note output fin.entry } FUNCTION {mastersthesis} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block "Master's thesis" format.thesis.type output.nonnull school "school" output.check address output format.date "year" output.check format.eprint output new.block note output fin.entry } FUNCTION {misc} { output.bibitem format.authors output title howpublished new.block.checkb format.title output howpublished new.block.checka howpublished output format.date output format.eprint output new.block note output fin.entry empty.misc.check } FUNCTION {phdthesis} { output.bibitem format.authors "author" output.check new.block format.btitle "title" output.check new.block "PhD thesis" format.thesis.type output.nonnull school "school" output.check address output format.date "year" output.check format.eprint output new.block note output fin.entry } FUNCTION {proceedings} { output.bibitem editor empty$ { organization output } { format.editors output.nonnull } if$ new.block format.btitle "title" output.check format.bvolume output format.number.series output address empty$ { editor empty$ { publisher new.sentence.checka } { organization publisher new.sentence.checkb organization output } if$ publisher output format.date "year" output.check } { address output.nonnull format.date "year" output.check new.sentence editor empty$ 'skip$ { organization output } if$ publisher output } if$ format.eprint output new.block note output fin.entry } FUNCTION {techreport} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block format.tr.number output.nonnull institution "institution" output.check address output format.date "year" output.check format.eprint output new.block note output fin.entry } FUNCTION {unpublished} { output.bibitem format.authors "author" output.check new.block format.title "title" output.check new.block note "note" output.check format.date output format.eprint output fin.entry } FUNCTION {default.type} { misc } MACRO {jan} {"January"} MACRO {feb} {"February"} MACRO {mar} {"March"} MACRO {apr} {"April"} MACRO {may} {"May"} MACRO {jun} {"June"} MACRO {jul} {"July"} MACRO {aug} {"August"} MACRO {sep} {"September"} MACRO {oct} {"October"} MACRO {nov} {"November"} MACRO {dec} {"December"} MACRO {acmcs} {"ACM Computing Surveys"} MACRO {acta} {"Acta Informatica"} MACRO {cacm} {"Communications of the ACM"} MACRO {ibmjrd} {"IBM Journal of Research and Development"} MACRO {ibmsj} {"IBM Systems Journal"} MACRO {ieeese} {"IEEE Transactions on Software Engineering"} MACRO {ieeetc} {"IEEE Transactions on Computers"} MACRO {ieeetcad} {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} MACRO {ipl} {"Information Processing Letters"} MACRO {jacm} {"Journal of the ACM"} MACRO {jcss} {"Journal of Computer and System Sciences"} MACRO {scp} {"Science of Computer Programming"} MACRO {sicomp} {"SIAM Journal on Computing"} MACRO {tocs} {"ACM Transactions on Computer Systems"} MACRO {tods} {"ACM Transactions on Database Systems"} MACRO {tog} {"ACM Transactions on Graphics"} MACRO {toms} {"ACM Transactions on Mathematical Software"} MACRO {toois} {"ACM Transactions on Office Information Systems"} MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} MACRO {tcs} {"Theoretical Computer Science"} READ FUNCTION {sortify} { purify$ "l" change.case$ } INTEGERS { len } FUNCTION {chop.word} { 's := 'len := s #1 len substring$ = { s len #1 + global.max$ substring$ } 's if$ } FUNCTION {sort.format.names} { 's := #1 'nameptr := "" s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { nameptr #1 > { " " * } 'skip$ if$ s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := nameptr numnames = t "others" = and { "et al" * } { t sortify * } if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } FUNCTION {sort.format.title} { 't := "A " #2 "An " #3 "The " #4 t chop.word chop.word chop.word sortify #1 global.max$ substring$ } FUNCTION {author.sort} { author empty$ { key empty$ { "to sort, need author or key in " cite$ * warning$ "" } { key sortify } if$ } { author sort.format.names } if$ } FUNCTION {author.editor.sort} { author empty$ { editor empty$ { key empty$ { "to sort, need author, editor, or key in " cite$ * warning$ "" } { key sortify } if$ } { editor sort.format.names } if$ } { author sort.format.names } if$ } FUNCTION {author.organization.sort} { author empty$ { organization empty$ { key empty$ { "to sort, need author, organization, or key in " cite$ * warning$ "" } { key sortify } if$ } { "The " #4 organization chop.word sortify } if$ } { author sort.format.names } if$ } FUNCTION {editor.organization.sort} { editor empty$ { organization empty$ { key empty$ { "to sort, need editor, organization, or key in " cite$ * warning$ "" } { key sortify } if$ } { "The " #4 organization chop.word sortify } if$ } { editor sort.format.names } if$ } FUNCTION {presort} { type$ "book" = type$ "inbook" = or 'author.editor.sort { type$ "proceedings" = 'editor.organization.sort { type$ "manual" = 'author.organization.sort 'author.sort if$ } if$ } if$ " " * year field.or.null sortify * " " * title field.or.null sort.format.title * #1 entry.max$ substring$ 'sort.key$ := } ITERATE {presort} SORT STRINGS { longest.label } INTEGERS { number.label longest.label.width } FUNCTION {initialize.longest.label} { "" 'longest.label := #1 'number.label := #0 'longest.label.width := } FUNCTION {longest.label.pass} { number.label int.to.str$ 'label := number.label #1 + 'number.label := label width$ longest.label.width > { label 'longest.label := label width$ 'longest.label.width := } 'skip$ if$ } EXECUTE {initialize.longest.label} ITERATE {longest.label.pass} FUNCTION {begin.bib} { preamble$ empty$ 'skip$ { preamble$ write$ newline$ } if$ "\begin{thebibliography}{" longest.label * "}" * write$ newline$ } EXECUTE {begin.bib} EXECUTE {init.state.consts} ITERATE {call.type$} FUNCTION {end.bib} { newline$ "\end{thebibliography}" write$ newline$ } EXECUTE {end.bib} gfan0.8beta/doc/dataformats.tex0000664000175000017500000003623415177170257016207 0ustar andersanders\section{Data formats} \label{sec:dataformats} In this section we describe how polynomials, lists, marked Gr\"obner bases etc. are represented as ASCII character strings. These strings will be input to the programs by typing or by redirecting the standard input and be output by the program on the standard output which may be the screen, a pipe or a file. Usually files are used for input. For example, \begin{verbatim} gfan_bases < inputfile.txt > outputfile.txt \end{verbatim} will read its input from {\tt inputfile.txt} and write its output to {\tt outputfile.txt}. The following is an example of how to use pipes for computing a universal Gr\"obner basis of the input: \begin{verbatim} gfan_bases < inputfile.txt | gfan_polynomialsetunion > outputfile.txt \end{verbatim} In general spaces and newlines in the input are ignored, but for the polyhedral formats described in Section~\ref{sec:format fan} and Section~\ref{sec:format cone} the rules are different. \subsection{Fields} Two kinds of fields are supported: \begin{itemize} \item The field $\Q$ of rationals which is represented by the string ``\texttt{Q}''. \item Fields of the form $\Z/p\Z$ where $p$ is a prime number. These fields are represented by text strings ``\texttt{Z/pZ}'' where \texttt{p} is the prime number. For example ``\texttt{Z/3Z}'' or ``\texttt{Z/17Z}''. In Gfan the prime number $p$ must be less than $32749$. \end{itemize} \subsection{Variables} A variable is denoted by its name which is an string of characters. The exact rules for which names are allowed have not been decided on in this version of Gfan and therefore Gfan accepts most names. However, white spaces, commas and ``\texttt{]}'' are not allowed as characters in the name. Furthermore one should not choose variable names such that one name is a starting substring of an other -- don't choose names such as ``\texttt{x1}'' and ``\texttt{x}'' in the same polynomial ring. \subsection{Polynomial rings} A polynomial ring is represented first by a field and then by a list of variable names. The list begins with ``\texttt{[}'' and ends with ``\texttt{]}''. Names are separated by commas. The ordering of the variables matters as this is also the ordering used for the entries of for example weight vectors. Examples: ``\texttt{Z/2Z[a,b]}'' and ``\texttt{Q[x\_1,x\_2,y1,y2]}''. \subsection{Polynomials} %The variables in the polynomial ring are named {\tt a},...,{\tt %z},{\tt A},...,{\tt Z}. The number of variables in the polynomial ring %is specified implicitly. It depends on the variables used in the %input. It is important to note that the first variable is always {\tt %a}, meaning that if, for example, {\tt h} is used then all variables %from {\tt a} to {\tt g} are also used and memory is allocated for %these variables. Thus the program will require more memory and be much %slower if the user uses a variable without using the previous ones. % %compared to start the naming with {\tt a}. If you already have a file %where the variables have different names then have a look at %Subsection \ref{applist:_substitute}. Coefficients in the field are given as fractions. A coefficient equals its numerator multiplied by the inverse of the denominator. The numerator and denominator themselves are given by an integer in $\Z$ which is mapped to the field by the homomorphism sending $1\in\Z$ to $1$ in the field. The '{\tt /}' character and the denominator can be left out if the denominator is $1$. If a field with non-zero characteristic was chosen one should be careful that the denominator is not $0$. Monomials are written in the following formats: \begin{itemize} \item \texttt{a\symbol{94}4dc} \item \texttt{a4dc} \item \texttt{aaadac} \end{itemize} The monomial $1$ cannot be written without writing it as a term in the usual way ``\texttt{1}''. Any other term is either a monomial or a coefficient and a monomial. A polynomial is a list of terms separated by {\tt +}. The {\tt +} may be left out if the numerator of the next monomial is negative. That description did not cover every detail. Here is an example: \begin{verbatim} hello world - 3/8 a2+23abcge^4 +1 \end{verbatim} In our usual notation we would write it like this: $dehl^{3}o^{2}rw+1+23abce^{4}g-{3\over 8}a^{2}$. {\bf It is important to note that the first term written in a polynomial is distinguished from the other terms in the polynomial. This is useful when specifying marked Gr\"obner bases.} \subsection{Lists} A list begins with a '{\tt \{}' or a '{\tt (}', contains elements separated by '{\tt ,}' and is ended by a '{\tt \}}' or a '{\tt )}'. Different types of lists may be needed when specifying input for the various programs: \begin{description} \item[An integer vector] is a list of integers. \item[A list of integer vectors] is a list of integer vectors. Such lists are used for example when specifying generators for subgroups of $S_n$. \item[A polynomial list] (or a polynomial set) is a list of polynomials. \item[A Gr\"obner basis] is the list of polynomials in a Gr\"obner basis with the leading term of each listed polynomial being the initial term with respect to a term order for which this a Gr\"obner basis. \item[A list of polynomial sets] is a list of polynomial sets. Often the polynomial sets are required to be Gr\"obner bases. \item[An ideal] is written as a list of polynomials generating it. \end{description} For all other lists than integer vectors the characters '{\tt \{}' and '{\tt \}}' are used to start and end the list. \subsection{Permutations} When exploiting the symmetry of an ideal one needs to input permutations to the program. Each permutation is specified by a vector. The length of the vector should equal the number of elements being permuted - for example the number of variables in the polynomial ring. The first element in the vector describes where the first element goes and so on. Of course we start indexing from $0$. The following vectors specify the identity, a transposition and a 3-cycle, respectively, on an ordered set of four elements: \begin{itemize} \item {\tt (0,1,2,3)} \item {\tt (1,0,2,3)} \item {\tt (0,3,1,2)} \end{itemize} \subsection{Polyhedral fans} \label{sec:format fan} \label{format:fan} The output format for polyhedral fans is intended to be Polymake \cite{polymake} compatible. Polymake recently switched to an XML based format. Gfan will keep outputting data in the old text style by default as it is more convienient for the command line Gfan user. The option \texttt{--xml} switches output to being XML. In the Polymake world, the output objects will have type \texttt{SymmetricFan}. The new XML files cannot be read by Gfan at the moment, while the old non-XML format cannot be read by any version of Polymake. In the following we describe only the text (non-XML) format. For the XML format we refer to the Polymake documentation. The text representation of a fan begins with the lines \begin{verbatim} _application fan _version 2.2 _type SymmetricFan \end{verbatim} After this follows a list of properties. For example \begin{verbatim} LINEALITY_SPACE 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 -1 -1 -1 0 0 0 -1 -1 -1 1 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 \end{verbatim} Each property has a name and must be assigned a value of a certain type. You can read more about the philosophy of the format in the Polymake documentation. \begin{example} \label{ex:polyformat} The ideal $I=\langle ab-c,bc-a,ca-b\rangle$ has a cyclic symmetry. If we run the commands \begin{verbatim} gfan --symmetry -e | gfan_topolyhedralfan --symmetry \end{verbatim} on the input \begin{verbatim} Q[a,b,c] {ab-c,bc-a,ca-b} {(1,2,0)} \end{verbatim} we get a polyhedral representation of the Gr\"obner fan of $I$: \begin{verbatim} _application PolyhedralFan _version 2.2 _type PolyhedralFan AMBIENT_DIM 3 DIM 3 LINEALITY_DIM 0 RAYS 1 1 0 # 0 1 0 1 # 1 0 1 1 # 2 0 1 0 # 3 1 0 0 # 4 0 0 1 # 5 2 1 1 # 6 1 1 2 # 7 1 2 1 # 8 1 1 1 # 9 N_RAYS 10 LINEALITY_SPACE ORTH_LINEALITY_SPACE 0 0 1 0 1 0 1 0 0 F_VECTOR 1 10 18 9 CONES {} # New orbit # Dimension 0 {0} # New orbit # Dimension 1 {1} {2} {3} # New orbit {4} {5} {6} # New orbit {7} {8} {9} # New orbit {0 3} # New orbit # Dimension 2 {1 4} {2 5} {0 4} # New orbit {1 5} {2 3} {6 9} # New orbit {7 9} {8 9} {0 6} # New orbit {1 7} {2 8} {0 8} # New orbit {1 6} {2 7} {3 8} # New orbit {4 6} {5 7} {0 3 8} # New orbit # Dimension 3 {1 4 6} {2 5 7} {0 4 6} # New orbit {1 5 7} {2 3 8} {0 6 8 9} # New orbit {1 6 7 9} {2 7 8 9} MAXIMAL_CONES {0 3 8} # New orbit # Dimension 3 {1 4 6} {2 5 7} {0 4 6} # New orbit {1 5 7} {2 3 8} {0 6 8 9} # New orbit {1 6 7 9} {2 7 8 9} PURE 1 \end{verbatim} The most important properties are ``RAYS'' and ``CONES''. A ray is given by a relative interior point and a cone is given by a list of indices of rays that will generate the cone. We may compare this combinatorial data to the drawing of the Gr\"obner fan given in Figure~\ref{fig:polyformat}. Notice that this example is particularly simple as the dimension of the homogeneity space of $I$ is $0$. \end{example} \begin{figure} \begin{center} \epsfig{file=polyformat.eps,height=5.9cm} \end{center} \caption{The Gr\"obner fan in Example~\ref{ex:polyformat} intersected with the standard simplex in $\R^3$.} \label{fig:polyformat} \end{figure} The symbol ``\#'' is used for writing comments in the file. The comments should not be considered a part of the file. The comments are used by Gfan to let the user know about dimensions, orbits and indices. A detailed description of the properties follows in the following. \subsubsection{Data types} In Gfan's Polymake format the following data types are supported: \begin{description} \item{Cardinal:} One non-negative integer. \item{Boolean:} 0 or 1. \item{Matrix:} An array of integer vectors. \item{IncidenceMatrix:} An array of sets of integers. \item{Vector:} An integer vector. %\item{String} \end{description} \subsubsection{Properties} Before we describe the properties we need to make a few definitions. We do not consider the empty set to be a cone nor a face of a cone. \begin{definition} The \emph{lineality space} of a polyhedral cone is the largest subspace contained in the cone. \end{definition} The lineality space is the smallest face of the cone and if two cones are in the same polyhedral fan then they must have the same lineality space. We define the \emph{lineality space} of a fan to be the common lineality space of its cones. In the special case of a (non-restricted) Gr\"obner fan or a tropical variety the lineality space of the fan coincides with the homogeneity space of the defining ideal. \begin{definition} A cone (in a fan) is called a \emph{ray} if its dimension is one larger than the dimension of its lineality space. \end{definition} A ray can be represented by a vector in its relative interior. This vector is contained in the cone but not contained in any of its proper faces. The representation is not unique since the cone is invariant under translation by vectors in its lineality space. A Polyhedral fan in Gfan can have a subset of the following properties: \begin{description} \item{AMBIENT\_DIM} is a \emph{Cardinal} whose value is the dimension of the vector space in which the fan lives. If the fan is a Gr\"obner fan or a tropical variety then this number equals the number of variables in the polynomial ring of the defining ideal. \item{DIM} is a \emph{Cardinal} whose value is the dimension of the highest dimensional cone in the fan. \item{LINEALITY\_DIM} is a \emph{Cardinal} whose value is the dimension of the lineality space of the fan. \item{RAYS} is a \emph{Matrix}. The rows of the matrix are vectors representing the rays of the fan --- one for each ray. The rows are ordered and Gfan writes an index as a comment to make the file human readable. \item{N\_RAYS} is a \emph{Cardinal} which equals the number of rays in the fan. \item{LINEALITY\_SPACE} is a \emph{Matrix} whose rows form a basis for the lineality space of the fan. \item{ORTH\_LINEALITY\_SPACE} is a \emph{Matrix} whose rows form a basis for the orthogonal complement of the lineality space of the fan. \item{F\_VECTOR} is a \emph{Vector}. The number of entries is DIM$-$LINEALITY\_DIM+1. The $i$th entry is the number of cones in the fan of dimension\\ $i+$LINEALITY\_DIM$-1$. \item{CONES} is an \emph{IncidenceMatrix}. The section contains a line for each cone in the fan. Each line is the set of indices of the rays contained in the corresponding cone. \item{MAXIMAL\_CONES} is an \emph{IncidenceMatrix} and similar to CONES except that only cones which are maximal with respect to inclusion are listed. \item{PURE} is a \emph{Boolean}. The value is $1$ if the polyhedral fan is pure and $0$ otherwise. \item{MULTIPLICITIES} is a \emph{Matrix} with one column. An entry is the multiplicity of a maximal cone. Usually cones in polyhedral fans do not have multiplicities. Thus this property only makes sense for \emph{weighted} polyhedral fans of which tropical varieties is a special case. The ordering of the rows in this property is consistent with the ordering in MAXIMAL\_CONES. \item{RAY\_VALUES} is a \emph{Matrix} with just one column. It is used when the fan is meant to specify a piece-wise linear (or tropical rational) function. The function value on the $i$th ray of the fan is listed in the $i$th row of the matrix. \item{LINEALITY\_VALUES} is a \emph{Matrix} with just one column. It is used when the fan is meant to specify a piece-wise linear (or tropical rational) function. The function value on the $i$th generator of the lineality space (stored in LINEALITY\_SPACE) is listed in the $i$th row of the matrix. \end{description} Besides sections listed above, the sections MAXIMAL\_CONES\_ORBITS, CONES\_ORBITS and MULTIPLICITIES\_ORBITS are introduced when doing symmetric computations with the \texttt{--symmetry} option. These sections are analogous to MAXIMAL\_CONES, CONES and MULTIPLICITIES except that they operate on the level of orbits of cones with respect to the symmetry rather than cones. %\subsubsection{Dissimilarities between Gfan and Polymake} %In Polymake polyhedra are affine and for this reason the first entry of a vector has a special meaning. This is not the case in Gfan. %%In Polymake, if for example the section LINEALITY\_SPACE is empty it represents a $0\times 0$ matrix. In Gfan it represents a $0\times n$ matrix where $n$ is the dimension of the ambient space (AMBIENT\_DIM). \subsection{Polyhedral cones} \label{format:cone} \label{sec:format cone} %Polyhedral cones are represented in a Polymake compatible format; see the previous section. The string representation of a polyhedral cone starts with \begin{verbatim} _application PolyhedralCone _version 2.2 _type PolyhedralCone \end{verbatim} After this follows the properties. For polyhedral cones they are as follows. \begin{description} \item{AMBIENT\_DIM} --- see previous section. \item{DIM} is a \emph{Cardinal} whose value is the dimension of the cone. \item{IMPLIED\_EQUATIONS} is a \emph{Matrix} whose rows form a basis of the space of linear forms vanishing on the cone. \item{LINEALITY\_DIM} --- see previous section. \item{LINEALITY\_SPACE} --- see previous section. \item{FACETS} is a \emph{Matrix} which contains an outer normal vector for each facet of the cone. \item{RELATIVE\_INTERIOR\_POINT} is a \emph{Vector} in the relative interior of the cone. \end{description} gfan0.8beta/doc/apptable.tex0000664000175000017500000014047715177170257015477 0ustar andersanders{\subsection{gfan\_bases}\label{applist:_bases} This is a program for computing all reduced Gr\"obner bases of a polynomial ideal. It takes the ring and a generating set for the ideal as input. By default the enumeration is done by an almost memoryless reverse search. If the ideal is symmetric the symmetry option is useful and enumeration will be done up to symmetry using a breadth first search. The program needs a starting Gr\"obner basis to do its computations. If the -g option is not specified it will compute one using Buchberger's algorithm. \newline {\bf Options:} \begin{description} \item[-g]Tells the program that the input is already a Gr\"obner basis (with the initial term of each polynomial being the first ones listed). Use this option if it takes too much time to compute the starting (standard degree lexicographic) Gr\"obner basis and the input is already a Gr\"obner basis. \item[-\hspace{0.013cm}-symmetry]Tells the program to read in generators for a group of symmetries (subgroup of $S\_n$) after having read in the ideal. The program checks that the ideal stays fixed when permuting the variables with respect to elements in the group. The program uses breadth first search to compute the set of reduced Gr\"obner bases up to symmetry with respect to the specified subgroup. \item[-e]Echo. Output the generators for the symmetry group. \item[-\hspace{0.013cm}-disableSymmetryTest]When using -\hspace{0.013cm}-symmetry this option will disable the check that the group read off from the input actually is a symmetry group with respect to the input ideal. \item[-\hspace{0.013cm}-parameters value]With this option you can specify how many variables to treat as parameters instead of variables. This makes it possible to do computations where the coefficient field is the field of rational functions in the parameters.\item[-\hspace{0.013cm}-interrupt value]Interrupt the enumeration after a specified number of facets have been computed (works for usual symmetric traversals, but may not work in general for non-symmetric traversals or for traversals restricted to fans).\end{description} {\subsection{gfan\_buchberger}\label{applist:_buchberger} This program computes a reduced lexicographic Gr\"obner basis of the polynomial ideal given as input. The default behavior is to use Buchberger's algorithm. The ordering of the variables is $a>b>c...$ (assuming that the ring is Q[a,b,c,...]). \newline {\bf Options:} \begin{description} \item[-w]Compute a Gr\"obner basis with respect to a degree lexicographic order with $a>b>c...$ instead. The degrees are given by a weight vector which is read from the input after the generating set has been read. \item[-r]Use the reverse lexicographic order (or the reverse lexicographic order as a tie breaker if -w is used). The input must be homogeneous if the pure reverse lexicographic order is chosen. Ignored if -W is used. \item[-W]Do a Gr\"obner walk. The input must be a minimal Gr\"obner basis. If -W is used -w is ignored. \item[-g]Do a generic Gr\"obner walk. The input must be homogeneous and must be a minimal Gr\"obner basis with respect to the reverse lexicographic term order. The target term order is always lexicographic. The -W option must be used. \item[-\hspace{0.013cm}-parameters value]With this option you can specify how many variables to treat as parameters instead of variables. This makes it possible to do computations where the coefficient field is the field of rational functions in the parameters.\end{description} {\subsection{gfan\_combinerays}\label{applist:_combinerays} This program combines rays from the specified polymake file by adding according to a list of vectors of indices given on the standard input. \newline {\bf Options:} \begin{description} \item[-i value]Specify the name of the input file.\item[-\hspace{0.013cm}-section value]Specify a section of the polymake file to use as input, rather than standard input.\end{description} {\subsection{gfan\_doesidealcontain}\label{applist:_doesidealcontain} This program takes a marked Gr\"obner basis of an ideal I and a set of polynomials on its input and tests if the polynomial set is contained in I by applying the division algorithm for each element. The output is 1 for true and 0 for false. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-remainder]Tell the program to output the remainders of the divisions rather than outputting 0 or 1.\item[-\hspace{0.013cm}-multiplier]Reads in a polynomial that will be multiplied to the polynomial to be divided before doing the division.\end{description} {\subsection{gfan\_fancommonrefinement}\label{applist:_fancommonrefinement} This program takes two polyhedral fans and computes their common refinement. \newline {\bf Options:} \begin{description} \item[-i1 value]Specify the name of the first input file.\item[-i2 value]Specify the name of the second input file.\item[-\hspace{0.013cm}-stable]Compute the stable intersection.\end{description} {\subsection{gfan\_fanhomology}\label{applist:_fanhomology} This program takes a polyhedral fan and computes its reduced homology groups. Of course the support of a fan is contractible, so what is really computed is the reduced homology groups of the support of the fan after quotienting out with the lineality space and intersecting with a sphere. Notice that taking the quotient with the lineality space results in an inverted suspension which just results in a shift of the reduced homology groups. \newline {\bf Options:} \begin{description} \item[-i value]Specify the name of the input file.\item[-\hspace{0.013cm}-no-optimize]Disable preprocessing of boundary maps before doing lattice computations.\end{description} {\subsection{gfan\_fanisbalanced}\label{applist:_fanisbalanced} This program checks if a fan is balanced \newline {\bf Options:} \begin{description} \item[-i value]Specify the name of the input file.\item[-\hspace{0.013cm}-makeBalanced]Assign positive multiplicities to cones to make the fan balanced instead. Fan is assumed to be pure.\item[-\hspace{0.013cm}-facetComplex]When making the fan balanced, first take facet complex\item[-\hspace{0.013cm}-cone]Output cone of all balanced weight functions.\end{description} {\subsection{gfan\_fanlink}\label{applist:_fanlink} This program takes a polyhedral fan and a vector and computes the link of the polyhedral fan around that vertex. The link will have lineality space dimension equal to the dimension of the relative open polyhedral cone of the original fan containing the vector. \newline {\bf Options:} \begin{description} \item[-i value]Specify the name of the input file.\item[-\hspace{0.013cm}-symmetry]Reads in a fan stored with symmetry. The generators of the symmetry group must be given on the standard input. \item[-\hspace{0.013cm}-star]Computes the star instead. The star is defined as the smallest polyhedral fan containing all cones of the original fan containing the vector.\end{description} {\subsection{gfan\_fanproduct}\label{applist:_fanproduct} This program takes two polyhedral fans and computes their product. \newline {\bf Options:} \begin{description} \item[-i1 value]Specify the name of the first input file.\item[-i2 value]Specify the name of the second input file.\end{description} {\subsection{gfan\_fansubfan}\label{applist:_fansubfan} This program takes a polyhedral fan and a list of vectors and computes the smallest subfan of the fan having the list of vectors in its support. \newline {\bf Options:} \begin{description} \item[-i value]Specify the name of the input file.\item[-\hspace{0.013cm}-symmetry]Reads in the cone stored with symmetry. The generators of the symmetry group must be given on the standard input. \end{description} {\subsection{gfan\_genericlinearchange}\label{applist:_genericlinearchange} This program takes a list of polynomials and performs a generic linear change of coordinates by introducing nxn new variables. {\subsection{gfan\_groebnercone}\label{applist:_groebnercone} This program computes a Gr\"obner cone. Three different cases are handled. The input may be a marked reduced Gr\"obner basis in which case its Gr\"obner cone is computed. The input may be just a marked minimal basis in which case the cone computed is not a Gr\"obner cone in the usual sense but smaller. (These cones are described in [Fukuda, Jensen, Lauritzen, Thomas]). The third possible case is that the Gr\"obner cone is possibly lower dimensional and given by a pair of Gr\"obner bases as it is useful to do for tropical varieties, see option -\hspace{0.013cm}-pair. The facets of the cone can be read off in section FACETS and the equations in section IMPLIED\_EQUATIONS. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-restrict]Add an inequality for each coordinate, so that the the cone is restricted to the non-negative orthant.\item[-\hspace{0.013cm}-pair]The Gr\"obner cone is given by a pair of compatible Gr\"obner bases. The first basis is for the initial ideal and the second for the ideal itself. See the tropical section of the manual.\item[-\hspace{0.013cm}-asfan]Writes the cone as a polyhedral fan with all its faces instead. In this way the extreme rays of the cone are also computed.\item[-\hspace{0.013cm}-vectorinput]Compute a cone given list of inequalities rather than a Gr\"obner cone. The input is an integer which specifies the dimension of the ambient space, a list of inequalities given as vectors and a list of equations.\end{description} {\subsection{gfan\_groebnerfan}\label{applist:_groebnerfan} This is a program for computing the Gr\"obner fan of a polynomial ideal as a polyhedral complex. It takes a generating set for the ideal as input. If the ideal is symmetric the symmetry option is useful and enumeration will be done up to symmetry. The program needs a starting Gr\"obner basis to do its computations. If the -g option is not specified it will compute one using Buchberger's algorithm. \newline {\bf Options:} \begin{description} \item[-g]Tells the program that the input is already a Gr\"obner basis (with the initial term of each polynomial being the first ones listed). Use this option if it takes too much time to compute the starting (standard degree lexicographic) Gr\"obner basis and the input is already a Gr\"obner basis. \item[-\hspace{0.013cm}-symmetry]Tells the program to read in generators for a group of symmetries (subgroup of $S\_n$) after having read in the ideal. The program checks that the ideal stays fixed when permuting the variables with respect to elements in the group. The program uses breadth first search to compute the set of reduced Gr\"obner bases up to symmetry with respect to the specified subgroup. \item[-\hspace{0.013cm}-disableSymmetryTest]When using -\hspace{0.013cm}-symmetry this option will disable the check that the group read off from the input actually is a symmetry group with respect to the input ideal. \item[-\hspace{0.013cm}-restrictingfan value]Specify the name of a file containing a polyhedral fan in Polymake format. The computation of the Gr\"obner fan will be restricted to this fan. If the -\hspace{0.013cm}-symmetry option is used then this restricting fan must be invariant under the symmetry and the orbits in the file must be with respect to the specified group of symmetries. The orbits of maximal cones of the file are then read in rather than the maximal cones. \item[-\hspace{0.013cm}-parameters value]With this option you can specify how many variables to treat as parameters instead of variables. This makes it possible to do computations where the coefficient field is the field of rational functions in the parameters.\item[-\hspace{0.013cm}-nocones]Tells the program not to output the CONES and MAXIMAL\_CONES sections, but still output CONES\_COMPRESSED and MAXIMAL\_CONES\_COMPRESSED if -\hspace{0.013cm}-symmetry is used.\item[-\hspace{0.013cm}-interrupt value]Interrupt the enumeration after a specified number of facets have been computed (works for usual symmetric traversals, but may not work in general for non-symmetric traversals or for traversals restricted to fans).\end{description} {\subsection{gfan\_homogeneityspace}\label{applist:_homogeneityspace} This program computes the homogeneity space of a list of polynomials - as a cone. Thus generators for the homogeneity space are found in the section LINEALITY\_SPACE. If you wish the homogeneity space of an ideal you should first compute a set of homogeneous generators and call the program on these. A reduced Gr\"obner basis will always suffice for this purpose. {\subsection{gfan\_homogenize}\label{applist:_homogenize} This program homogenises a list of polynomials by introducing an extra variable. The name of the variable to be introduced is read from the input after the list of polynomials. Without the -w option the homogenisation is done with respect to total degree. Example: Input: Q[x,y]\{y-1\} z Output: Q[x,y,z]\{y-z\} \newline {\bf Options:} \begin{description} \item[-i]Treat input as an ideal. This will make the program compute the homogenisation of the input ideal. This is done by computing a degree Gr\"obner basis and homogenising it.\item[-w]Specify a homogenisation vector. The length of the vector must be the same as the number of variables in the ring. The vector is read from the input after the list of polynomials. \item[-H]Let the name of the new variable be H rather than reading in a name from the input.\end{description} {\subsection{gfan\_initialforms}\label{applist:_initialforms} This program converts a list of polynomials to a list of their initial forms with respect to the vector given after the list. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-ideal]Treat input as an ideal. This will make the program compute the initial ideal of the ideal generated by the input polynomials. The computation is done by computing a Gr\"obner basis with respect to the given vector. The vector must be positive or the input polynomials must be homogeneous in a positive grading. None of these conditions are checked by the program. \item[-\hspace{0.013cm}-pair]Produce a pair of polynomial lists. Used together with -\hspace{0.013cm}-ideal this option will also write a compatible reduced Gr\"obner basis for the input ideal to the output. This is useful for finding the Gr\"obner cone of a non-monomial initial ideal. \item[-\hspace{0.013cm}-mark]If the -\hspace{0.013cm}-pair option is and the -\hspace{0.013cm}-ideal option is not used this option will still make sure that the second output basis is marked consistently with the vector.\item[-\hspace{0.013cm}-list]Read in a list of vectors instead of a single vector and produce a list of polynomial sets as output.\end{description} {\subsection{gfan\_interactive}\label{applist:_interactive} This is a program for doing interactive walks in the Gr\"obner fan of an ideal. The input is a Gr\"obner basis defining the starting Gr\"obner cone of the walk. The program will list all flippable facets of the Gr\"obner cone and ask the user to choose one. The user types in the index (number) of the facet in the list. The program will walk through the selected facet and display the new Gr\"obner basis and a list of new facet normals for the user to choose from. Since the program reads the user's choices through the the standard input it is recommended not to redirect the standard input for this program. \newline {\bf Options:} \begin{description} \item[-L]Latex mode. The program will try to show the current Gr\"obner basis in a readable form by invoking LaTeX and xdvi. \item[-x]Exit immediately. \item[-f]Tell the program to list the flipped reduced Gr\"obner basis of the initial ideal for each flippable wall in the current Gr\"obner cone. \item[-w]Tell the program to list (a Gr\"obner basis with respect to the current term order for) the initial ideal for each flippable wall in the current Gr\"obner cone. \item[-i]Tell the program to list the defining set of inequalities of the non-restricted Gr\"obner cone as a set of vectors after having listed the current Gr\"obner basis. \item[-W]Print weight vector. This will make the program print an interior vector of the current Gr\"obner cone and a relative interior point for each flippable facet of the current Gr\"obner cone. \item[-\hspace{0.013cm}-tropical]Traverse a tropical variety interactively.\end{description} {\subsection{gfan\_ismarkedgroebnerbasis}\label{applist:_ismarkedgroebnerbasis} This program checks if a set of marked polynomials is a Gr\"obner basis with respect to its marking. First it is checked if the markings are consistent with respect to a positive vector. Then Buchberger's S-criterion is checked. The output is boolean value. {\subsection{gfan\_krulldimension}\label{applist:_krulldimension} Takes an ideal $I$ and computes the Krull dimension of R/I where R is the polynomial ring. This is done by first computing a Gr\"obner basis. \newline {\bf Options:} \begin{description} \item[-g]Tell the program that the input is already a reduced Gr\"obner basis.\end{description} {\subsection{gfan\_latticeideal}\label{applist:_latticeideal} This program computes the lattice ideal of a lattice. The input is a list of generators for the lattice. \newline {\bf Options:} \begin{description} \item[-t]Compute the toric ideal of the matrix whose rows are given on the input instead.\item[-\hspace{0.013cm}-convert]Does not do any computation, but just converts the vectors to binomials.\end{description} {\subsection{gfan\_leadingterms}\label{applist:_leadingterms} This program converts a list of polynomials to a list of their leading terms. \newline {\bf Options:} \begin{description} \item[-m]Do the same thing for a list of polynomial sets. That is, output the set of sets of leading terms. \end{description} {\subsection{gfan\_list}\label{applist:_list} This program lists all subcommands of the Gfan installation. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-hidden]Show hidden commands which are not officially supported.\end{description} {\subsection{gfan\_markpolynomialset}\label{applist:_markpolynomialset} This program marks a set of polynomials with respect to the vector given at the end of the input, meaning that the largest terms are moved to the front. In case of a tie the lexicographic term order with $a>b>c...$ is used to break it. {\subsection{gfan\_minkowskisum}\label{applist:_minkowskisum} This is a program for computing the normal fan of the Minkowski sum of the Newton polytopes of a list of polynomials. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-symmetry]Tells the program to read in generators for a group of symmetries (subgroup of $S\_n$) after having read in the ideal. The program checks that the ideal stays fixed when permuting the variables with respect to elements in the group. The program uses breadth first search to compute the set of reduced Gr\"obner bases up to symmetry with respect to the specified subgroup. \item[-\hspace{0.013cm}-disableSymmetryTest]When using -\hspace{0.013cm}-symmetry this option will disable the check that the group read off from the input actually is a symmetry group with respect to the input ideal. \item[-\hspace{0.013cm}-nocones]Tell the program to not list cones in the output.\end{description} {\subsection{gfan\_minors}\label{applist:_minors} This program will generate the r*r minors of a d*n matrix of indeterminates. \newline {\bf Options:} \begin{description} \item[-r value]Specify r.\item[-d value]Specify d.\item[-n value]Specify n.\item[-M2]Use Macaulay2 conventions for order of variables.\item[-\hspace{0.013cm}-names]Assign names to the minors.\item[-\hspace{0.013cm}-dressian]Produce tropical defining the Dressian(3,n) instead. (The signs may not be correct, that is the equations may not be Pluecker relations.)\item[-\hspace{0.013cm}-pluckersymmetries]Do nothing but produce symmetry generators for the Pluecker ideal.\item[-\hspace{0.013cm}-symmetry]Produces a list of generators for the group of symmetries keeping the set of minors fixed. (Only without -\hspace{0.013cm}-names).\item[-\hspace{0.013cm}-parametrize]Parametrize the set of d times n matrices of Barvinok rank less than or equal to r-1 by a list of tropical polynomials.\item[-\hspace{0.013cm}-ultrametric]Produce tropical equations cutting out the ultrametrics.\end{description} {\subsection{gfan\_mixedvolume}\label{applist:_mixedvolume} This program computes the mixed volume of the Newton polytopes of a list of polynomials. The ring is specified on the input. After this follows the list of polynomials. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-vectorinput]Read in a list of point configurations instead of a polynomial ring and a list of polynomials.\item[-\hspace{0.013cm}-cyclic value]Use cyclic-n example instead of reading input.\item[-\hspace{0.013cm}-noon value]Use Noonburg-n example instead of reading input.\item[-\hspace{0.013cm}-chandra value]Use Chandrasekhar-n example instead of reading input.\item[-\hspace{0.013cm}-katsura value]Use Katsura-n example instead of reading input.\item[-\hspace{0.013cm}-gaukwa value]Use Gaukwa-n example instead of reading input.\item[-\hspace{0.013cm}-eco value]Use Eco-n example instead of reading input.\item[-j value]Number of threads\end{description} {\subsection{gfan\_overintegers}\label{applist:_overintegers} This program is an experimental implementation of Gr\"obner bases for ideals in Z[x\_1,...,x\_n]. Several operations are supported by specifying the appropriate option: (1) computation of the reduced Gr\"obner basis with respect to a given vector (tiebroken lexicographically), (2) computation of an initial ideal, (3) computation of the Gr\"obner fan, (4) computation of a single Gr\"obner cone. Since Gfan only knows polynomial rings with coefficients being elements of a field, the ideal is specified by giving a set of polynomials in the polynomial ring Q[x\_1,...,x\_n]. That is, by using Q instead of Z when specifying the ring. The ideal MUST BE HOMOGENEOUS (in a positive grading) for computation of the Gr\"obner fan. Non-homogeneous ideals are allowed for the other computations if the specified weight vectors are positive. NOTE: This program is experimental and expected to change behaviour in future releases, so don't write your SAGE and M2 interfaces just yet. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-groebnerBasis]Asks the program to compute a marked Gr\"obner basis with respect to a weight vector tie-broken lexicographically. The input order is: Ring ideal vector. \item[-\hspace{0.013cm}-initialIdeal]Asks the program to compute an initial ideal with respect to a vector. The input order is: Ring ideal vector. \item[-\hspace{0.013cm}-groebnerFan]Asks the program to compute the Gr\"obner fan. The input order is: Ring ideal. \item[-\hspace{0.013cm}-groebnerCone]Asks the program to compute a single Gr\"obner cone containing the specified vector in its relative interior. The output is stored as a fan. The input order is: Ring ideal vector.\item[-m]For the operations taking a vector as input, read in a list of vectors instead, and perform the operation for each vector in the list.\item[-g]Tells the program that the input is already a Gr\"obner basis (with the initial term of each polynomial being the first ones listed). Use this option if the usual -\hspace{0.013cm}-groebnerFan is too slow. \end{description} {\subsection{gfan\_padic}\label{applist:_padic} This program is an experimental implementation of p-adic Gr\"obner bases as proposed by Diane Maclagan. Several operations are supported by specifying the appropriate option: (1) computation of Gr\"obner basis with respect to a given vector (tiebroken lexicographically), (2) computation of the p-adic initial ideal, (3) computation of the p-adic Gr\"obner complex as defined by Maclagan and Sturmfels, (4) computation of a single polyhedron of the p-adic Gr\"obner complex. The input ideal should be an ideal of the polynomial ring with coefficient field Q. The valuation is specified with the option -p. The ideal MUST BE HOMOGENEOUS (in a positive grading). Since gfan can only handle fans and not polyhedral complexes in general, what is computed as the Gr\"obner complex is actually the "fan over" the complex - in other words, the first coordinate is supposed to be 1 in the output fan. Similarly, the weight vectors must be specified in an homogeneous way, for example by adding an additional 1 entry as first coordinate. (If fractions are needed, use the entry as a common denominator.) NOTE: This program is experimental and expected to change behaviour in future releases, so don't write your SAGE and M2 interfaces just yet. In particular this program uses the tropical minimum-convention!! \newline {\bf Options:} \begin{description} \item[-p value]Defines the prime used for the valuation.\item[-\hspace{0.013cm}-groebnerBasis]Asks the program to compute a marked Gr\"obner basis with respect to a weight vector (tie-broken lexicographically). The input order is: Ring ideal vector. \item[-\hspace{0.013cm}-initialIdeal]Asks the program to compute an initial ideal with respect to a vector. The input order is: Ring ideal vector. \item[-\hspace{0.013cm}-groebnerComplex]Asks the program to compute the p-adic Gr\"obner complex. The input order is: Ring ideal. \item[-\hspace{0.013cm}-groebnerPolyhedron]Asks the program to compute a single polyhedron of the Gr\"obner complex containing the specified vector in its relative interior. The output is stored as a fan. The input order is: Ring ideal vector.\item[-m]For the operations taking a vector as input, read in a list of vectors instead, and perform the operation for each vector in the list.\end{description} {\subsection{gfan\_polynomialsetunion}\label{applist:_polynomialsetunion} This program computes the union of a list of polynomial sets given as input. The polynomials must all belong to the same ring. The ring is specified on the input. After this follows the list of polynomial sets. \newline {\bf Options:} \begin{description} \item[-s]Sort output by degree. \end{description} {\subsection{gfan\_render}\label{applist:_render} This program renders a Gr\"obner fan as an xfig file. To be more precise, the input is the list of all reduced Gr\"obner bases of an ideal. The output is a drawing of the Gr\"obner fan intersected with a triangle. The corners of the triangle are (1,0,0) to the right, (0,1,0) to the left and (0,0,1) at the top. If there are more than three variables in the ring these coordinates are extended with zeros. It is possible to shift the 1 entry cyclic with the option -\hspace{0.013cm}-shiftVariables. \newline {\bf Options:} \begin{description} \item[-L]Make the triangle larger so that the shape of the Gr\"obner region appears.\item[-\hspace{0.013cm}-shiftVariables value]Shift the positions of the variables in the drawing. For example with the value equal to 1 the corners will be right: (0,1,0,0,...), left: (0,0,1,0,...) and top: (0,0,0,1,...). The shifting is done modulo the number of variables in the polynomial ring. The default value is 0.\end{description} {\subsection{gfan\_renderstaircase}\label{applist:_renderstaircase} This program renders a staircase diagram of a monomial initial ideal to an xfig file. The input is a Gr\"obner basis of a (not necessarily monomial) polynomial ideal. The initial ideal is given by the leading terms in the Gr\"obner basis. Using the -m option it is possible to render more than one staircase diagram. The program only works for ideals in a polynomial ring with three variables. \newline {\bf Options:} \begin{description} \item[-m]Read multiple ideals from the input. The ideals are given as a list of lists of polynomials. For each polynomial list in the list a staircase diagram is drawn. \item[-d value]Specifies the number of boxes being shown along each axis. Be sure that this number is large enough to give a correct picture of the standard monomials. The default value is 8. \item[-w value]Width. Specifies the number of staircase diagrams per row in the xfig file. The default value is 5. \end{description} {\subsection{gfan\_resultantfan}\label{applist:_resultantfan} This program computes the resultant fan as defined in "Computing Tropical Resultants" by Jensen and Yu. The input is a polynomial ring followed by polynomials, whose coefficients are ignored. The output is the fan of coefficients such that the input system has a tropical solution. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-codimension]Compute only the codimension of the resultant fan and return. \item[-\hspace{0.013cm}-symmetry]Tells the program to read in generators for a group of symmetries (subgroup of $S\_n$) after having read in the vector configuration. The program DOES NOT checks that the configuration stays fixed when permuting the variables with respect to elements in the group. The output is grouped according to the symmetry. \item[-\hspace{0.013cm}-nocones]Tells the program not to output the CONES and MAXIMAL\_CONES sections, but still output CONES\_COMPRESSED and MAXIMAL\_CONES\_COMPRESSED if -\hspace{0.013cm}-symmetry is used. \item[-\hspace{0.013cm}-special]Read in a zero-one vector from the standard input and specialize all variables with a one. That is, compute the stable intersection of the resultant fan with the subspace where the variables with a one in the vector are forced to zero. AT THE MOMENT ALSO A RELATIVE INTERIOR POINT OF A STARTING CONE IS READ. \item[-\hspace{0.013cm}-vectorinput]Read in a list of point configurations instead of a polynomial ring and a list of polynomials. \item[-\hspace{0.013cm}-projection]Use the projection method to compute the resultant fan. This works only if the resultant fan is a hypersurface. If this option is combined with -\hspace{0.013cm}-special, then the output fan lives in the subspace of the non-specialized coordinates. \end{description} {\subsection{gfan\_saturation}\label{applist:_saturation} This program computes the saturation of the input ideal with the product of the variables x\_1,...,x\_n. The ideal does not have to be homogeneous. \newline {\bf Options:} \begin{description} \item[-h]Tell the program that the input is a homogeneous ideal (with homogeneous generators). \item[-\hspace{0.013cm}-noideal]Do not treat input as an ideal but just factor out common monomial factors of the input polynomials.\end{description} {\subsection{gfan\_secondaryfan}\label{applist:_secondaryfan} This program computes the secondary fan of a vector configuration. The configuration is given as an ordered list of vectors. In order to compute the secondary fan of a point configuration an additional coordinate of ones must be added. For example \{(1,0),(1,1),(1,2),(1,3)\}. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-unimodular]Use heuristics to search for unimodular triangulation rather than computing the complete secondary fan\item[-\hspace{0.013cm}-scale value]Assuming that the first coordinate of each vector is 1, this option will take the polytope in the 1 plane and scale it. The point configuration will be all lattice points in that scaled polytope. The polytope must have maximal dimension. When this option is used the vector configuration must have full rank. This option may be removed in the future.\item[-\hspace{0.013cm}-restrictingfan value]Specify the name of a file containing a polyhedral fan in Polymake format. The computation of the Secondary fan will be restricted to this fan. If the -\hspace{0.013cm}-symmetry option is used then this restricting fan must be invariant under the symmetry and the orbits in the file must be with respect to the specified group of symmetries. The orbits of maximal cones of the file are then read in rather than the maximal cones. \item[-\hspace{0.013cm}-symmetry]Tells the program to read in generators for a group of symmetries (subgroup of $S\_n$) after having read in the vector configuration. The program checks that the configuration stays fixed when permuting the variables with respect to elements in the group. The output is grouped according to the symmetry. \item[-\hspace{0.013cm}-nocones]Tells the program not to output the CONES and MAXIMAL\_CONES sections, but still output CONES\_COMPRESSED and MAXIMAL\_CONES\_COMPRESSED if -\hspace{0.013cm}-symmetry is used.\item[-\hspace{0.013cm}-interrupt value]Interrupt the enumeration after a specified number of facets have been computed (works for usual symmetric traversals, but may not work in general for non-symmetric traversals or for traversals restricted to fans).\end{description} {\subsection{gfan\_stats}\label{applist:_stats} This program takes a list of reduced Gr\"obner bases for the same ideal and computes various statistics. The following information is listed: the number of bases in the input, the number of variables, the dimension of the homogeneity space, the maximal total degree of any polynomial in the input and the minimal total degree of any basis in the input, the maximal number of polynomials and terms in a basis in the input. {\subsection{gfan\_substitute}\label{applist:_substitute} This program changes the variable names of a polynomial ring. The input is a polynomial ring, a polynomial set in the ring and a new polynomial ring with the same coefficient field but different variable names. The output is the polynomial set written with the variable names of the second polynomial ring. Example: Input: Q[a,b,c,d]\{2a-3b,c+d\}Q[b,a,c,x] Output: Q[b,a,c,x]\{2*b-3*a,c+x\} {\subsection{gfan\_symmetries}\label{applist:_symmetries} This program computes the symmetries of a polynomial ideal. The program is slow, so think before using it. Use -\hspace{0.013cm}-symmetry to give hints about which subgroup of the symmetry group could be useful. The program checks each element of the specified subgroup to see if it preserves the ideal. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-symmetry]Specify subgroup to be searched for permutations keeping the ideal fixed.\item[-\hspace{0.013cm}-symsigns]Specify for each generator of the group specified wiht -\hspace{0.013cm}-symmetry an element of $\{-1,+1\}^n$ which by its multiplication on the variables together with the permutation is expected to keep the ideal fixed.\end{description} {\subsection{gfan\_tolatex}\label{applist:_tolatex} This program converts ASCII math to TeX math. The data-type is specified by the options. \newline {\bf Options:} \begin{description} \item[-h]Add a header to the output. Using this option the output will be LaTeXable right away.\item[-\hspace{0.013cm}-polynomialset\_]The data to be converted is a list of polynomials.\item[-\hspace{0.013cm}-polynomialsetlist\_]The data to be converted is a list of lists of polynomials.\end{description} {\subsection{gfan\_topolyhedralfan}\label{applist:_topolyhedralfan} This program takes a list of reduced Gr\"obner bases and produces the fan of all faces of these. In this way by giving the complete list of reduced Gr\"obner bases, the Gr\"obner fan can be computed as a polyhedral complex. The option -\hspace{0.013cm}-restrict lets the user choose between computing the Gr\"obner fan or the restricted Gr\"obner fan. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-restrict]Add an inequality for each coordinate, so that the the cones are restricted to the non-negative orthant.\item[-\hspace{0.013cm}-symmetry]Tell the program to read in generators for a group of symmetries (subgroup of $S\_n$) after having read in the ring. The output is grouped according to these symmetries. Only one representative for each orbit is needed on the input. \end{description} {\subsection{gfan\_tropicalbasis}\label{applist:_tropicalbasis} This program computes a tropical basis for an ideal defining a tropical curve. Defining a tropical curve means that the Krull dimension of R/I is at most 1 + the dimension of the homogeneity space of I where R is the polynomial ring. The input is a generating set for the ideal. If the input is not homogeneous option -h must be used. \newline {\bf Options:} \begin{description} \item[-h]Homogenise the input before computing a tropical basis and dehomogenise the output. This is needed if the input generators are not already homogeneous.\end{description} {\subsection{gfan\_tropicalbruteforce}\label{applist:_tropicalbruteforce} This program takes a marked reduced Gr\"obner basis for a homogeneous ideal and computes the tropical variety of the ideal as a subfan of the Gr\"obner fan. The program is slow but works for any homogeneous ideal. If you know that your ideal is prime over the complex numbers or you simply know that its tropical variety is pure and connected in codimension one then use gfan\_tropicalstartingcone and gfan\_tropicaltraverse instead. {\subsection{gfan\_tropicalcurve}\label{applist:_tropicalcurve} This program computes a tropical basis for an ideal defining a tropical curve. Defining a tropical curve means that the Krull dimension of R/I is at most 1 + the dimension of the homogeneity space of I where R is the polynomial ring. The input is a generating set for the ideal. If the input is not homogeneous option -h must be used. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-singleray]Only compute a single ray of the curve.\item[-\hspace{0.013cm}-parameters value]With this option you can specify how many variables to treat as parameters instead of variables. This makes it possible to do computations where the coefficient field is the field of rational functions in the parameters.\end{description} {\subsection{gfan\_tropicalevaluation}\label{applist:_tropicalevaluation} This program evaluates a tropical polynomial function in a given set of points. {\subsection{gfan\_tropicalfunction}\label{applist:_tropicalfunction} This program takes a polynomial and tropicalizes it. The output is piecewise linear function represented by a fan whose cones are the linear regions. Each ray of the fan gets the value of the tropical function assigned to it. In other words this program computes the normal fan of the Newton polytope of the input polynomial with additional information.\newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-exponents]Tell program to read a list of exponent vectors instead.\end{description} {\subsection{gfan\_tropicalhypersurface}\label{applist:_tropicalhypersurface} This program computes the tropical hypersurface defined by a principal ideal. The input is the polynomial ring followed by a set containing just a generator of the ideal. {\subsection{gfan\_tropicalintersection}\label{applist:_tropicalintersection} This program computes the set theoretical intersection of a set of tropical hypersurfaces (or to be precise, their common refinement as a fan). The input is a list of polynomials with each polynomial defining a hypersurface. Considering tropical hypersurfaces as fans, the intersection can be computed as the common refinement of these. Thus the output is a fan whose support is the intersection of the tropical hypersurfaces. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-tropicalbasistest]This option will test that the input polynomials for a tropical basis of the ideal they generate by computing the tropical prevariety of the input polynomials and then refine each cone with the Gr\"obner fan and testing whether each cone in the refinement has an associated monomial free initial ideal. If so, then we have a tropical basis and 1 is written as output. If not, then a zero is written to the output together with a vector in the tropical prevariety but not in the variety. The actual check is done on a homogenization of the input ideal, but this does not affect the result. (This option replaces the -t option from earlier gfan versions.) \item[-\hspace{0.013cm}-tplane]This option intersects the resulting fan with the plane x\_0=-1, where x\_0 is the first variable. To simplify the implementation the output is actually the common refinement with the non-negative half space. This means that "stuff at infinity" (where x\_0=0) is not removed.\item[-\hspace{0.013cm}-symmetryPrinting]Parse a group of symmetries after the input has been read. Used when printing with -\hspace{0.013cm}-incidence.\item[-\hspace{0.013cm}-symmetryExploit]Restrict computation to the closed lexicographic fundamental domain of the specified symmetry group. This overwrites -\hspace{0.013cm}-restrict.\item[-\hspace{0.013cm}-nocones]Tells the program not to output the CONES and MAXIMAL\_CONES sections, but still output CONES\_COMPRESSED and MAXIMAL\_CONES\_COMPRESSED if -\hspace{0.013cm}-symmetry is used.\item[-\hspace{0.013cm}-restrict]Restrict the computation to a full-dimensional cone given by a list of marked polynomials. The cone is the closure of all weight vectors choosing these marked terms.\item[-\hspace{0.013cm}-stable]Find the stable intersection of the input polynomials using tropical intersection theory. This can be slow. Most other options are ignored.\item[-\hspace{0.013cm}-parameters value]With this option you can specify how many variables to treat as parameters instead of variables. This makes it possible to do computations where the coefficient field is the field of rational functions in the parameters.\end{description} {\subsection{gfan\_tropicallifting}\label{applist:_tropicallifting} This program is part of the Puiseux lifting algorithm implemented in Gfan and Singular. The Singular part of the implementation can be found in: Anders Nedergaard Jensen, Hannah Markwig, Thomas Markwig: tropical.lib. A SINGULAR 3.0 library for computations in tropical geometry, 2007 See also http://www.mathematik.uni-kl.de/\~{}keilen/de/tropical.html and the paper Jensen, Markwig, Markwig: "An algorithm for lifting points in a tropical variety". Example: Run Singular from the directory where tropical.lib is located. Give the following sequence of commands to Singular: LIB "tropical.lib"; ring R=0,(t,x,y,z),dp; ideal i=-y2t4+x2,yt3+xz+y; intvec w=1,-2,0,2; list L=tropicallifting(i,w,3); displaytropicallifting(L,"subst"); This produces a Puiseux series solution to i with valuation (2,0,-2) \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-noMult]Disable the multiplicity computation.\item[-n value]Number of variables that should have negative weight.\item[-c]Only output a list of vectors being the possible choices.\end{description} {\subsection{gfan\_tropicallinearspace}\label{applist:_tropicallinearspace} This program generates tropical equations for a tropical linear space in the Speyer sense given the tropical Pluecker coordinates as input. \newline {\bf Options:} \begin{description} \item[-d value]Specify d.\item[-n value]Specify n.\item[-\hspace{0.013cm}-trees]list the boundary trees (assumes d=3)\end{description} {\subsection{gfan\_tropicalmultiplicity}\label{applist:_tropicalmultiplicity} This program computes the multiplicity of a tropical cone given a marked reduced Gr\"obner basis for its initial ideal. {\subsection{gfan\_tropicalprevariety}\label{applist:_tropicalprevariety} This program computes the tropical prevariety of a set of polynomials. The program works in two different modes. By default the coefficient field is regarded as having trivial valuation and the output is a polyhedral fan. With the option -\hspace{0.013cm}-usevaluation the program uses the valuation of the given coefficient field when defining the tropical prevariety. As a consequence the output in this case is a polyhedral complex represented by the half-open polyhedral fan over it. It is often useful to use the field Q(t). However, because of the limitations of the current parser, the way to specify elements of for example Q(t)[x1,x2] is to write them as polynomials in Q[t,x1,x2]. When -\hspace{0.013cm}-usevaluation is used the options -\hspace{0.013cm}-mint and -\hspace{0.013cm}-minx can switch the program from max to min convention. In particular, using both -\hspace{0.013cm}-mint and -\hspace{0.013cm}-minx switches conventions to the [Speyer,Sturmfels]/[Maclagan,Sturmfels] convention. Example: ./gfan \_tropicalprevariety -j32 -\hspace{0.013cm}-usevaluation -\hspace{0.013cm}-bits64 with input: Q(t)[x,y]\{1+t*x+x+y\} produces a polyhedral complex.\newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-saveas value]Specify filename for saving intermediate result.\item[-\hspace{0.013cm}-loadfrom value]Specify filename for loading intermediate result.\item[-j value]Number of threads\item[-\hspace{0.013cm}-bits value]Number of bits used in intermediate integer type. Allowed values are 64, 32 and 0 for arbitrary precision. In the postprocessing step the computed prevariety is converted in arbitrary precission.\item[-\hspace{0.013cm}-usevaluation]Use valuations in the defintion of the tropical hypersurfaces. The used valuation comes from the ring specified. For example Q(t) will come with its usual valuation. In order to represent the output an additional 0th coordinate is introduced.\item[-\hspace{0.013cm}-mint]In a field with parameter t this option decides if maximal or minimal degrees of t determine the valuation.\item[-\hspace{0.013cm}-minx]Switch the programme to min convention for the variables.\end{description} {\subsection{gfan\_tropicalrank}\label{applist:_tropicalrank} This program will compute the tropical rank of matrix given as input. Tropical addition is MAXIMUM. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-kapranov]Compute Kapranov rank instead of tropical rank.\item[-\hspace{0.013cm}-determinant]Compute the tropical determinant instead.\end{description} {\subsection{gfan\_tropicalstartingcone}\label{applist:_tropicalstartingcone} This program computes a starting pair of marked reduced Gr\"obner bases to be used as input for gfan\_tropicaltraverse. The input is a homogeneous ideal whose tropical variety is a pure d-dimensional polyhedral complex. \newline {\bf Options:} \begin{description} \item[-g]Tell the program that the input is already a reduced Gr\"obner basis.\item[-d]Output dimension information to standard error.\item[-\hspace{0.013cm}-stable]Find starting cone in the stable intersection or, equivalently, pretend that the coefficients are genereric.\end{description} {\subsection{gfan\_tropicaltraverse}\label{applist:_tropicaltraverse} This program computes a polyhedral fan representation of the tropical variety of a homogeneous prime ideal $I$. Let $d$ be the Krull dimension of $I$ and let $\omega$ be a relative interior point of $d$-dimensional Gr\"obner cone contained in the tropical variety. The input for this program is a pair of marked reduced Gr\"obner bases with respect to the term order represented by $\omega$, tie-broken in some way. The first one is for the initial ideal $in\_\omega(I)$ the second one for $I$ itself. The pair is the starting point for a traversal of the $d$-dimensional Gr\"obner cones contained in the tropical variety. If the ideal is not prime but with the tropical variety still being pure $d$-dimensional the program will only compute a codimension $1$ connected component of the tropical variety. \newline {\bf Options:} \begin{description} \item[-\hspace{0.013cm}-symmetry]Do computations up to symmetry and group the output accordingly. If this option is used the program will read in a list of generators for a symmetry group after the pair of Gr\"obner bases have been read. Two advantages of using this option is that the output is nicely grouped and that the computation can be done faster.\item[-\hspace{0.013cm}-symsigns]Specify for each generator of the symmetry group an element of $\{-1,+1\}^n$ which by its multiplication on the variables together with the permutation will keep the ideal fixed. The vectors are given as the rows of a matrix.\item[-\hspace{0.013cm}-nocones]Tells the program not to output the CONES and MAXIMAL\_CONES sections, but still output CONES\_ORBITS and MAXIMAL\_CONES\_ORBITS if -\hspace{0.013cm}-symmetry is used.\item[-\hspace{0.013cm}-disableSymmetryTest]When using -\hspace{0.013cm}-symmetry this option will disable the check that the group read off from the input actually is a symmetry group with respect to the input ideal. \item[-\hspace{0.013cm}-stable]Traverse the stable intersection or, equivalently, pretend that the coefficients are genereric.\item[-\hspace{0.013cm}-interrupt value]Interrupt the enumeration after a specified number of facets have been computed (works for usual symmetric traversals, but may not work in general for non-symmetric traversals or for traversals restricted to fans).\end{description} {\subsection{gfan\_tropicalweildivisor}\label{applist:_tropicalweildivisor} This program computes the tropical Weil divisor of piecewise linear (or tropical rational) function on a tropical k-cycle. See the Gfan manual for more information. \newline {\bf Options:} \begin{description} \item[-i1 value]Specify the name of the Polymake input file containing the k-cycle.\item[-i2 value]Specify the name of the Polymake input file containing the piecewise linear function.\end{description} {\subsection{gfan\_version}\label{applist:_version} This program writes out version information of the Gfan installation. gfan0.8beta/doc/defines.tex0000664000175000017500000000411115177170257015304 0ustar andersanders\documentclass[12pt,a4paper,dvips,openright]{article} %\usepackage{amsmath, amsthm} \usepackage{theorem} \usepackage[english]{babel} %\usepackage{fontenc} %\usepackage{t1enc} \usepackage{a4} \usepackage{epsfig} \usepackage{amsfonts} \usepackage{latexsym} \usepackage{alltt} \usepackage{url} \usepackage{color} \usepackage[normalem]{ulem} %%\usepackage{html} %%\usepackage{showlabels} \usepackage{hyperref} %\theoremstyle{remark} \newtheorem{theorem}{Theorem}[section] \newtheorem{lemma}[theorem]{Lemma} \newtheorem{proposition}[theorem]{Proposition} \newtheorem{corollary}[theorem]{Corollary} \newtheorem{algorithm}[theorem]{Algorithm} \theorembodyfont{\rmfamily} \newtheorem{definition}[theorem]{Definition} \newtheorem{remark}[theorem]{Remark} \theorembodyfont{\rmfamily} \newtheorem{example}[theorem]{Example} \newenvironment{proof}[1][\it Proof.]{\begin{trivlist}\item[\hskip \labelsep {\bfseries #1}]}{$_\Box$\end{trivlist}} \newcommand{\N}{\ensuremath{\mathbb{N}}} \newcommand{\Z}{\ensuremath{\mathbb{Z}}} \newcommand{\Q}{\ensuremath{\mathbb{Q}}} \newcommand{\R}{\ensuremath{\mathbb{R}}} \newcommand{\A}{\ensuremath{\mathcal{A}}} \newcommand{\F}{\ensuremath{\mathcal{F}}} \newcommand{\G}{\ensuremath{\mathcal{G}}} \newcommand{\T}{\ensuremath{ \mathcal{T} }} \newcommand{\K}{\ensuremath{\mathcal{K}}} \newcommand{\C}{\ensuremath{\mathcal{C}}} \newcommand{\CC}{\ensuremath{\mathbb{C}}} \newcommand{\TT}{\ensuremath{\mathbb{T}}} %\newcommand{\k}{\ensuremath{{k}}} %\newcommand{\t}{\ensuremath{{t}}} \newcommand{\x}{\ensuremath{{x}}} \newcommand{\init}{\textup{in}} \newcommand{\tinit}{\textup{t-in}} \newcommand{\homog}{\textup{homog}} \newcommand{\spann}{\textup{span}} \newcommand{\flip}{\textup{flip}} \newcommand{\face}{\textup{face}} \newcommand{\supp}{\textup{supp}} \newcommand{\val}{\textup{val}} \newcommand{\rank}{\textup{rank}} \newcommand{\conv}{\textup{conv}} \newcommand{\minAss}{\textup{minAss}} \newcommand{\Ass}{\textup{Ass}} \newcommand{\relint}{\textup{rel int}} \newcommand{\New}{\textup{New}} \newcommand{\codim}{\textup{codim}} \newcommand{\puiseux}{{\ensuremath{\CC\{\{t\}\}} }} gfan0.8beta/doc/Makefile0000664000175000017500000000014215177170257014605 0ustar andersandersall: latex manual.tex bibtex manual dvips manual.dvi -omanual.ps dvipdf manual.dvi manual.pdf gfan0.8beta/doc/installation.tex0000664000175000017500000003523215177170257016400 0ustar andersanders\newpage \section{Installation} In some situations installation of Gfan is easy while in other situations it can be very complicated. If you are satisfied with an old version of Gfan, then you might just use the package manager on the system. If you are using Linux and have root-access then the following might work \begin{verbatim} sudo apt-get install gfan \end{verbatim} or \begin{verbatim} sudo emerge gfan \end{verbatim} depending on your distribution and package manager. If you succeed, it is good to know which version was installed. Run \begin{verbatim} gfan _version \end{verbatim} Should this command fail, then you are using an old version of gfan. %If you are using MacOS the easiest way to install Gfan is to use precompiled executables: go to the Gfan webpage, go to the binaries.html subpage, and follow the instructions there. As an alternative to using package managers as above you can try to locate an executable file named ``gfan'' in the installation of other math software. SageMath, for example, contains a gfan executable. You also have the possibility of installing a precompiled executables: go to the Gfan webpage, go to the binaries.html subpage, and follow the instructions there. There is however only very few executables available. %% Rewrite this section. %% The apt-get linux trouble disappears if all includes of cdd files are of form ``cdd/set\_oper.h''. Now of course if we cannot run apt-get because we are not root we need to install cddlib manually. Here we should use configure to specify how that is done correctly. We should use --prefix=, --includedir=, and possibly --libdir=. %% The same thing goes for gmp???? EXCEPT THAT FOR SOME REASON gmp is allowed to be in /usr/include . %% Here is a good phrase: ``If you have root access to your maching and are running a linux system with a package manager you may install gmp and cddlib in one go by doing %% sudo apt-get install libcdd-dev %% Now go to Section ???'' %% \label{sec:installation} %% If you are using Linux the following might work %% \begin{verbatim} %% sudo apt-get install gfan %% \end{verbatim} %% or %% \begin{verbatim} %% sudo emerge gfan %% \end{verbatim} %% depending on your distribution and package manager. If you succeed, it is good to know which version was installed. Run %% \begin{verbatim} %% gfan _version %% \end{verbatim} %% Should this command fail, then you are using an old version of gfan. The rest of this section eplains how to install Gfan by compiling it from source on a Linux/Unix-like system with a modern version of gcc. You must already have this compiler installed on your system to follow the instructions. \name has been compiled successfully with gcc version~11.2.0. {\bf Two libraries are needed in order to compile \name: {cddlib} and { gmp}.} Users of Microsoft Windows may be able to use these installation instructions if they first install Cygwin. A new feature in \name version 0.4 is the possibility to link to the SoPlex \cite{wunderling} library. This does not add to the functionality of \name but improves speed of the polyhedral computations. In an attempt to keep the installation instructions simple, instructions for how to use SoPlex are given in a separate section, Subsection \ref{subsec:soplex}. {\color{red} If you are a lucky Linux user it will suffice to follow the red part of these instructions.} \subsection{Installation of the gmp library} GMP stands for GNU Multi Precision arithmetic library. This library must be installed on your system before you can install cddlib and gfan. %With the %current {\tt Makefile} of \name gmp must have been installed by the %root superuser. {\color{red} {\bf On some GNU/Linux systems the library is already installed.}} %"sudo apt install libgmp-dev" worked on ubuntu May 26th 2025 %\name can be compiled with gmp version 4.1.2. If your system does not already have gmp installed (which is the case if you have a usual Mac OS X installation) follow the directions in this section. \vspace{0.3cm} IF YOU ARE USING Mac OS X AND YOU ARE NOT AN EXPERT FOLLOW THE INSTRUCTIONS IN SECTION~\ref{sec:fink} INSTEAD. \vspace{0.3cm} \noindent Make a new directory and download {\tt gmp-4.2.2.tar.gz} from \centerline{\tt http://gmplib.org/} \noindent for example by typing \begin{verbatim} cd ~ mkdir tempdir cd tempdir wget http://ftp.sunet.se/pub/gnu/gmp/gmp-4.2.2.tar.gz \end{verbatim} Extract the file and go to the thereby created directory: \begin{verbatim} tar -xzvf gmp-4.2.2.tar.gz cd gmp-4.2.2 \end{verbatim} Run the configure script and specify the installation directory: \begin{verbatim} ./configure --prefix=$HOME/gfan/gmp \end{verbatim} %$ The above line specifies the installation directory which in this case will be the folder {\tt gfan/gmp} in your home directory. If you already have a directory by that name its content may be destroyed by the subsequent commands. Compile the gmp library and install it: \begin{verbatim} make make install \end{verbatim} Finally, a very important step when working with gmp: Let the program perform a self-test: \begin{verbatim} make check \end{verbatim} The gmp installation is now complete. The gmp files can be found in your home directory under {\tt gfan/gmp}. \subsubsection{Installing the gmp library on Mac OS X using fink} \label{sec:fink} {\bf This subsubsection might very well be outdated.}\\ Current versions of Mac OS X and the gmp library have a compatibility problem causing gmp to be compiled with errors if compiled without modifications. There exist packages of gmp for Mac OS X on the internet which have been compiled incorrectly. We recommend that Mac OS users use the packages provided by fink. \vspace{0.3cm} \noindent Install fink by following the instructions given on the page \centerline{\tt http://www.finkproject.org/download/index.php?phpLang=en} \noindent Having installed fink now simply type \begin{verbatim} fink install gmp \end{verbatim} The gmp library is now installed in the directory {\tt /sw}. \subsection{Installation of the cddlib library} % 2025, Jan 21: sudo apt install libcdd-dev (this will make old compilation run) Cddlib \cite{cdd} is a library for doing exact polyhedral computations, including solving linear programming problems. \name can be compiled with cddlib version 094. Older versions of cddlib will not work with \name version 0.2 or later. % The library can be installed %anywhere in the file system, so superuser access is not needed. Notice that cddlib itself needs gmp to compile. We give instructions on how to install cddlib. % If this does not work have a look in the cddlib manual. \vspace{0.3cm} \noindent \color{red} Make a directory for the compilation process if you did not do that already: \begin{verbatim} cd ~ mkdir tempdir cd tempdir \end{verbatim} \noindent Download the file {\tt cddlib-094i.tar.gz} from \begin{verbatim} https://people.inf.ethz.ch/fukudak/cdd_home/Cddtarfiles_pub/ \end{verbatim} % https://people.inf.ethz.ch/fukudak/cdd_home/ % http://www.ifor.math.ethz.ch/~fukuda/cdd_home/cdd.html % http://www.cs.mcgill.ca/~fukuda/soft/cdd_home/cdd.html into that directory. Decompress the file and change directory to the directory being created: \begin{verbatim} tar -xzvf cddlib-094i.tar.gz cd cddlib-094i \end{verbatim} Run the configure script. \color{black} Here you have the chance of telling cddlib where to find gmp and where to install itself. \begin{verbatim} ./configure --prefix="$HOME/gfan/cddlib" CFLAGS="-I$HOME/gfan/gmp/include -L$HOME/gfan/gmp/lib" \end{verbatim} %$ (On a single line). The above options say that cddlib should be installed in your home directory under {\tt gfan/cddlib} and where to look for gmp. If gmp was installed by fink (see Section~\ref{sec:fink}) you should run \begin{verbatim} ./configure --prefix="$HOME/gfan/cddlib" CFLAGS="-I/sw/include -L/sw/lib" \end{verbatim} instead. {\bf If gmp was already installed on your system in its default location run} \color{red} \begin{verbatim} ./configure --prefix="$HOME/gfan/cddlib" \end{verbatim} \color{black} %$ The content of {\tt gfan/cddlib} might be destroyed by the subsequent commands. Compile and install cddlib: \color{red} \begin{verbatim} make make install \end{verbatim} \color{black} You can now find the installed cddlib library files in your home directory under {\tt gfan/cddlib}. \noindent If you had super user access you could also just have run \begin{verbatim} ./configure \end{verbatim} when you configured cddlib. This would cause cddlib to be installed in its default place. \subsection{\name installation} \label{subsec:installation} \color{red} Download the file {\tt \nameversion .tar.gz} from the \name homepage located at: % \centerline{\tt http://www.soopadoopa.dk/anders/gfan/gfan.html.} % \centerline{\tt http://home.imf.au.dk/ajensen/software/gfan/gfan.html} \begin{verbatim} http://home.math.au.dk/jensen/software/gfan/gfan.html \end{verbatim} to your folder {\texttt tempdir}. \noindent Extract the file and enter the new directory by typing \begin{alltt} cd ~ cd tempdir tar -xzvf \nameversion.tar.gz cd \nameversion \end{alltt} \color{black} Gfan does not have a configure script, so you tell Gfan where to find gmp and cdd when you compile the program. For example you should type \begin{verbatim} make \end{verbatim} or \color{red} \begin{verbatim} make cddpath=$HOME/gfan/cddlib \end{verbatim} \color{black} %$ or \begin{verbatim} make cddpath=$HOME/gfan/cddlib gmppath=$HOME/gfan/gmp \end{verbatim} %$ or \begin{verbatim} make cddpath=$HOME/gfan/cddlib gmppath=/sw \end{verbatim} %$ depending on where you installed the libraries to compile the program. If the compiler complains about not being able to find include files when compiling, doing \begin{verbatim} make cddnoprefix=true \end{verbatim} might help. If you managed to compile and produce the file ``gfan'' you may wish to test the compiled \name before installing: \begin{verbatim} ./gfan _test \end{verbatim} The final step is to install the compiled program. Type \color{red} \begin{verbatim} make PREFIX=$HOME/gfan install \end{verbatim} %$ \color{black}or \begin{verbatim} make install \end{verbatim} depending on where you want Gfan installed. (The second line attempts to install it in {\tt /usr/local} by default). If you chose to install in the directory {\tt gfan} in your home folder \color{red}you will now find the file {\tt gfan} in the subdirectory {\tt gfan/bin} of your home folder together with a set of symbolic links\color{black}, for example {\tt gfan\_buchberger}. You can go to the subdirectory and type {\tt ./\exename{} --help} and {\tt ./\exename{}\_buchberger --help} in the shell to test them. Or you can ask Gfan to compute the reduced Gr\"obner bases of an ideal by typing \begin{alltt} ./\exename{}\_bases \end{alltt} followed by, for example, \begin{verbatim} Q[a,b,c] {a^3+b^2c-a,c^2-2/3b} \end{verbatim} \begin{remark} If for some reason you did get {\tt gfan} compiled but did not get the symbolic links made like {\tt gfan\_buchberger} you can still run that program by typing {\tt gfan \_buchberger} instead of {\tt gfan\_buchberger}. \end{remark} \subsection{SoPlex (for the advanced user only)} \label{subsec:soplex} {\bf These instructions do not work for linking with new versions of SoPlex.} Linking Gfan to SoPlex can lead to huge performance improvements. Notice however, that the strict license of SoPlex propagates through the software to your paper, requiring that you cite SoPlex appropriately if you choose to publish results based on SoPlex. Furthermore, with the standard SoPlex license you are only allowed to use SoPlex for non-commercial, academic work. Download SoPlex here (version 1.3.2 has been used successfully): \begin{verbatim} http://soplex.zib.de/download.shtml \end{verbatim} After download, follow the installation instructions \begin{verbatim} http://www.zib.de/Optimization/Software/Soplex/html/INST.html \end{verbatim} After having installed SoPlex, you must tell \name where SoPlex is located. Do this by editing the lines \begin{footnotesize} \begin{verbatim} SOPLEX_PATH = $(HOME)/math/software/soplex-1.3.2 SOPLEX_LINKOPTIONS = -lz $(SOPLEX_PATH)/lib/libsoplex.darwin.x86.gnu.opt.a \end{verbatim} \end{footnotesize} of the file \texttt{Makefile} in your \name directory. Most likely you need to change \texttt{darwin} to \texttt{linux} in the last line. Finally you need to recompile \name. First run \texttt{make clean} and then \texttt{make} with the options from Subsection~\ref{subsec:installation} together with the option \texttt{soplex=true}. Then do a \texttt{make install} as described in Subsection~\ref{subsec:installation}. %Please keep on reading --- in the next section we will see how to install all the additional \name programs. %\subsection{Installation to invoke additional features} %If you have root access to the system it is recommended that you type %\begin{verbatim} %make install %\end{verbatim} %in your shell after having compiled \name. This will copy the file {\tt \exename} to the directory {\tt /usr/local/bin} and \name will now be accessible from any directory and by any user by typing %\begin{alltt} %\exename %\end{alltt} %The {\tt make install} step above also creates symbolic links for the additional programs included in \name (like {\tt \exename \_buchberger} or {\tt \exename \_render}). If you chose not to run {\tt make install} you can install the additional programs in \name by typing %\begin{alltt} %./\exename installlinks %\end{alltt} %This will create a set of symbolic links to {\tt \exename} in the current directory. Invoking {\tt \exename} with one of these new names will have a different meaning. For example you may use {\tt \exename \_buchberger} to compute a single Gr\"obner basis. These programs have a help file which can be displayed by invoking the programs with the option {\tt --help}. The contents of the help files are also listed in Section \ref{sec:applist}. %\subsection{MacOS} %\subsubsection{Installing gmp from source} %\subsubsection{Installing with fink} %\begin{description} %\item{gmp} dgdgdfdg %\item{cddlib} %Download the file {\tt cddlib-094b.tar.gz} from %\begin{verbatim} %http://www.cs.mcgill.ca/~fukuda/soft/cdd_home/cdd.html %\end{verbatim} %into a directory. Decompress the file using {\tt gzip -d % cddlib-094b.tar.gz} and extract the tar archive using {\tt tar -xvf % cddlib-094b.tar}. Change directory to the newly created directory %{\tt cddlib-094b} and run %\begin{verbatim} %./configure --prefix="$HOME/cddlib" CFLAGS="-I/sw/include -L/sw/lib" %\end{verbatim} %When the following command is run the directory ``cddlib'' is created in your home directory. If it already exists the directory is destroyed. %\begin{verbatim} %make install %\end{verbatim} %\end{description} %\begin{center} % {\bf The complete list of functionalities available in CaTS and the % programs they need are listed at the end of the manual.} %\end{center} gfan0.8beta/src/0000775000175000017500000000000015177170257013172 5ustar andersandersgfan0.8beta/src/gfanlib_symmetry.h0000664000175000017500000001104715177170257016721 0ustar andersanders/* * gfan_symmetry.h * * Created on: Oct 22, 2010 * Author: anders */ #ifndef GFANLIB_SYMMETRY_H_INCLUDED #define GFANLIB_SYMMETRY_H_INCLUDED #include #include "gfanlib_vector.h" #include "gfanlib_matrix.h" namespace gfan{ /** * The permutation class represents an element in the symmetric group S_n. */ class Permutation:public IntVector { // IntVector data; public: /** * Returns true if a contains the elements from 0 up to a.size()-1. */ static bool isPermutation(IntVector const &a); /** * Returns true if all rows of the matrix contains the elements 0 up to m.getWidth()-1. */ static bool arePermutations(IntMatrix const &m); /** * Generates the identity permutation on n elements. */ Permutation(int n): IntVector(n) { for(int i=0;i Vector apply(Vector const &v)const { Vector ret(size()); assert(size()==v.size()); for(unsigned i=0;i ElementContainer; ElementContainer elements;//Make this private int size()const { return elements.size(); } int sizeOfBaseSet()const; /** The set of vectors which cannot be improved lexicographically by applying an element from the group is a convex set. Its closure is a polyhedral cone. This routine returns a set of inequalities The returned list does not contain the zero vector. */ ZMatrix fundamentalDomainInequalities()const; SymmetryGroup(int n); void computeClosure(Permutation const &v); void computeClosure(IntMatrix const &l); IntMatrix getGenerators()const; int orbitSize(ZVector const &stable)const; bool isTrivial()const; /** The symmetry group acts on vectors by permuting the entries. The following routine returns a unique representative for the orbit containing v. This makes it easy to check if two elements are in the same orbit. The permutation used to get this representative is stored in *usedPermutation (if pointer not 0). */ ZVector orbitRepresentative(ZVector const &v, Permutation *usedPermutation=0)const; template Vector orbitRepresentative(Vector const &v, Permutation *usedPermutation=0)const; // ZVector orbitRepresentative<>(ZVector const &v, Permutation *usedPermutation=0)const; /** This routine works as orbitRepresentative() except that the symmetry group considered is only the subgroup keeping the vector fixed fixed. */ ZVector orbitRepresentativeFixing(ZVector const &v, ZVector const &fixed)const; // Methods for highly optimized symmetry group computations: void createTrie(); }; /** * Sorts v and returns the number of swaps performed. */ int mergeSort(IntVector &v); } #endif /* GFAN_SYMMETRY_H_ */ gfan0.8beta/src/macaulay2.cpp0000664000175000017500000000732115177170257015557 0ustar andersanders#include "macaulay2.h" #include #include #include "printer.h" #include "parser.h" #include "programs.h" //-------------------------------------------------- // Pipe //-------------------------------------------------- Pipe::Pipe() { int r; r=pipe(fdM2Input); assert(r==0); r=pipe(fdM2Output); assert(r==0); int pid1=fork(); if(pid1==0)//child { fprintf(stderr,"Child\n"); int r; r=dup2(fdM2Input[0],fileno(stdin)); assert(r>=0); r=dup2(fdM2Output[1],fileno(stdout)); assert(r>=0); static char M2Name[1024]; sprintf(M2Name,"%s",programNameM2);//"M2"; char *argv[2]; argv[0]=M2Name; argv[1]=0; execvp(argv[0], argv); assert(0); } else //parent { fprintf(stderr,"Parent\n"); pipeInput=fdopen(fdM2Input[1],"w"); assert(pipeInput); pipeOutput=fdopen(fdM2Output[0],"r"); assert(pipeOutput); } } Pipe::~Pipe() { //fclose? fclose(pipeInput); fclose(pipeOutput); } //-------------------------------------------------- // Macaulay2Pipe //-------------------------------------------------- Macaulay2Pipe::Macaulay2Pipe(): printer(pipeInput) { readLine(); } Macaulay2Pipe::~Macaulay2Pipe() { fprintf(pipeInput,"exit\n"); /* while(!feof(pipeOutput)) { fprintf(stdout,"%c ",(getc(pipeOutput))); } */ } void Macaulay2Pipe::skipStartOfLine() { int c; do { c=fgetc(pipeOutput); if(c==EOF) { fprintf(stderr,"EOF\n"); } // fprintf(stderr,"skipStartOfLine c=\'%c\',%i\n",c,c); } while(c!='='); } char *Macaulay2Pipe::readLine() { static char line[2048]; fgets(line,2048,pipeOutput); assert(line[strlen(line)-1]=='\n'); // fprintf(stderr,"readLine:%s",line); return line; } int Macaulay2Pipe::readInt() { char *line=readLine(); while(*line!=0 && *line!='=')line++; assert(*line!=0); int ret; sscanf(line+1,"%i",&ret); return ret; } bool Macaulay2Pipe::readBool() { char *line=readLine(); while(*line!=0 && *line!='=')line++; assert(*line!=0); int ret; return 'f'!=line[2]; } int Macaulay2Pipe::getPdimCokerGensMonomial(gbasis const &monomialIdeal) { fprintf(pipeInput,"pdim coker gens monomialIdeal "); printer.printMonomialIdeal(monomialIdeal); fprintf(pipeInput,"\n"); fflush(pipeInput); readLine(); readLine(); int pdim=readInt(); readLine(); return pdim; } bool Macaulay2Pipe::isHomogeneousIdeal(gbasis &ideal) { fprintf(pipeInput,"isHomogeneous ideal "); printer.printGroebnerBasis(ideal); fprintf(pipeInput,"\n"); fflush(pipeInput); readLine(); readLine(); int pdim=readBool(); readLine(); return pdim; } void Macaulay2Pipe::setPolynomialRing(int numberOfVariables) { fprintf(pipeInput,"R = ZZ/32003["); if(numberOfVariables>26) { fprintf(stderr,"Variable index out of range!\n"); assert(0); } for(int i=0;isize()); } StandardPairList Macaulay2Pipe::standardPairs(gbasis &monomialIdeal) { assert(monomialIdeal.begin()!=monomialIdeal.end()); StandardPairList s; setPolynomialRing(monomialIdeal); fprintf(pipeInput,"toString standardPairs monomialIdeal "); printer.printMonomialIdeal(monomialIdeal); fprintf(pipeInput,"\n"); fflush(pipeInput); skipStartOfLine(); // skipStartOfLine(); return FileParser(pipeOutput).parseStandardPairList(monomialIdeal.begin()->size()); } gfan0.8beta/src/polyhedralfan.cpp0000664000175000017500000016747615177170257016553 0ustar andersanders#include #include "polyhedralfan.h" #include "reversesearch.h" #include "wallideal.h" #include "buchberger.h" #include "printer.h" #include "timer.h" #include "symmetry.h" #include "polymakefile.h" #include "symmetriccomplex.h" #include "linalg.h" #include "lp.h" #include "codimoneconnectedness.h" #include "symmetrictraversal.h" #include "traverser_groebnerfan.h" #include "tropical2.h" #include "log.h" static Timer polyhedralFanRefinementTimer("Polyhedral fan refinement",1); PolyhedralFan::PolyhedralFan(int ambientDimension): n(ambientDimension) { } PolyhedralFan PolyhedralFan::fullSpace(int n) { PolyhedralFan ret(n); PolyhedralCone temp(n); temp.canonicalize(); ret.cones.insert(temp); return ret; } PolyhedralFan PolyhedralFan::halfSpace(int n, int i) { assert(0<=i); assert(ibegin()->getMarked().m.exponent.subvector(0,p1.getNumberOfVariables())); // c.setMultiplicity(gcdOfVector(j->subvector(0,j->size()-1))); Polynomial temp=initialForm(p1,c.getRelativeInteriorPoint()); Polynomial temp1=initialForm(temp,j->subvector(0,j->size()-1)); Polynomial temp2=initialForm(temp,-j->subvector(0,j->size()-1)); temp1.mark(LexicographicTermOrder()); temp2.mark(LexicographicTermOrder()); c.setMultiplicity(gcdOfVector(temp1.getMarked().m.exponent-temp2.getMarked().m.exponent)); ret.cones.insert(c); } } } return ret; } PolyhedralFan PolyhedralFan::normalFanOfNewtonPolytope(Polynomial const &p1) { PolynomialRing theRing=p1.getRing(); PolynomialRing theSecondRing=theRing.withVariablesAppended("H"); Polynomial p=p1.homogenization(theSecondRing); PolyhedralFan ret(p1.getNumberOfVariables()); PolynomialSet g(theSecondRing); // PolynomialSet g(theRing);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! g.push_back(p); buchberger(&g,LexicographicTermOrder()); EnumerationTargetCollector gfan; /* {//old enumeration strategy LexicographicTermOrder myTermOrder; ReverseSearch rs(myTermOrder); rs.setEnumerationTarget(&gfan); rs.enumerate(g); } */ {//new enumeration strategy GroebnerFanTraverser traverser(g); traverser.setIsKnownToBeComplete(true); TargetGlue target(gfan); symmetricTraverse(traverser,target); } PolynomialSetList theList=gfan.getList(); for(PolynomialSetList::const_iterator i=theList.begin();i!=theList.end();i++) { IntegerVectorList inequalities=wallInequalities(*i); IntegerVectorList equalities; PolyhedralCone c=PolyhedralCone(inequalities,equalities).withLastCoordinateRemoved(); c.canonicalize(); c.setLinearForm(i->begin()->getMarked().m.exponent.subvector(0,c.ambientDimension())); ret.cones.insert(c); } return ret; } void PolyhedralFan::print(class Printer *p)const { p->printString("Printing PolyhedralFan"); p->printNewLine(); p->printString("Ambient dimension: "); p->printInteger(n); p->printNewLine(); p->printString("Number of cones: "); p->printInteger(cones.size()); p->printNewLine(); for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { p->printNewLine(); p->printPolyhedralCone(*i); } p->printString("Done printing PolyhedralFan."); p->printNewLine(); } int PolyhedralFan::getAmbientDimension()const { return n; } bool PolyhedralFan::isEmpty()const { return cones.empty(); } int PolyhedralFan::getMaxDimension()const { assert(!cones.empty()); return cones.begin()->dimension(); } int PolyhedralFan::getMinDimension()const { assert(!cones.empty()); return cones.rbegin()->dimension(); } PolyhedralFan refinement(const PolyhedralFan &a, const PolyhedralFan &b, int cutOffDimension, bool allowASingleConeOfCutOffDimension, bool stable) { //Josephine Yu contributed to this function. TimerScope ts(&polyhedralFanRefinementTimer); // fprintf(Stderr,"PolyhedralFan refinement: #A=%i #B=%i\n",a.cones.size(),b.cones.size()); int conesSkipped=0; int numberOfComputedCones=0; bool linealityConeFound=!allowASingleConeOfCutOffDimension; assert(a.getAmbientDimension()==b.getAmbientDimension()); PolyhedralFan ret(a.getAmbientDimension()); for(PolyhedralConeList::const_iterator A=a.cones.begin();A!=a.cones.end();A++) for(PolyhedralConeList::const_iterator B=b.cones.begin();B!=b.cones.end();B++) { PolyhedralCone c=intersection(*A,*B); int cdim=c.dimension(); // assert(cdim>=linealitySpaceDimension); bool thisIsLinealityCone=(cutOffDimension>=cdim); // if(((!thisIsLinealityCone)||(!linealityConeFound))&&((!stable)||(sum(*A,*B).dimension()==c.ambientDimension()))) /* if(((!thisIsLinealityCone)||(!linealityConeFound))&&((!stable)|| (rank(combineOnTop(rowsToIntegerMatrix(A->generatorsOfSpan(),c.ambientDimension()), rowsToIntegerMatrix(B->generatorsOfSpan(),c.ambientDimension())))==c.ambientDimension()))) */ if(((!thisIsLinealityCone)||(!linealityConeFound))&&((!stable)|| (A->dimension()+B->dimension()+::rank(combineOnTop(rowsToIntegerMatrix(A->getImpliedEquations(),c.ambientDimension()), rowsToIntegerMatrix(B->getImpliedEquations(),c.ambientDimension())))==2*c.ambientDimension()))) { numberOfComputedCones++; c.canonicalize(); ret.cones.insert(c); linealityConeFound=linealityConeFound || thisIsLinealityCone; } else { conesSkipped++; } } // fprintf(Stderr,"Number of skipped cones: %i, lineality cone found: %i\n",conesSkipped,linealityConeFound); // fprintf(Stderr,"Number of computed cones: %i, number of unique cones: %i\n",numberOfComputedCones,ret.cones.size()); return ret; } PolyhedralFan product(const PolyhedralFan &a, const PolyhedralFan &b) { PolyhedralFan ret(a.getAmbientDimension()+b.getAmbientDimension()); for(PolyhedralConeList::const_iterator A=a.cones.begin();A!=a.cones.end();A++) for(PolyhedralConeList::const_iterator B=b.cones.begin();B!=b.cones.end();B++) ret.insert(product(*A,*B)); return ret; } IntegerVectorList PolyhedralFan::getRays(int dim) { IntegerVectorList ret; for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++) { if(i->dimension()==dim) ret.push_back(i->getRelativeInteriorPoint()); } return ret; } IntegerVectorList PolyhedralFan::getRelativeInteriorPoints() { IntegerVectorList ret; for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++) { ret.push_back(i->getRelativeInteriorPoint()); } return ret; } PolyhedralCone const& PolyhedralFan::highestDimensionalCone()const { return *cones.rbegin(); } PolyhedralCone PolyhedralFan::convexHull()const { if(cones.empty())return PolyhedralCone::givenByRays(IntegerVectorList(),IntegerVectorList(),n); return PolyhedralCone::givenByRays(getRaysInPrintingOrder(0,0),cones.begin()->generatorsOfLinealitySpace(),n); } void PolyhedralFan::insert(PolyhedralCone const &c) { cones.insert(c); } void PolyhedralFan::insertFacetsOfCone(PolyhedralCone const &c) { PolyhedralFan facets=facetsOfCone(c); for(PolyhedralConeList::const_iterator i=facets.cones.begin();i!=facets.cones.end();i++)insert(*i); } void PolyhedralFan::remove(PolyhedralCone const &c) { cones.erase(c); } void PolyhedralFan::removeAllExcept(int a) { PolyhedralConeList::iterator i=cones.begin(); while(a>0) { if(i==cones.end())return; i++; a--; } cones.erase(i,cones.end()); } void PolyhedralFan::removeAllLowerDimensional() { if(!cones.empty()) { int d=getMaxDimension(); PolyhedralConeList::iterator i=cones.begin(); while(i!=cones.end() && i->dimension()==d)i++; cones.erase(i,cones.end()); } } PolyhedralFan PolyhedralFan::facetComplex()const { // fprintf(Stderr,"Computing facet complex...\n"); PolyhedralFan ret(n); for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++) { PolyhedralFan a=facetsOfCone(*i); for(PolyhedralConeList::const_iterator j=a.cones.begin();j!=a.cones.end();j++) ret.insert(*j); } // fprintf(Stderr,"Done computing facet complex.\n"); return ret; } PolyhedralFan PolyhedralFan::fullComplex()const { PolyhedralFan ret=*this; while(1) { log2 debug<<"looping"; bool doLoop=false; PolyhedralFan facets=ret.facetComplex(); log2 debug<<"number of facets"<dimension()==i->dimensionOfLinealitySpace()+1)ret.insert(*i); for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++) { PolyhedralFan a=facetsOfCone(*i); for(PolyhedralConeList::const_iterator j=a.cones.begin();j!=a.cones.end();j++) { if((!dropLinealitySpace) || j->dimension()!=j->dimensionOfLinealitySpace()) { IntegerVector v=j->getRelativeInteriorPoint(); bool alreadyInRet=false; for(SymmetryGroup::ElementContainer::const_iterator k=sym.elements.begin();k!=sym.elements.end();k++) { IntegerVector u=SymmetryGroup::compose(*k,v); if(!j->containsRelatively(u)) { for(PolyhedralConeList::const_iterator l=ret.cones.begin();l!=ret.cones.end();l++) if(l->containsRelatively(u))alreadyInRet=true; } } if(!alreadyInRet)ret.insert(*j); } } } log1 fprintf(Stderr,"Done computing facet complex.\n"); return ret; } */ PolyhedralFan PolyhedralFan::facetComplexSymmetry(SymmetryGroup const &sym, bool keepRays, bool dropLinealitySpace)const { log1 fprintf(Stderr,"Computing facet complex...\n"); PolyhedralFan ret(n); vector relIntTable; vector dimensionTable; if(keepRays) for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++) if(i->dimension()==i->dimensionOfLinealitySpace()+1) { relIntTable.push_back(i->getRelativeInteriorPoint()); dimensionTable.push_back(i->dimension()); ret.insert(*i); } for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();i++) { int iDim=i->dimension(); if(dropLinealitySpace && (i->dimension()==i->dimensionOfLinealitySpace()+1))continue; // i->findFacets(); IntegerVectorList normals=i->getHalfSpaces(); for(IntegerVectorList::const_iterator j=normals.begin();j!=normals.end();j++) { bool alreadyInRet=false; for(int l=0;lcontains(u))) { alreadyInRet=true; goto exitLoop; } } } exitLoop: if(!alreadyInRet) { IntegerVectorList equations=i->getEquations(); IntegerVectorList inequalities=i->getHalfSpaces(); equations.push_back(*j); PolyhedralCone c(inequalities,equations,n); c.canonicalize(); ret.insert(c); relIntTable.push_back(c.getRelativeInteriorPoint()); dimensionTable.push_back(c.dimension()); } } } log1 fprintf(Stderr,"Done computing facet complex.\n"); return ret; } /* IntegerVectorList PolyhedralFan::getRaysInPrintingOrder(SymmetryGroup *sym)const { assert(!cones.empty()); int h=cones.begin()->dimensionOfLargestContainedSubspace(); PolyhedralFan f=*this; while(f.getMaxDimension()!=h+1) { f=f.facetComplex(); } IntegerVectorList rays; PolyhedralFan done(n); for(PolyhedralConeList::const_iterator i=f.cones.begin();i!=f.cones.end();i++) if(!done.contains(*i)) for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++) { PolyhedralCone cone=i->permuted(*k); if(!done.contains(cone)) { rays.push_back(cone.getRelativeInteriorPoint()); done.insert(cone); } } return rays; } */ IntegerVector PolyhedralFan::stableRay(PolyhedralCone const &c, SymmetryGroup const *sym) { PolyhedralCone C=c;//cast away const instead? IntegerVector v=C.getRelativeInteriorPoint(); IntegerVector ret(v.size()); for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++) { IntegerVector v2=SymmetryGroup::compose(*k,v); if(c.contains(v2))ret+=v2; } return normalized(ret); } IntegerVector PolyhedralFan::stableRay(IntegerVector const &v, IntegerVectorList const &equations, IntegerVectorList const &inequalities, SymmetryGroup const *sym) { IntegerVector ret(v.size()); for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++) { IntegerVector v2=SymmetryGroup::compose(*k,v); bool containsV2=true; for(IntegerVectorList::const_iterator l=equations.begin();l!=equations.end();l++) if(dotLong(*l,v2)!=0) { containsV2=false; goto leave; } for(IntegerVectorList::const_iterator l=inequalities.begin();l!=inequalities.end();l++) if(dotLong(*l,v2)<0) { containsV2=false; goto leave; } leave: if(containsV2)ret+=v2; } return normalized(ret); } /* Slow version using facetComplexSymmetry() IntegerVectorList PolyhedralFan::getRaysInPrintingOrder(SymmetryGroup *sym)const { assert(!cones.empty()); int h=cones.begin()->dimensionOfLinealitySpace(); PolyhedralFan f=*this; if(f.getMaxDimension()==h)return IntegerVectorList(); while(f.getMaxDimension()>h+1) { f=f.facetComplexSymmetry(*sym,true,true); } IntegerVectorList rays; for(PolyhedralConeList::const_iterator i=f.cones.begin();i!=f.cones.end();i++) { if(i->dimension()!=i->dimensionOfLinealitySpace())//This check is needed since the above while loop may not be run and therefore the lineality space may not have been removed. { bool found=false; for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++) if(i->contains(*j))found=true; if(!found) { //IntegerVector interiorPointForOrbit=i->getRelativeInteriorPoint(); IntegerVector interiorPointForOrbit=stableRay(*i,sym); PolyhedralFan done(n); for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++) { PolyhedralCone cone=i->permuted(*k); if(!done.contains(cone)) { rays.push_back(SymmetryGroup::compose(*k,interiorPointForOrbit)); done.insert(cone); } } } } } return rays; }*/ PolyhedralFan PolyhedralFan::rayComplexSymmetry(SymmetryGroup const &sym)const { // log0 fprintf(Stderr,"rayComplexSymmetry - begin\n"); PolyhedralFan ret(n); log1 fprintf(Stderr,"Computing rays of %i cones\n",(int)cones.size()); for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { { static int t; if(!((t++)%10))log1 fprintf(Stderr,"%i\n",t); } // log0 fprintf(Stderr,"calling\n"); IntegerVectorList rays=i->extremeRays(); //log0 fprintf(Stderr,"returning\n"); for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++) { bool alreadyInRet=false; for(PolyhedralConeList::const_iterator I=ret.cones.begin();I!=ret.cones.end();I++) for(SymmetryGroup::ElementContainer::const_iterator k=sym.elements.begin();k!=sym.elements.end();k++) { IntegerVector u=SymmetryGroup::compose(*k,*j); if((I->contains(u))) { alreadyInRet=true; goto exitLoop; } } exitLoop: IntegerVectorList equations=i->getEquations(); IntegerVectorList inequalities1=i->getHalfSpaces(); IntegerVectorList inequalities2; for(IntegerVectorList::const_iterator k=inequalities1.begin();k!=inequalities1.end();k++) { if(dotLong(*j,*k)) inequalities2.push_back(*k); else equations.push_back(*k); } PolyhedralCone C(inequalities2,equations,n); C.canonicalize(); ret.insert(C); } } // log0 fprintf(Stderr,"rayComplexSymmetry - end\n"); return ret; } #if 0 IntegerVectorList PolyhedralFan::getRaysInPrintingOrder(SymmetryGroup const *sym)const { assert(!cones.empty()); int h=cones.begin()->dimensionOfLinealitySpace(); /* PolyhedralFan f=*this; if(f.getMaxDimension()==h)return IntegerVectorList(); while(f.getMaxDimension()>h+1) { f=f.facetComplexSymmetry(*sym,true,true); } */ PolyhedralFan f=rayComplexSymmetry(*sym); IntegerVectorList rays; log1 fprintf(Stderr,"Number of cones in RayComplex: %i\n",f.cones.size()); for(PolyhedralConeList::const_iterator i=f.cones.begin();i!=f.cones.end();i++) { static int t; log1 fprintf(Stderr,"%i\n",t++); if(i->dimension()!=i->dimensionOfLinealitySpace())//This check is needed since the above while loop may not be run and therefore the lineality space may not have been removed. { bool found=false; for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++) if(i->contains(*j)) { found=true; break; } if(!found) { //IntegerVector interiorPointForOrbit=i->getRelativeInteriorPoint(); IntegerVector interiorPointForOrbit=stableRay(*i,sym); // PolyhedralFan done(n); //Check that this works: set thisOrbitsRays; for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++) { IntegerVector temp=SymmetryGroup::compose(*k,interiorPointForOrbit); thisOrbitsRays.insert(temp); } for(set::const_iterator i=thisOrbitsRays.begin();i!=thisOrbitsRays.end();i++)rays.push_back(*i); //Instead of this: /* for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++) { bool found=false; IntegerVector temp=SymmetryGroup::compose(*k,interiorPointForOrbit); for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++)//REWRITE WITH LOGARITHMIC SEARCH if(*j==temp) { found=true; break; } if(!found) { PolyhedralCone cone=i->permuted(*k); rays.push_back(SymmetryGroup::compose(*k,interiorPointForOrbit)); // done.insert(cone); } } */ } } } return rays; } #elseif 0 //version used until Sep 2010 IntegerVectorList PolyhedralFan::getRaysInPrintingOrder(SymmetryGroup const *sym, bool upToSymmetry)const { SymmetryGroup localsym(n); if(!sym)sym=&localsym; IntegerVectorList rays; log1 fprintf(Stderr,"Computing rays of %i cones\n",cones.size()); for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { { static int t; if(!((t++)%10))log1 fprintf(Stderr,"%i\n",t); } IntegerVectorList temp=i->extremeRays(); // AsciiPrinter(Stderr).printVectorList(temp); for(IntegerVectorList::const_iterator j=temp.begin();j!=temp.end();j++) { IntegerVectorList equations=i->getEquations(); IntegerVectorList inequalities1=i->getHalfSpaces(); IntegerVectorList inequalities2; for(IntegerVectorList::const_iterator k=inequalities1.begin();k!=inequalities1.end();k++) { if(dotLong(*j,*k)) inequalities2.push_back(*k); else equations.push_back(*k); } bool isFound=false; for(IntegerVectorList::const_iterator j2=rays.begin();j2!=rays.end();j2++) for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++) { bool isInCone=true; IntegerVector v=SymmetryGroup::compose(*k,*j2); for(IntegerVectorList::const_iterator l=equations.begin();l!=equations.end();l++) if(dotLong(*l,v)!=0) { isInCone=false; goto leave; } for(IntegerVectorList::const_iterator l=inequalities2.begin();l!=inequalities2.end();l++) if(dotLong(*l,v)<0) { isInCone=false; goto leave; } leave: if(isInCone) { isFound=true; goto leave2; } } leave2: if(!isFound) { IntegerVector ray=stableRay(*j,equations,inequalities2,sym); rays.push_back(ray); } } } rays.sort(); if(upToSymmetry)return rays; IntegerVectorList ret; for(IntegerVectorList::const_iterator i=rays.begin();i!=rays.end();i++) { set thisOrbitsRays; for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++) { IntegerVector temp=SymmetryGroup::compose(*k,*i); thisOrbitsRays.insert(temp); } for(set::const_iterator i=thisOrbitsRays.begin();i!=thisOrbitsRays.end();i++)ret.push_back(*i); } return ret; } #else IntegerVectorList PolyhedralFan::getRaysInPrintingOrder(SymmetryGroup const *sym, bool upToSymmetry)const { /* * The ordering changed in this version. Previously the orbit representatives stored in "rays" were * just the first extreme ray from the orbit that appeared. Now it is gotten using "orbitRepresentative" * which causes the ordering in which the different orbits appear to change. */ if(cones.empty())return IntegerVectorList(); IntegerVectorList generatorsOfLinealitySpace=cones.begin()->generatorsOfLinealitySpace();//all cones have the same lineality space SymmetryGroup localsym(n); if(!sym)sym=&localsym; set rays; log1 fprintf(Stderr,"Computing rays of %i cones\n",(int)cones.size()); for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { { static int t; if(!((t++)%10))log1 fprintf(Stderr,"%i\n",t); } IntegerVectorList temp=i->extremeRays(&generatorsOfLinealitySpace); for(IntegerVectorList::const_iterator j=temp.begin();j!=temp.end();j++) rays.insert(sym->orbitRepresentative(*j)); } IntegerVectorList ret; if(upToSymmetry) for(set::const_iterator i=rays.begin();i!=rays.end();i++)ret.push_back(*i); else for(set::const_iterator i=rays.begin();i!=rays.end();i++) { set thisOrbitsRays; for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++) { IntegerVector temp=SymmetryGroup::compose(*k,*i); thisOrbitsRays.insert(temp); } for(set::const_iterator i=thisOrbitsRays.begin();i!=thisOrbitsRays.end();i++)ret.push_back(*i); } return ret; } #endif /*void PolyhedralFan::printWithIndices(class Printer *p, SymmetryGroup *sym)const //fan must be pure { // print(p); SymmetryGroup symm(n); if(!sym)sym=&symm; assert(!cones.empty()); int h=cones.begin()->dimensionOfLargestContainedSubspace(); fprintf(Stdout,"Rays:\n"); // IntegerVectorList rays;//=f.getRelativeInteriorPoints(); fprintf(Stderr,"Computing rays...\n"); IntegerVectorList rays=getRaysInPrintingOrder(sym); fprintf(Stderr,"Done computing rays.\n"); p->printVectorList(rays,true); PolyhedralFan f=*this; // while(f.getMaxDimension()>=h) IntegerVector fvector(f.getMaxDimension()-h); while(f.getMaxDimension()!=h) { int currentDimension=f.getMaxDimension()-h; fprintf(Stderr,"Processing dimension %i cones...\n",currentDimension); PolyhedralFan done(n); IntegerVector rayIncidenceCounter(rays.size()); p->printString("Printing index list for dimension "); p->printInteger(currentDimension); p->printString(" cones:\n"); p->printString("{\n"); int faceIndex =0; bool split=false; bool addComma=false; for(PolyhedralConeList::const_iterator i=f.cones.begin();i!=f.cones.end();i++) { if(!done.contains(*i)) { for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++) { PolyhedralCone cone=i->permuted(*k); if(!done.contains(cone)) { // p->printString("Face "); // p->printInteger(faceIndex); // p->printString(": "); int rayIndex=0; IntegerVector indices(0); for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++) { if(cone.contains(*j)) { indices.grow(indices.size()+1); indices[indices.size()-1]=rayIndex; rayIncidenceCounter[rayIndex]++; } rayIndex++; } if(addComma) { p->printString(","); p->printNewLine(); if(split) p->printNewLine(); split=false; } p->printVector(indices,true); addComma=true; faceIndex++; done.insert(cone); } } split=true;//p->printNewLine(); } } p->printString("}\n"); p->printString("Number of dimension "); p->printInteger(f.getMaxDimension()-h); p->printString(" cones incident to each ray:\n"); p->printVector(rayIncidenceCounter); p->printNewLine(); fvector[f.getMaxDimension()-h-1]=faceIndex; f=f.facetComplex(); fprintf(Stderr,"Done processing dimension %i cones.\n",currentDimension); // fvector.grow(fvector.size()+1);fvector[fvector.size()-1]=faceIndex; } p->printString("F-vector:\n"); p->printVector(fvector); p->printNewLine(); } */ /* void PolyhedralFan::printWithIndices(class Printer *p, SymmetryGroup *sym, const char *polymakeFileName)const //fan must be pure { IntegerVector multiplicities; SymmetryGroup symm(n); PolymakeFile polymakeFile; if(polymakeFileName) { polymakeFile.create(polymakeFileName,"PolyhedralFan","PolyhedralFan"); } if(!sym)sym=&symm; assert(!cones.empty()); int h=cones.begin()->dimensionOfLinealitySpace(); fprintf(Stdout,"Rays:\n"); // IntegerVectorList rays;//=f.getRelativeInteriorPoints(); fprintf(Stderr,"Computing rays...\n"); IntegerVectorList rays=getRaysInPrintingOrder(sym); fprintf(Stderr,"Done computing rays.\n"); SymmetricComplex symCom(n,rays,*sym); if(p) p->printVectorList(rays,true); if(polymakeFileName) { polymakeFile.writeCardinalProperty("AMBIENT_DIM",n); polymakeFile.writeCardinalProperty("DIM",getMaxDimension()); polymakeFile.writeCardinalProperty("LINEALITY_DIM",h); polymakeFile.writeMatrixProperty("RAYS",rowsToIntegerMatrix(rays,n)); polymakeFile.writeCardinalProperty("N_RAYS",rays.size()); polymakeFile.writeMatrixProperty("LINEALITY_SPACE",rowsToIntegerMatrix(highestDimensionalCone().linealitySpace().dualCone().getEquations())); polymakeFile.writeMatrixProperty("ORTH_LINEALITY_SPACE",rowsToIntegerMatrix(highestDimensionalCone().linealitySpace().getEquations())); polymakeFile.writeCardinalProperty("PURE",1); } PolyhedralFan f=*this; stringstream s; // while(f.getMaxDimension()>=h) IntegerVector fvector(f.getMaxDimension()-h); bool isHighestDimension=true; while(f.getMaxDimension()!=h) { int currentDimension=f.getMaxDimension()-h; fprintf(Stderr,"Processing dimension %i cones...\n",currentDimension); IntegerVector rayIncidenceCounter(rays.size()); if(p) { p->printString("Printing index list for dimension "); p->printInteger(currentDimension); p->printString(" cones:\n"); p->printString("{\n"); } int faceIndex =0; bool split=false; bool addComma=false; for(PolyhedralConeList::const_iterator i=f.cones.begin();i!=f.cones.end();i++) { { SymmetricComplex::Cone c; c.dimension=i->dimension(); int rayIndex=0; for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++) { if(i->contains(*j))c.insert(rayIndex); rayIndex++; } symCom.insert(c); } PolyhedralFan done(n); for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++) { PolyhedralCone cone=i->permuted(*k); if(!done.contains(cone)) { if(isHighestDimension) { multiplicities.grow(multiplicities.size()+1); multiplicities[multiplicities.size()-1]=i->getMultiplicity(); } // p->printString("Face "); // p->printInteger(faceIndex); // p->printString(": "); int rayIndex=0; IntegerVector indices(0); for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++) { if(cone.contains(*j)) { indices.grow(indices.size()+1); indices[indices.size()-1]=rayIndex; rayIncidenceCounter[rayIndex]++; } rayIndex++; } if(addComma) { if(p) { p->printString(","); p->printNewLine(); } if(isHighestDimension)s<printNewLine(); // s<printVector(indices,true); if(isHighestDimension) { s << '{'; for(int i=0;iprintNewLine(); } if(p) { p->printString("}\n"); p->printString("Number of dimension "); p->printInteger(f.getMaxDimension()-h); p->printString(" cones incident to each ray:\n"); p->printVector(rayIncidenceCounter); p->printNewLine(); } fvector[f.getMaxDimension()-h-1]=faceIndex; fprintf(Stderr,"TESTESTSETST\n"); f=f.facetComplexSymmetry(*sym); fprintf(Stderr,"TESTESTSETST\n"); fprintf(Stderr,"Done processing dimension %i cones.\n",currentDimension); // fvector.grow(fvector.size()+1);fvector[fvector.size()-1]=faceIndex; isHighestDimension=false; } if(p) { p->printString("Multiplicities:\n"); p->printVector(multiplicities); p->printNewLine(); p->printString("F-vector:\n"); p->printVector(fvector); p->printNewLine(); } if(polymakeFileName) { polymakeFile.writeCardinalVectorProperty("F_VECTOR",fvector); s< computeFacets(SymmetricComplex::Cone const &theCone, IntegerMatrix const &rays, IntegerVectorList const &facetCandidates, SymmetricComplex const &theComplex/*, int linealityDim*/) { set ret; for(IntegerVectorList::const_iterator i=facetCandidates.begin();i!=facetCandidates.end();i++) { set indices; bool notAll=false; for(vector::const_iterator j=theCone.indices.begin();j!=theCone.indices.end();j++) if(dotLong(rays[*j],*i)==0) indices.insert(*j); else notAll=true; SymmetricComplex::Cone temp(indices,theCone.dimension-1,0,false,theComplex); /* temp.multiplicity=0; temp.dimension=theCone.dimension-1; temp.setIgnoreSymmetry(true); */ if(notAll)ret.insert(temp); } // fprintf(Stderr,"HEJ!!!!\n"); list ret2; for(set::const_iterator i=ret.begin();i!=ret.end();i++) { bool isMaximal=true; /* if(i->indices.size()+linealityDimdimension)//#3 isMaximal=false; else*/ for(set::const_iterator j=ret.begin();j!=ret.end();j++) if(i!=j && i->isSubsetOf(*j)) { isMaximal=false; break; } if(isMaximal) { SymmetricComplex::Cone temp(i->indexSet(),i->dimension,i->multiplicity,true,theComplex); temp.setKnownToBeNonMaximal(); // THIS IS WHERE WE SET THE CONES NON-MAXIMAL FLAG // temp.setIgnoreSymmetry(false); ret2.push_back(temp); } } return ret2; } void addFacesToSymmetricComplex(SymmetricComplex &c, PolyhedralCone const &cone, IntegerVectorList const &facetCandidates, IntegerVectorList const &generatorsOfLinealitySpace) { IntegerMatrix const &rays=c.getVertices(); set indices; // for(int j=0;j const &indices, IntegerVectorList const &facetCandidates, int dimension, int multiplicity) { IntegerMatrix const &rays=c.getVertices(); list clist; { SymmetricComplex::Cone temp(indices,dimension,multiplicity,true,c); // temp.dimension=cone.dimension(); // temp.multiplicity=cone.getMultiplicity(); clist.push_back(temp); } // int linealityDim=cone.dimensionOfLinealitySpace(); while(!clist.empty()) { SymmetricComplex::Cone &theCone=clist.front(); if(!c.contains(theCone)) { log2 { static int t; if((t&1023)==0) { fprintf(Stderr,"clist size:%i\n",(int)clist.size()); } t++; } c.insert(theCone); // log0 fprintf(Stderr,"ADDING\n"); list facets=computeFacets(theCone,rays,facetCandidates,c/*,linealityDim*/); clist.splice(clist.end(),facets); } clist.pop_front(); } } /** Produce strings that express the vectors in terms of rays of the fan modulo the lineality space. Symmetry is ignored?? */ vector PolyhedralFan::renamingStrings(IntegerVectorList const &theVectors, IntegerVectorList const &originalRays, IntegerVectorList const &linealitySpace, SymmetryGroup *sym)const { vector ret; for(IntegerVectorList::const_iterator i=theVectors.begin();i!=theVectors.end();i++) { for(PolyhedralConeList::const_iterator j=cones.begin();j!=cones.end();j++) { if(j->contains(*i)) { vector relevantIndices; IntegerVectorList relevantRays=linealitySpace; int K=0; for(IntegerVectorList::const_iterator k=originalRays.begin();k!=originalRays.end();k++,K++) if(j->contains(*k)) { relevantIndices.push_back(K); relevantRays.push_back(*k); } FieldMatrix LFA(Q,relevantRays.size(),n); int J=0; for(IntegerVectorList::const_iterator j=relevantRays.begin();j!=relevantRays.end();j++,J++) LFA[J]=integerVectorToFieldVector(*j,Q); FieldVector LFB=concatenation(integerVectorToFieldVector(*i,Q),FieldVector(Q,relevantRays.size())); LFA=LFA.transposed(); FieldVector LFX=LFA.solver().canonicalize(LFB); stringstream s; if(LFX.subvector(0,n).isZero()) { s<<"Was:"; FieldVector S=LFX.subvector(n+linealitySpace.size(),LFX.size()); for(int k=0;kgeneratorsOfLinealitySpace(); for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { { static int t; log1 fprintf(Stderr,"Adding faces of cone %i\n",t++); } log2 fprintf(Stderr,"Dim: %i\n",i->dimension()); addFacesToSymmetricComplex(symCom,*i,i->getHalfSpaces(),generatorsOfLinealitySpace); } log1 cerr<<"Remapping"; symCom.remap(); log1 cerr<<"Done remapping"; return symCom; } void PolyhedralFan::printWithIndices(class Printer *p, int flags, SymmetryGroup *sym, vector const *comments)const //void PolyhedralFan::printWithIndices(class Printer *p, bool printMultiplicities, SymmetryGroup *sym, bool group, bool ignoreCones, bool xml, bool tPlaneSort, vector const *comments)const { assert(p); // IntegerVector multiplicities; SymmetryGroup symm(n); PolymakeFile polymakeFile; // polymakeFile.create("NONAME","fan","PolyhedralFan",flags&FPF_xml); polymakeFile.create("NONAME","fan","SymmetricFan",flags&FPF_xml); bool produceXml=polymakeFile.isXmlFormat(); if(!sym)sym=&symm; if(cones.empty()) { p->printString("Polyhedral fan is empty. Printing not supported.\n"); return; } int h=cones.begin()->dimensionOfLinealitySpace(); log1 fprintf(Stderr,"Computing rays.\n"); IntegerVectorList rays=getRaysInPrintingOrder(sym); SymmetricComplex symCom(n,rays,*sym); polymakeFile.writeCardinalProperty("AMBIENT_DIM",n); polymakeFile.writeCardinalProperty("DIM",getMaxDimension()); polymakeFile.writeCardinalProperty("LINEALITY_DIM",h); polymakeFile.writeMatrixProperty("RAYS",rowsToIntegerMatrix(rays,n),true,comments); polymakeFile.writeCardinalProperty("N_RAYS",rays.size()); IntegerVectorList linealitySpaceGenerators=highestDimensionalCone().linealitySpace().dualCone().getEquations(); polymakeFile.writeMatrixProperty("LINEALITY_SPACE",rowsToIntegerMatrix(linealitySpaceGenerators,n)); polymakeFile.writeMatrixProperty("ORTH_LINEALITY_SPACE",rowsToIntegerMatrix(highestDimensionalCone().linealitySpace().getEquations(),n)); if(flags & FPF_primitiveRays) { IntegerVectorList primitiveRays; for(IntegerVectorList::const_iterator i=rays.begin();i!=rays.end();i++) for(PolyhedralConeList::const_iterator j=cones.begin();j!=cones.end();j++) if(j->contains(*i)&&(j->dimensionOfLinealitySpace()+1==j->dimension())) primitiveRays.push_back(j->semiGroupGeneratorOfRay()); polymakeFile.writeMatrixProperty("PRIMITIVE_RAYS",rowsToIntegerMatrix(primitiveRays,n)); } IntegerVectorList generatorsOfLinealitySpace=cones.begin()->generatorsOfLinealitySpace(); log1 fprintf(Stderr,"Building symmetric complex.\n"); for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { { static int t; log1 fprintf(Stderr,"Adding faces of cone %i\n",t++); } log2 fprintf(Stderr,"Dim: %i\n",i->dimension()); addFacesToSymmetricComplex(symCom,*i,i->getHalfSpaces(),generatorsOfLinealitySpace); } log1 cerr<<"Remapping"; symCom.remap(); log1 cerr<<"Done remapping"; PolyhedralFan f=*this; // IntegerVector fvector(f.getMaxDimension()-h); //fprintf(Stderr,"maxdim %i h %i\n",f.getMaxDimension(),h); /* while(!f.cones.empty()) { int currentDimension=f.getMaxDimension()-h; IntegerVector rayIncidenceCounter(rays.size()); int faceIndex =0; bool split=false; bool addComma=false; for(PolyhedralConeList::const_iterator i=f.cones.begin();i!=f.cones.end();i++) { { SymmetricComplex::Cone c; c.dimension=i->dimension(); c.multiplicity=i->getMultiplicity(); int rayIndex=0; for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++) { if(i->contains(*j))c.insert(rayIndex); rayIndex++; } symCom.insert(c); } } // fvector[f.getMaxDimension()-h-1]=faceIndex; f=f.facetComplexSymmetry(*sym); } */ log1 fprintf(Stderr,"Computing f-vector.\n"); IntegerVector fvector=symCom.fvector(); polymakeFile.writeCardinalVectorProperty("F_VECTOR",fvector); log1 fprintf(Stderr,"Done computing f-vector.\n"); if(flags&FPF_boundedInfo) { log1 fprintf(Stderr,"Computing bounded f-vector.\n"); IntegerVector fvectorBounded=symCom.fvector(true); polymakeFile.writeCardinalVectorProperty("F_VECTOR_BOUNDED",fvectorBounded); log1 fprintf(Stderr,"Done computing bounded f-vector.\n"); } /* * Removed to make the Polymake people happy. * { int euler=0; int mul=-1; for(int i=0;igetUniqueGenerators(),n)); log1 fprintf(Stderr,"Producing list of cones up to symmetry.\n"); polymakeFile.writeStringProperty("CONES_ORBITS",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),false,flags&FPF_group,0,true,flags&FPF_tPlaneSort,produceXml)); log1 fprintf(Stderr,"Done producing list of cones up to symmetry.\n"); log1 fprintf(Stderr,"Producing list of maximal cones up to symmetry.\n"); stringstream multiplicities; polymakeFile.writeStringProperty("MAXIMAL_CONES_ORBITS",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),true,flags&FPF_group, &multiplicities,true,flags&FPF_tPlaneSort,produceXml)); if(flags&FPF_multiplicities)polymakeFile.writeStringProperty("MULTIPLICITIES_ORBITS",multiplicities.str()); log1 fprintf(Stderr,"Done producing list of maximal cones up to symmetry.\n"); } if(flags&FPF_conesExpanded) { if(flags&FPF_cones) { log1 fprintf(Stderr,"Producing list of cones.\n"); polymakeFile.writeStringProperty("CONES",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),false,flags&FPF_group,0,false,flags&FPF_tPlaneSort,produceXml)); log1 fprintf(Stderr,"Done producing list of cones.\n"); } if(flags&FPF_maximalCones) { log1 fprintf(Stderr,"Producing list of maximal cones.\n"); stringstream multiplicities; polymakeFile.writeStringProperty("MAXIMAL_CONES",symCom.toString(symCom.getMinDim(),symCom.getMaxDim(),true,flags&FPF_group, &multiplicities,false,flags&FPF_tPlaneSort,produceXml)); if(flags&FPF_multiplicities)polymakeFile.writeStringProperty("MULTIPLICITIES",multiplicities.str()); log1 fprintf(Stderr,"Done producing list of maximal cones.\n"); } } if(flags&FPF_values) { { IntegerVectorList values; for(IntegerVectorList::const_iterator i=linealitySpaceGenerators.begin();i!=linealitySpaceGenerators.end();i++) { IntegerVector v(1); v[0]=evaluatePiecewiseLinearFunction(*i); values.push_back(v); } polymakeFile.writeMatrixProperty("LINEALITY_VALUES",rowsToIntegerMatrix(values,1)); } { IntegerVectorList values; for(IntegerVectorList::const_iterator i=rays.begin();i!=rays.end();i++) { IntegerVector v(1); v[0]=evaluatePiecewiseLinearFunction(*i); values.push_back(v); } polymakeFile.writeMatrixProperty("RAY_VALUES",rowsToIntegerMatrix(values,1)); } } log1 fprintf(Stderr,"Producing final string for output.\n"); stringstream s; polymakeFile.writeStream(s); string S=s.str(); log1 fprintf(Stderr,"Printing string.\n"); p->printString(S.c_str()); log1 fprintf(Stderr,"Done printing string.\n"); } PolyhedralFan PolyhedralFan::readFan(string const &filename, bool onlyMaximal, IntegerVector *w, set const *coneIndices, SymmetryGroup const *sym, bool readCompressedIfNotSym) { PolymakeFile inFile; inFile.open(filename.c_str()); int n=inFile.readCardinalProperty("AMBIENT_DIM"); int nRays=inFile.readCardinalProperty("N_RAYS"); IntegerMatrix rays=inFile.readMatrixProperty("RAYS",nRays,n); int linealityDim=inFile.readCardinalProperty("LINEALITY_DIM"); IntegerMatrix linealitySpace=inFile.readMatrixProperty("LINEALITY_SPACE",linealityDim,n); const char *sectionName=0; const char *sectionNameMultiplicities=0; if(sym || readCompressedIfNotSym) { sectionName=(onlyMaximal)?"MAXIMAL_CONES_ORBITS":"CONES_ORBITS"; sectionNameMultiplicities=(onlyMaximal)?"MULTIPLICITIES_ORBITS":"DUMMY123"; } else { sectionName=(onlyMaximal)?"MAXIMAL_CONES":"CONES"; sectionNameMultiplicities=(onlyMaximal)?"MULTIPLICITIES":"DUMMY123"; } IntegerVector w2(n); if(w==0)w=&w2; SymmetryGroup sym2(n); if(sym==0)sym=&sym2; vector > cones=inFile.readMatrixIncidenceProperty(sectionName); IntegerVectorList r; bool hasMultiplicities=inFile.hasProperty(sectionNameMultiplicities); IntegerMatrix multiplicities(0,0); if(hasMultiplicities)multiplicities=inFile.readMatrixProperty(sectionNameMultiplicities,cones.size(),1); PolyhedralFan ret(n); log2 cerr<< "Number of orbits to expand "<count(i)) { log2 cerr<<"Expanding symmetries of cone"<elements.begin();perm!=sym->elements.end();perm++) { IntegerVectorList coneRays; for(list::const_iterator j=cones[i].begin();j!=cones[i].end();j++) coneRays.push_back(SymmetryGroup::compose(*perm,rays[*j])); if(isInNonNegativeSpan(*w,coneRays,linealitySpace.getRows())) { PolyhedralCone C=PolyhedralCone::givenByRays(coneRays,linealitySpace.getRows(),n); C.canonicalize(); ret.insert(C); } } */ { IntegerVectorList coneRays; for(list::const_iterator j=cones[i].begin();j!=cones[i].end();j++) coneRays.push_back((rays[*j])); PolyhedralCone C=PolyhedralCone::givenByRays(coneRays,linealitySpace.getRows(),n); if(hasMultiplicities)C.setMultiplicity(multiplicities[i][0]); for(SymmetryGroup::ElementContainer::const_iterator perm=sym->elements.begin();perm!=sym->elements.end();perm++) { if(C.contains(SymmetryGroup::composeInverse(*perm,*w))) { PolyhedralCone C2=C.permuted(*perm); C2.canonicalize(); ret.insert(C2); } } } } return ret; } IncidenceList PolyhedralFan::getIncidenceList(SymmetryGroup *sym)const //fan must be pure { IncidenceList ret; SymmetryGroup symm(n); if(!sym)sym=&symm; assert(!cones.empty()); int h=cones.begin()->dimensionOfLinealitySpace(); IntegerVectorList rays=getRaysInPrintingOrder(sym); PolyhedralFan f=*this; while(f.getMaxDimension()!=h) { IntegerVectorList l; PolyhedralFan done(n); IntegerVector rayIncidenceCounter(rays.size()); int faceIndex =0; for(PolyhedralConeList::const_iterator i=f.cones.begin();i!=f.cones.end();i++) { if(!done.contains(*i)) { for(SymmetryGroup::ElementContainer::const_iterator k=sym->elements.begin();k!=sym->elements.end();k++) { PolyhedralCone cone=i->permuted(*k); if(!done.contains(cone)) { int rayIndex=0; IntegerVector indices(0); for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++) { if(cone.contains(*j)) { indices.grow(indices.size()+1); indices[indices.size()-1]=rayIndex; rayIncidenceCounter[rayIndex]++; } rayIndex++; } l.push_back(indices); faceIndex++; done.insert(cone); } } } } ret[f.getMaxDimension()]=l; f=f.facetComplex(); } return ret; } void PolyhedralFan::makePure() { if(getMaxDimension()!=getMinDimension())removeAllLowerDimensional(); } bool PolyhedralFan::contains(PolyhedralCone const &c)const { return cones.count(c); } PolyhedralCone PolyhedralFan::coneContaining(IntegerVector const &v)const { for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) if(i->contains(v))return i->faceContaining(v); debug<<"Vector "<contains(*i)) return false; } } }*/ int t=0; for(PolyhedralConeList::const_iterator j=f.cones.begin();j!=f.cones.end();j++) { int t1=0; for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { PolyhedralCone c=intersection(*i,*j); if(c.dimension()==n) { t1++; if(!j->contains(*i)) return false; } } fprintf(Stderr,"%i\n",t1); t+=t1; } fprintf(Stderr,"%i\n",t); /* bool found=false; for(PolyhedralConeList::const_iterator j=f.cones.begin();j!=f.cones.end();j++) if(j->contains(*i)){ found=true; break; } if(!found) { for(PolyhedralConeList::const_iterator j=f.cones.begin();j!=f.cones.end();j++) { PolyhedralCone c=intersection(*i,*j); if(c.dimension()==n){ AsciiPrinter(Stderr).printVector(c.getRelativeInteriorPoint()); } } return false; }*/ return true; } /* for(SymmetryGroup::ElementContainer::const_iterator perm=sym->elements.begin();perm!=sym->elements.end();perm++) { if(C.contains(SymmetryGroup::composeInverse(*perm,*w))) { PolyhedralCone C2=C.permuted(*perm); C2.canonicalize(); ret.insert(C2); } } */ PolyhedralFan PolyhedralFan::link(IntegerVector const &w, SymmetryGroup *sym)const { SymmetryGroup symL(n); if(!sym)sym=&symL; PolyhedralFan ret(n); for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { for(SymmetryGroup::ElementContainer::const_iterator perm=sym->elements.begin();perm!=sym->elements.end();perm++) { IntegerVector w2=SymmetryGroup::composeInverse(*perm,w); if(i->contains(w2)) { IntegerVectorList equations=i->getEquations(); IntegerVectorList inequalities1=i->getHalfSpaces(); IntegerVectorList inequalities2; for(IntegerVectorList::const_iterator j=inequalities1.begin();j!=inequalities1.end();j++) if(dotLong(w2,*j)==0)inequalities2.push_back(*j); PolyhedralCone C(inequalities2,equations,n); C.canonicalize(); C.setLinearForm(i->getLinearForm()); PolyhedralCone C2=C.permuted(*perm); C2.canonicalize(); C2.setMultiplicity(i->getMultiplicity()); ret.insert(C2); } } } return ret; } PolyhedralFan PolyhedralFan::link(IntegerVector const &w)const { PolyhedralFan ret(n); for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { if(i->contains(w)) { IntegerVectorList equations=i->getEquations(); IntegerVectorList inequalities1=i->getHalfSpaces(); IntegerVectorList inequalities2; for(IntegerVectorList::const_iterator j=inequalities1.begin();j!=inequalities1.end();j++) if(dotLong(w,*j)==0)inequalities2.push_back(*j); PolyhedralCone C(inequalities2,equations,n); C.canonicalize(); C.setLinearForm(i->getLinearForm()); C.setMultiplicity(i->getMultiplicity()); ret.insert(C); } } return ret; } int64 PolyhedralFan::evaluatePiecewiseLinearFunction(IntegerVector const &x)const { for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { if(i->contains(x))return dotLong(i->getLinearForm(),x); } assert(0); return 0; } FieldElement PolyhedralFan::volume(int d, SymmetryGroup *sym)const { SymmetryGroup symL(n); if(!sym)sym=&symL; FieldElement ret(Q); for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { if(i->dimension()==d) { IntegerVector w=stableRay(*i,sym); ret=ret+Q.zHomomorphism(sym->orbitSize(w))*i->volume(); } } return ret; } bool PolyhedralFan::isConnected(SymmetryGroup *sym)const { SymmetryGroup symL(n); if(!sym)sym=&symL; CodimOneConnectednessTester ct; for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { log2 cerr<<"Computing ridges of facet." << endl; PolyhedralFan ridges=facetsOfCone(*i); IntegerVectorList interiorPoints; for(PolyhedralConeList::const_iterator j=ridges.cones.begin();j!=ridges.cones.end();j++) interiorPoints.push_back(sym->orbitRepresentative(j->getUniquePoint())); ct.insertFacetOrbit(interiorPoints); } return ct.isConnected(); } int PolyhedralFan::size()const { return cones.size(); } int PolyhedralFan::dimensionOfLinealitySpace()const { assert(!cones.empty()); return cones.begin()->dimensionOfLinealitySpace(); } PolyhedralFan PolyhedralFan::negated()const { PolyhedralFan ret(n); for(coneIterator i=conesBegin();i!=conesEnd();i++) ret.insert(i->negated()); return ret; } bool PolyhedralFan::isCompatible(PolyhedralCone const &c)const { for(PolyhedralConeList::const_iterator i=cones.begin();i!=cones.end();i++) { PolyhedralCone C=intersection(c,*i); C.canonicalize(); if(!c.hasFace(C))return false; if(!i->hasFace(C))return false; } return true; } void PolyhedralFan::merge(PolyhedralCone const &c) { AsciiPrinter P(Stderr); if(isCompatible(c))insert(c); else { assert(0);//Does not work in general. } /* // P<<"BEFORE MERGE-------------------------" <<*this; PolyhedralFan ret=complementOfCone(c,false); // P<<"COMPLEMENT OF CONE-------------------------" <getRelativeInteriorPoint(); bool containedInOther=false; for(PolyhedralConeList::iterator j=cones.begin();j!=cones.end();j++) if(j!=i) { if(j->contains(w)){containedInOther=true;break;} } if(containedInOther) { PolyhedralConeList::iterator k=i; i++; cones.erase(k); } else i++; } } void PolyhedralFan::moveConesToVector(vector &v) { for(PolyhedralConeList::iterator i=cones.begin();i!=cones.end();) { v.push_back(*i); PolyhedralConeList::iterator k=i; i++; cones.erase(k); } } IntegerMatrix PolyhedralFan::balancingEquations() { PolyhedralFan &f=*this; int n=f.getAmbientDimension(); PolyhedralCone conv=f.convexHull(); //debug<<"convexhull">>conv; f.removeAllLowerDimensional(); PolyhedralFan skeleton=f.facetComplex(); int d=f.getMaxDimension(); int numberOfFacets=0; for(PolyhedralFan::coneIterator i=f.conesBegin();i!=f.conesEnd();i++)numberOfFacets+=(i->dimension()==d); int numberOfRidges=0; vector > > ridges; map ridgeIndices; vector ridgesGeneratorOfSpan; vector ridgesIgnore; for(PolyhedralFan::coneIterator i=skeleton.conesBegin();i!=skeleton.conesEnd();i++) { ridgesIgnore.push_back(!conv.containsRelatively(i->getRelativeInteriorPoint())); assert(i->dimension()==d-1); ridgeIndices[i->getUniquePoint()]=ridges.size(); ridges.push_back(list >()); ridgesGeneratorOfSpan.push_back(i->generatorsOfSpan()); } int I=0; for(PolyhedralFan::coneIterator i=f.conesBegin();i!=f.conesEnd();i++,I++) { PolyhedralFan temp=PolyhedralFan::facetsOfCone(*i); for(PolyhedralFan::coneIterator j=temp.conesBegin();j!=temp.conesEnd();j++) { IntegerVector ridgeVector=j->getUniquePoint(); int rIndex=ridgeIndices[ridgeVector]; ridges[rIndex].push_back(pair(i->link(ridgeVector).semiGroupGeneratorOfRay(),I)); } } IntegerMatrix equations(0,numberOfFacets/*+ridges.size()*(d-1)*/); // int K=numberOfFacets; for(int I=0;I >::const_iterator j=ridges[I].begin();j!=ridges[I].end();j++) { equationsNewTransposed[j->second]=j->first; } FieldMatrix tem=integerMatrixToFieldMatrix(rowsToIntegerMatrix(ridgesGeneratorOfSpan[I],n),Q); IntegerMatrix equationsOfSpan=fieldMatrixToIntegerMatrixPrimitive(tem.reduceAndComputeKernel()); // for(IntegerVectorList::const_iterator i=ridgesGeneratorOfLinSpace[I].begin();i!=ridgesGeneratorOfLinSpace[I].end();i++) // equationsNewTransposed[K++]=*i; equations.append(equationsOfSpan*equationsNewTransposed.transposed()); } // debug<contains(w))return true; return false; } PolyhedralFan PolyhedralFan::triangulation()const { PolyhedralFan ret(n); for(coneIterator i=conesBegin();i!=conesEnd();i++) { list temp=i->triangulation(); for(list::const_iterator j=temp.begin();j!=temp.end();j++) { PolyhedralCone c=*j; c.canonicalize(); ret.insert(c); } } return ret; } gfan0.8beta/src/app_tropicalprevarietycomponents.cpp0000664000175000017500000014225015177170257022600 0ustar andersanders/* * app_tropicalprevarietycomponents.cpp * * Created on: 7 Feb 2021 * Author: anders */ #include #include #include #include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "termorder.h" #include "ep_standard.h" #include "ep_xfig.h" #include "polyhedralcone.h" #include "gfanapplication.h" #include "saturation.h" #include "field_rationals.h" #include "field_zmodpz.h" #include "field_rationalfunctions.h" #include "symmetry.h" #include "linalg.h" #include "fieldlp.h" #include "integer.h" #include "polynomialgcd.h" #include "packedmonomial.h" #include "gfanlib_zcone.h" #include "gfanlib_tableau.h" #include "gfanlib_hypersurfaceintersection.h" #include "gfanlib_circuittableint.h" #include "gfanlib_mixedvolume.h" #include "lll.h" #include "gfanlib_circuittableinteger.h" #include "tropical2.h" using namespace gfan; class TropicalPrevarietyComponentsApplication : public GFanApplication { SimpleOption fibersOption; StringOption saveAs; StringOption loadFrom; IntegerOption optionNThreads; IntegerOption optionHalfspace; IntegerOption optionNumberOfDimensionsToClear; public: bool includeInDefaultInstallation() { return false; } const char *helpText() { return "This program computes the tropical prevariety of a set of polynomials given in a polynomialring with first variable being regarded as a field element with valuation 1.\n"; } TropicalPrevarietyComponentsApplication(): fibersOption("--fibers","Iterate over fibers of a coordinate projection. In this case the projection happens on the last variable of the ring."), optionNThreads("-j","Number of threads",40), optionNumberOfDimensionsToClear("-c","Number of dimensions to remove in global pointedness test.",0), saveAs("--saveas","Specify filename for saving intermediate result."), loadFrom("--loadfrom","Specify filename for loading intermediate result."), optionHalfspace("--half","specicfy right hand side of a strict inequality") { optionHalfspace.hide(); registerOptions(); } const char *name() { return "_tropicalprevarietycomponents"; } template gfan::Matrix convertMatrix(IntMatrix const &m) { gfan::Matrix ret(m.getHeight(),m.getWidth()); for(int i=0;i int numberOfEdges(gfan::Matrix const &A) { int ret=0; for(int i=0;i B(0,A.getWidth()); for(int k=0;k(B.transposed()); ret+=C.getDimension()==C.getAmbientDimension()-1; } std::cerr< parentList; vector classNamesOfRoots;//only valid to look up with root indices public: void grow(int M) { for(int a=parentList.size();a bool nonEmptyIntersectionOfDualsInteriors(vector> &cones) { if(cones.size()==0)return true; int ambientDimension=cones[0].getAmbientDimension(); // The duals are generated by the equations as line generators and inequalities as half line generators. // We write up a system of linear inequalities // -x=A_i\lambda_i with an i for each cone in cones // with some lambdas being strictly positive // There is one lambda entry for each generator of a dual cone. // The variables -x_1,...,-x_n represent the supposed common point in the interior of the dual points // We first // * collect all generators of the duals, // * count the number of lambdas // * and the number of lambdas that have positivity constraints vector, gfan::Matrix > > temp; int numberOfVariables=ambientDimension; int numberOfPositiveVariables=0; for(auto &c:cones) { auto eq=c.getEquations().transposed(); auto ineq=c.getInequalities().transposed(); temp.push_back(make_pair(ineq,eq)); numberOfVariables+=eq.getHeight(); numberOfVariables+=ineq.getHeight(); numberOfPositiveVariables+=ineq.getHeight(); } // We then set up the equations and strict inequalities, while there are no non-strict std::cerr<<"ambientDimension:"< equations(numberOfVariables,numberOfEquations); gfan::Matrix nonStrict(numberOfVariables,0); gfan::Matrix strict(numberOfVariables,numberOfPositiveVariables); int i=0; int equationsIndex=ambientDimension; int l=0; for(auto &c:cones) { equations.setSubMatrix(0,i*ambientDimension,ambientDimension,(i+1)*ambientDimension,gfan::Matrix::identity(ambientDimension)); equations.setSubMatrix(equationsIndex,i*ambientDimension,equationsIndex+temp[i].second.getHeight(),(i+1)*ambientDimension,temp[i].second); equationsIndex+=temp[i].second.getHeight(); equations.setSubMatrix(equationsIndex,i*ambientDimension,equationsIndex+temp[i].first.getHeight(),(i+1)*ambientDimension,temp[i].first); for(int k=0;k solutionSet(nonStrict,equations,strict); return !solutionSet.isEmpty(); } template bool sumOfConesContains(vector> v, Vector const &w) { int n=w.size(); vector> raysVector; vector> linesVector; int nLines=0; int nRays=0; for(auto &i:v) { assert(n==i.getAmbientDimension()); auto R=i.getRays(); R.normalizeRows(); raysVector.push_back(R); auto L=i.getLinealitySpace(); L.normalizeRows(); linesVector.push_back(L); nLines+=linesVector.back().getHeight(); nRays+=raysVector.back().getHeight(); } // std::cerr<<"RAYS\n"; // for(auto &a:raysVector)std::cerr< nonStrict(1+nRays+nLines,nRays); for(int i=0;i equations(1+nRays+nLines,n); equations.setSubMatrix(0,0,1,n,gfan::Matrix::rowVectorMatrix(w)); int pos=1; for(int i=0;i strict(1+nRays+nLines,1); strict[0][0]=-1; // std::cerr< C(nonStrict,equations,strict); //std::cerr< bool sumOfHalfOpenConesContainsOrigin(vector> const &v) { if(v.size()==0)return true;// Note that while this is correct it may not be the desired behavior. std::vector> l; for(auto &c:v) l.push_back(c.lifted); return sumOfConesContains(l,-gfan::Vector::standardVector(l[0].getAmbientDimension(),l[0].getAmbientDimension()-1)); } template class Fraction{ public: typ numerator; typ denominator; Fraction(): numerator(0), denominator(1) { } Fraction(typ const &numerator_,typ const &denominator_): numerator(numerator_), denominator(denominator_) { assert(denominator.isPositive()); Vector v(2); v[0]=denominator; v[1]=numerator; auto d=gcd(v); assert(d.isPositive()); denominator=denominator/d; numerator=numerator/d; } bool operator<(Fraction const &b)const { return numerator*b.denominator class IntervalBound { bool isFinite; bool isPlusInfinity; bool isMinusInfinity; Fraction value; IntervalBound(): isFinite(false), isPlusInfinity(false), isMinusInfinity(false) { } public: bool getIsFinite()const { return isFinite; } Fraction getValue()const { assert(isFinite); return value; } static IntervalBound plusInfinity() { IntervalBound ret; ret.isPlusInfinity=true; return ret; } static IntervalBound minusInfinity() { IntervalBound ret; ret.isMinusInfinity=true; return ret; } IntervalBound(Fraction const &value_): value(value_), isFinite(true), isPlusInfinity(false), isMinusInfinity(false) { } bool operator<(IntervalBound const &b)const//comparing infinities give false { if(isPlusInfinity) return false; if(b.isPlusInfinity) return true; if(b.isMinusInfinity) return false; if(isMinusInfinity) return true; return value class Interval{ public: IntervalBound start; IntervalBound end; bool empty; public: Interval(): start(IntervalBound::minusInfinity()), end(IntervalBound::plusInfinity()), empty(false) { } Interval(IntervalBound const &start_,IntervalBound const &end_): start(start_), end(end_) { empty=!(start::plusInfinity(),IntervalBound::minusInfinity()); ret.empty=true; return ret; } Interval intersectedWith(Interval const &b)const { return Interval(max(start,b.start),min(end,b.end)); } string toString()const { return string("[")+start.toString()+string(",")+end.toString()+string("]"); } Fraction getInteriorPoint()const { if(start.getIsFinite()) { if(end.getIsFinite()) { auto A=start.getValue(); auto B=end.getValue(); return Fraction(A.numerator*B.denominator+A.denominator*B.numerator,A.denominator*B.denominator+A.denominator*B.denominator); } else { auto temp=start.getValue(); return Fraction(temp.numerator+temp.denominator,temp.denominator); } } else { if(end.getIsFinite()) { auto temp=end.getValue(); return Fraction(temp.numerator-temp.denominator,temp.denominator); } else { return Fraction(0,1); } } } }; template class ProjectionIterator{ Cone recessionOfNonTrivialFiber; gfan::Matrix generatorsOfRecession; public: HalfOpenCone coneOverThis; bool plusInfinityCovered; bool minusInfinityCovered; int parameterIndex; //This should maybe get renamed to projectionCoordinate int separatorIterator; //runs from zero to separators.size() vector> separators; ProjectionIterator(HalfOpenCone const &coneOverThis_, int parameterIndex_): coneOverThis(coneOverThis_), parameterIndex(parameterIndex_), plusInfinityCovered(false), minusInfinityCovered(false) { auto closure=coneOverThis.closure(); { auto temp=closure.intersectedWithIthCoordinateHyperplaneEmbedded(parameterIndex); recessionOfNonTrivialFiber=temp.intersectedWithIthCoordinateHyperplaneEmbedded(0); generatorsOfRecession=recessionOfNonTrivialFiber.getRays(); //std::cerr<<"Number of ray generators"<::hyperPlane(Vector::standardVector(closure.getAmbientDimension(),0)); auto temp=intersection(hyperplane,closure); doesHaveSubdivision=temp.isImplied(Vector::standardVector(closure.getAmbientDimension(),parameterIndex)); if(!doesHaveSubdivision) plusInfinityCovered=minusInfinityCovered=true; } if(doesHaveSubdivision) { auto rays=closure.getRays(); // std::cerr<<"RAYS:\n"<> separators1; for(int i=0;i(rays[i][parameterIndex],-rays[i][infIndex])); else { if(rays[i][parameterIndex].isPositive())plusInfinityCovered=true; // Did we get the signs correct here? if(rays[i][parameterIndex].isNegative())minusInfinityCovered=true; // ? } } separators.reserve(separators1.size()); for(auto f:separators1) separators.push_back(f); } separatorIterator=0; } IntervalBound getLowerBound() { if(separatorIterator==0) return IntervalBound::minusInfinity(); return separators[separatorIterator-1]; } IntervalBound getUpperBound() { if(separatorIterator==separators.size()) return IntervalBound::plusInfinity(); return separators[separatorIterator]; } Interval getInterval() { return Interval(getLowerBound(),getUpperBound()); } bool isFirstInterval() { return separatorIterator==0; } bool isLastInterval() { return separatorIterator==separators.size(); } void next() { assert(!isLastInterval()); separatorIterator++; } bool isFiberEmpty()//for open interval { if(isLastInterval()) return !plusInfinityCovered; if(isFirstInterval()) return !minusInfinityCovered; return false; } Cone recessionOfFiberClosure()//for open interval { assert(!isFiberEmpty()); return recessionOfNonTrivialFiber; } gfan::Matrix recessionGenerators() { assert(!isFiberEmpty()); return generatorsOfRecession; } }; template class ProjectionsIterator{ public: vector> v; ProjectionsIterator(std::vector> const &F, int parameterIndex) { v.reserve(F.size()); for(auto &p:F) v.emplace_back(p,parameterIndex); } Interval getInterval() { Interval ret; for(auto &a:v) ret=ret.intersectedWith(a.getInterval()); return ret; } bool isLastInterval() { for(auto &a:v) if(!a.isLastInterval())return false; return true; } void next() { IntervalBound u=getInterval().end; for(auto &a:v) if(!(u void testFiber(std::vector > const &collection) { //compare to ~/gfan-svn/trunk/anton/RESULTS/n-4---2020-03-04/ } #if 0 //This FaceLattice should be remove as a complete implementation would have too much code overlap with Complex template class FaceLattice{ gfan::Matrix rays; using Face=vector; vector faces; vector isFaceDeleted; public: FaceLattice(vector> const &v) { gfan::Matrix linealitySpace; bool coneFound=false; for(int i=0;i collector(linealitySpace); int numberOfNonEmptyHalfOpenCones=0; for(int i=0;i leakCone(gfan::Complex &C, vector const &Cindices, vector const &Findices) { vector commonBounded; for(auto &i:Findices) if(!C.vertices[i][0].isZero()) commonBounded.push_back(i); vector indicesCBounded; for(auto &i:Cindices) if(!C.vertices[i][0].isZero()) indicesCBounded.push_back(i); typedef gfan::CircuitTableInt64 typ; // type for integers gfan::Matrix lines=C.linealitySpace; for(int a=1;a rays(0,lines.getWidth()); for(int i:Cindices) if(C.vertices[i][0].isZero())rays.appendRow(C.vertices[i]); // std::cerr<<"222\n"; auto temp=setDifference(indicesCBounded,commonBounded); for(int a:temp) rays.appendRow(-(C.vertices[commonBounded[0]][0]*C.vertices[a].toVector()- C.vertices[a][0]*C.vertices[commonBounded[0]].toVector())); // The sign change is needed because the homogenising coordinate is negative // std::cerr<<"333\n"; lines.normalizeRows(); lines.sortAndRemoveDuplicateRows(); rays.normalizeRows(); rays.sortAndRemoveDuplicateRows(); GeneratedCone K(rays.transposed(),lines.transposed()); // std::cerr<<"AAAAAAAAA\n"; auto Korth=K.getOrthogonalComplement(); auto Knorm=K.getFacetNormals(); Korth.normalizeRows(); Korth.sortAndRemoveDuplicateRows(); Knorm.normalizeRows(); Knorm.sortAndRemoveDuplicateRows(); HalfOpenCone KRelInterior(gfan::Matrix(K.getAmbientDimension(),0),Korth.transposed(),Knorm.transposed());//Put in empty matrix instead of the nonstrict inequalities // std::cerr<<"BBBBBBBBBB\n"; return KRelInterior; } vector> maximalSubsets(vector> const &C) { vector> ret; for(auto &v:C) { int nSetsBigger=0; for(auto &V:C) if(isSubsetOf(v,V)) { nSetsBigger++; if(nSetsBigger>1) break; } if(nSetsBigger==1) ret.push_back(v); } return ret; } bool shouldBeDeleted(gfan::Complex &C, gfan::Complex::Cone const &p) { std::cerr << "shouldBeDeleted: p.dimension = " << p.dimension << std::endl; typedef gfan::CircuitTableInt64 typ; // type for integers vector> leakCones; { // INSERT RECESSION OF p gfan::Matrix unboundedDirections(0,C.ambientDimension); for(auto &i:p.indices) if(C.vertices[i][0].isZero()) // unbounded unboundedDirections.appendRow(C.vertices[i]); GeneratedCone rC(unboundedDirections.transposed()); auto rCorth=rC.getOrthogonalComplement(); auto rCnorm=rC.getFacetNormals(); rCorth.normalizeRows(); rCorth.sortAndRemoveDuplicateRows(); rCnorm.normalizeRows(); rCnorm.sortAndRemoveDuplicateRows(); auto rowOfOnes = gfan::Matrix::rowVectorMatrix(gfan::Vector::allOnes(rCnorm.getHeight())); auto sumOfRows = rowOfOnes * rCnorm; HalfOpenCone rCRelInterior( rCnorm.transposed(), // non-strict inequalities rCorth.transposed(), // non-strict equations sumOfRows.transposed() // strict inequalities );//Put in empty matrix instead of the nonstrict inequalities leakCones.push_back(rCRelInterior); std::cerr << "shouldBeDeleted: rCRelInterior.getDimension() = " << rCRelInterior.getDimension() << std::endl; } // end INSERT RECESSION OF p set::Cone const*> S; for(auto &i:p.indices) if(!C.vertices[i][0].isZero()) // bounded for(auto conePointer:C.rayIncidences[i]) S.insert(conePointer); std::cerr<<"shouldBeDeleted: Number of adjacent polyhedra (including self):"<markedAsDeleted) { if(setDifference(c->indices,p.indices).size()==0)continue; // We find generators for the link auto indicesP=p.indices; auto indicesC=c->indices; vector indicesPBounded; for(auto a:indicesP) if(!C.vertices[a][0].isZero()) { assert(C.vertices[a][0].isNegative());// is this correct? indicesPBounded.push_back(a); } vector indicesCBounded; for(auto a:indicesC) if(!C.vertices[a][0].isZero())indicesCBounded.push_back(a); auto commonBounded=intersection(indicesCBounded,indicesPBounded); // std::cerr<<"P:"<indices,intersection(c->indices,indicesP))); else { auto temp=maximalSubsets(C.facesContainedInSubset(intersection(c->indices,indicesP))); for(auto &a:temp) leakCones.push_back(leakCone(C,c->indices,a)); } // To improve the above: if intersection(c->indices,indicesP) was marked as deleted, // then we should consider facets of the intersection - these may still be present in the // precomplex, but they have smaller leak cones. // We need to find all maximal sets among those in the complex contained in the intersection. } // std::cerr<<"Number of leak cones:\n"< void simplifyComplex(gfan::Complex &C) { typedef gfan::CircuitTableInt64 typ; // type for integers bool somethingChanged=true; while(somethingChanged) { somethingChanged=false; for(auto &p:C.cones) if(!p.markedAsDeleted) { //if(p.dimension==C.getMaxDim()) { if(shouldBeDeleted(C,p)) { std::cerr< &C) { std::cerr<<"SCULPTING\n"; std::cerr<<"FVECTOR:"< rays(0,C.ambientDimension); for(auto cone:C.rayIncidences[i]) for(auto j:cone->indices) if(!C.vertices[j][0].isZero()) rays.appendRow(C.vertices[j][0]*C.vertices[i].toVector()-C.vertices[i][0]*C.vertices[j].toVector()); else rays.appendRow(C.vertices[j].toVector()); // std::cerr< K(rays.transposed()); // std::cerr<<"LINDIM"< neighbours(0,C.ambientDimension); for(auto cone:C.rayIncidences[i]) for(auto j:cone->indices) if(j!=i) neighbours.appendRow(C.vertices[j].toVector()); neighbours.normalizeRows(); neighbours.sortAndRemoveDuplicateRows(); std::cerr< convexHull(neighbours.transposed()); gfan::Vector separating(C.ambientDimension); separating[0]=1; separating[1]=2; separating[2]=3; assert(convexHull.getAmbientDimension()==separating.size()); std::cerr<<"IF STATEMENT\n"; std::cerr<::rowVectorMatrix(separating).transposed(); // std::cerr<::hyperPlane(separating); auto halfspace=gfan::Cone::halfSpace(separating); std::cerr<<"A1\n"; assert(!halfspace.contains(C.vertices[i].toVector())); std::cerr<<"A2\n"; //halfspace=gfan::Cone::halfSpace(separating); //now we iterate over every relatively open cone involving i //--- compute the intersection with the separating half space //--- compute extreme vertices and rays //--- remember this for all intersections //--- remove the cone //update ray/vertex list with new rays/vertices //insert each earlier computed intersection polyhedron //ALSO insert intersection with separating HYPERplane vector::Cone*> oldCones; vector,int>> newCones; for(auto cone:C.rayIncidences[i]) { std::cerr<<"lloop\n"; oldCones.push_back(const_cast::Cone*>(cone)); gfan::Matrix lines(0,C.ambientDimension); // should add lineality space if any gfan::Matrix rays(0,C.ambientDimension); std::cerr<<"processing:"<toString()<<"\n"; for(auto j:cone->indices) rays.appendRow(C.vertices[j].toVector()); // std::cerr<<"RAYS:\n"< p(rays.transposed(),lines.transposed()); std::cerr<<"Original dimension:"<dimension<<"\n"; std::cerr<<"p dimension:"<dimension==p.getDimension()); // std::cerr<<"OKa\n"; // std::cerr<(p.getFacetNormals().normalizedRows().transposed(),p.getOrthogonalComplement().normalizedRows().transposed()); // std::cerr<<"OKa2\n"; auto newPolyhedron=intersection(pInHDescription,halfspace); auto newFace=intersection(pInHDescription,hyperplane); auto newRays=newPolyhedron.getRays().normalizedRows(); auto newRays2=newFace.getRays().normalizedRows(); // std::cerr<<"NewRays1"<0) { newCones.push_back(std::make_pair(newRays,dim1)); std::cerr<<"ADDING intersection.\n"; } if(dim2>0) if(dim2 p(newRays.transposed(),lines.transposed()); assert(p.getDimension()==dim1); gfan::GeneratedCone p2(newRays2.transposed(),lines.transposed()); assert(p2.getDimension()==dim2); } } C.substitute(oldCones, newCones); std::cerr<<"FVECTOR:"<> &halfOpenCones) { // typedef gfan::CircuitTableInt64 typ; // type for integers auto linealitySpace=halfOpenCones[0].closure().getLinealitySpace(); RayCollector collector(linealitySpace); for(auto &c:halfOpenCones) { auto rays=c.closure().getRays(); for(int i=0;i C=extractFaceComplex(halfOpenCones,collector,linealitySpace); C.buildRayIncidences(); // Plan: // Make ConeContainer a vector instead of a set // Write a C.buildInverses method // For each polyhedron P do inverse look ups for each bounded ray // For each face of P take the correspondig union // Perform LP test for P that involves a cone for each face-union pair std::cerr<<"Simplifying\n"<> L; stringstream A("{(1,0),(0,1)}"); stringstream B("{(0,0),(0,0)}"); stringstream C("{(1,-1),(1,0)}"); // stringstream C("{(0,-1),(1,0)}"); stringstream DD("{(0,0),(0,0)}"); // std::cerr<<"A"<::readMatrix(A,2)<<"\n"; // std::cerr<<"B"<::readMatrix(B,2)<<"\n"; L.emplace_back(gfan::Matrix::readMatrix(A,2),gfan::Matrix::readMatrix(B,2)); L.emplace_back(gfan::Matrix::readMatrix(C,2),gfan::Matrix::readMatrix(DD,2)); for(auto &c:L) { std::cerr< > configurations; for(auto &p:g) configurations.push_back(convertMatrix(rowsToIntegerMatrix2(p.exponents()))); vector > f; //We pretend that first coordinate is special (that it is the t parameter) int n=configurations[0].getWidth(); int nonEmptyIntersections=0; // vector edgeCounts; // for(int i=0;i used(configurations.size()); PolytopeIntersectionData data(configurations,HalfOpenCone::entireSpace(n)); gfan::Matrix strictInequalities(n,1); strictInequalities[0][0]=typ(-1); if(optionHalfspace.getValue()) { auto temp=-gfan::Vector::allOnes(n); temp[0]=typ(-optionHalfspace.getValue()); strictInequalities=strictInequalities.transposed(); strictInequalities.appendRow(temp); strictInequalities=strictInequalities.transposed(); std::cerr<<"STRICTINEQUALITIES:"<(F); F.close(); } else { std::cerr<<"ABOUT TO INTERSECT\n"; commonRefinement( {gfan::HalfOpenCone( gfan::Matrix(n,0), gfan::Matrix(n,0), strictInequalities)}, used,configurations,(std::function&)>)[&f](HalfOpenCone const& c)mutable->void{f.push_back(c);},nonEmptyIntersections/*,&edgeCounts*/,data,RelationTable(data.layout),progress,&statistics,optionNThreads.getValue()/*32*//*8*/); } if(saveAs.getValue()) { string saveName(saveAs.getValue()); std::cerr<<"Saving vector of HalfOpenCones in file \""< > F; // vector > F; F.reserve(f.size()); for(auto &c:f)F.emplace_back(c); if(0) { simplify(F); return 0; } std::cerr<<"NUMBER OF HALFOPEN CONES:"<1); } } if(fibersOption.getValue()) { std::cout<<"Printing intervals:\n"; ProjectionsIterator i(f,g.getRing().getNumberOfVariables()-1); int II=0; bool first=true; do { std::cerr<<"Cone number "< fraction=i.getInterval().getInteriorPoint(); HalfOpenCone H=HalfOpenCone::hyperplane(fraction.numerator*Vector::standardVector(n,0)+fraction.denominator*Vector::standardVector(n,g.getRing().getNumberOfVariables()-1)); std::cerr<<"LOOP. fraction:"<> recCones; recCones.reserve(count); for(auto &a:i.v) if(!a.isFiberEmpty()) recCones.push_back(a.recessionOfFiberClosure()); std::cerr<<"Count"< strict(0,N); for(auto &a:i.v) if(!a.isFiberEmpty()) strict.append(gfan::Matrix(a.recessionGenerators())); std::cerr<<"rows:"< certificatesForPointedness(gfan::Matrix(N,0),gfan::Matrix(N,0),strict.transposed()); if(certificatesForPointedness.isEmpty()) { std::cerr<<"not pointed\n"; } else { std::cerr<<"pointed\n"; } } else { std::cerr<<"Processing slice\n"; { vector> halfOpenCones; Fraction fraction=i.getInterval().getInteriorPoint(); HalfOpenCone H=HalfOpenCone::hyperplane(fraction.numerator*Vector::standardVector(n,0)+fraction.denominator*Vector::standardVector(n,g.getRing().getNumberOfVariables()-1)); for(auto &c:i.v) { auto A=intersection2(c.coneOverThis,H); if(!A.isEmpty()) halfOpenCones.push_back(A); } if(halfOpenCones.size()) { // simplify(halfOpenCones); assert(0/*Since simplify has been instantiated with the wrong type, the call above cannot happen without converting */); } else std::cerr<<"Slice is empty\n"; } vector,int>> V; int LO=1000; int HI=-1; vector> halfOpenCones; Fraction fraction=i.getInterval().getInteriorPoint(); HalfOpenCone H=HalfOpenCone::hyperplane(fraction.numerator*Vector::standardVector(n,0)+fraction.denominator*Vector::standardVector(n,g.getRing().getNumberOfVariables()-1)); for(auto &c:i.v) { { auto A=intersection2(c.coneOverThis,H); if(!A.isEmpty()) { V.emplace_back(make_pair,int>(A.closure(),A.getDimension())); halfOpenCones.push_back(A); LO=min(LO,A.getDimension()); HI=max(HI,A.getDimension()); } } } std::cerr<<"LODIM:"<> leakCones; auto H2=Cone::hyperPlane(Vector::standardVector(n,0)); { // c.first is the closure of a halfopen kegle over snit a polyeder. We need the recession. Intersect with infinity auto C=intersection(c.first,H2); auto T=C.getFacetNormals().transposed(); auto O=C.getOrthogonalComplement().transposed(); T.normalizeRows(); T.sortAndRemoveDuplicateRows(); O.normalizeRows(); O.sortAndRemoveDuplicateRows(); gfan::Vector v(T.getWidth()); for(int i=0;i::rowVectorMatrix(v).transposed()); //need to check that the above code is correct. } for(auto &k:V) { auto KClosure=k.first; auto temp=intersection(CClosure,KClosure); if(temp.getDimension()!=temp.getDimensionOfLinealitySpace()) { adjacentCones++; auto w=temp.getRelativeInteriorPoint(); auto t2=KClosure.link(w); auto l=intersection(H2,t2); // For relatively open cone: // leakCones.emplace_back(gfan::Matrix(l.getAmbientDimension(),0),l.getOrthogonalComplement(),l.getFacetNormals()); // For closed cone missing its lineality space: auto T=l.getFacetNormals().transposed(); T.normalizeRows(); T.sortAndRemoveDuplicateRows(); auto O=l.getOrthogonalComplement().transposed(); O.normalizeRows(); O.sortAndRemoveDuplicateRows(); gfan::Vector v(T.getWidth()); for(int i=0;i::rowVectorMatrix(v).transposed()); } } std::cerr<<"#adjacent cones "< > f2; vector > f2Rays; f2.reserve(f.size()); f2Rays.reserve(f.size()); for(auto &a:f) if(!a.isEmpty()) { auto temp=HalfOpenCone(a); f2Rays.push_back(temp.closure().getRays()); f2.push_back(temp); } else { std::cerr<<"Empty set computed\n"<closure().getLinealitySpace(); RayCollector collector(linealitySpace); int numberOfNonEmptyHalfOpenCones=0; EquivalenceRelation rel; for(int i=0;i toBeMadeEquivalent; if(!(numberOfNonEmptyHalfOpenCones&255))std::cerr< >,vector > > > components(nClasses); for(int I=0;I collector2(linealitySpace); for(int i=0;i actualRays(0,componentRays.getWidth()); for(int i=0;i temp(actualRays.submatrix(0,1,actualRays.getHeight(),actualRays.getWidth()).transposed(),linealitySpace.submatrix(0,1,linealitySpace.getHeight(),linealitySpace.getWidth()).transposed()); std::cerr<<"Dimension of Lineality space of recession:"< actualRays(0,allRays.getWidth()); for(int i=0;i temp(actualRays.submatrix(0,1,actualRays.getHeight(),actualRays.getWidth()).transposed(),linealitySpace.submatrix(0,1,linealitySpace.getHeight(),linealitySpace.getWidth()).transposed()); std::cerr<<"Dimension of Lineality space of recession:"<> fvectors; componentIndex=0; for(auto &F:components) if(F.first.size()) { auto FV=fvector(F.first); std::cerr< #include #include "division.h" #include "printer.h" #include "timer.h" #include "linalg.h" #include "wallideal.h" #include "division.h"//used for Polynomial::divides() //static Timer polynomialTimer("Polynomial subtraction",10); //static Timer polynomialTimer1("Polynomial monomial multiplication",1); //----------------------------------------- // Polynomial //----------------------------------------- Polynomial::Polynomial(const Term &t): marked(t), sugar(0), theRing(t.getRing()) { // terms[t.m]=t.c; if(!t.c.isZero()) { terms.insert(std::pair(t.m,t.c)); isMarkedBool=true; } else isMarkedBool=false; } Polynomial::Polynomial(PolynomialRing const &r): theRing(r), sugar(0), marked(r) { isMarkedBool=false; } Polynomial Polynomial::half(bool secondHalf)const { Polynomial ret(theRing); int numberOfTerms=terms.size(); int splitIndex=numberOfTerms/2; int I=0; for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++,I++) if((secondHalf)!=(Ifirst.exponent,i->first.exponent))best=i; i++; } marked=Term(best->second,best->first); isMarkedBool=true; } else { TermMap::iterator i=terms.begin(); if(i!=terms.end()) { Term best=Term(i->second,i->first); for(;i!=terms.end();i++) if(termOrder(best.m.exponent,i->first.exponent))best=Term(i->second,i->first); marked=best; } isMarkedBool=true; } } void Polynomial::mark(Monomial const &monomial) { assert(!terms.empty()); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) if(i->first.exponent==monomial.exponent) { marked=Term(i->second,monomial); isMarkedBool=true; return; } fprintf(Stderr,"Monomial "); AsciiPrinter(Stderr).printMonomial(monomial); fprintf(Stderr," not found in "); AsciiPrinter(Stderr).printPolynomial(*this); fprintf(Stderr,"\n"); assert(0); } void Polynomial::copyMarking(Polynomial const &p) { mark(p.marked.m); } bool Polynomial::checkMarking(IntegerVector const &w)const { if(!isMarked())return false; for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { // if(!termOrder(i->first.exponent,marked.m.exponent))return false; if(this->marked.m.exponent!=i->first.exponent) if(dotLong(marked.m.exponent,w)<=dotLong(i->first.exponent,w))return false; } return true; } bool Polynomial::checkMarking(TermOrder const &termOrder)const { if(!isMarked())return false; for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { // if(!termOrder(i->first.exponent,marked.m.exponent))return false; if(termOrder(marked.m.exponent,i->first.exponent))return false; } return true; } bool Polynomial::isHomogeneous(IntegerVector const &v)const { if(isZero())return true; return degree(v)==-degree(-v); } bool Polynomial::isHomogeneous()const { if(isZero())return true; IntegerVector v=IntegerVector::allOnes(theRing.getNumberOfVariables()); return degree(v)==-degree(-v); } void Polynomial::scaleMarkedCoefficientToOne() { assert(isMarked()); FieldElement a=marked.c.inverse(); *this*=a; marked.c=marked.c.one(); } int Polynomial::getNumberOfVariables()const { TermMap::const_iterator i=terms.begin(); if(i==terms.end())return 0; return i->first.exponent.size(); } void Polynomial::changeNumberOfVariables(PolynomialRing const &newRing) { Polynomial q(newRing); for(TermMap::iterator i=terms.begin();i!=terms.end();i++) { IntegerVector v=i->first.exponent; v.resize(newRing.getNumberOfVariables()); FieldElement e=i->second; q+=Term(e,Monomial(newRing,v)); } if(isMarked())marked.m.exponent.resize(newRing.getNumberOfVariables()); terms=q.terms; this->theRing=newRing;//This is bad style } void Polynomial::madd(const Term &m, const Polynomial &p) { if(p.terms.empty())return; //added May 7 2005 int sugar2=p.getSugar()+m.m.exponent.sum(); if(sugar2>sugar)sugar=sugar2; TermMap::iterator i=terms.lower_bound(Monomial(theRing,p.terms.begin()->first.exponent+m.m.exponent)); for(TermMap::const_iterator j=p.terms.begin();j!=p.terms.end();j++) { while(i!=terms.end() && TermMapCompare()(i->first,Monomial(theRing,j->first.exponent+m.m.exponent)))i++; if(i==terms.end()) { terms.insert(i,TermMap::value_type(Monomial(theRing,j->first.exponent+m.m.exponent),j->second*m.c)); } else { if(!TermMapCompare()(Monomial(theRing,j->first.exponent+m.m.exponent),i->first)) { // they must be equal FieldElement c=i->second+j->second*m.c; if(c.isZero()) { TermMap::iterator oldI=i; i++; terms.erase(oldI); } else { i->second=c; } } else { terms.insert(i,TermMap::value_type(Monomial(theRing,j->first.exponent+m.m.exponent),j->second*m.c)); } } } } void Polynomial::operator+=(const Polynomial &p) { if(p.terms.empty())return; //added May 7 2005 if(p.getSugar()>sugar)sugar=p.getSugar(); // fast addition // TimerScope ts(&polynomialTimer); TermMap::iterator i=terms.lower_bound(p.terms.begin()->first); for(TermMap::const_iterator j=p.terms.begin();j!=p.terms.end();j++) { while(i!=terms.end() && (terms.value_comp()(*i,*j)))i++; if(i==terms.end()) { terms.insert(i,TermMap::value_type(j->first,j->second)); } else { if(!terms.value_comp()(*j,*i)) { // they must be equal FieldElement c=i->second+j->second; if(c.isZero()) { TermMap::iterator oldI=i; i++; terms.erase(oldI); } else { i->second=c; } } else { terms.insert(i,TermMap::value_type(j->first,j->second)); } } } // slow addition /* for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) { if(terms.count(i->first)==1) { terms[i->first]=terms[i->first]+i->second; if(terms[i->first].isZero())terms.erase(i->first); } else terms[i->first]=i->second; } */ } void Polynomial::operator-=(const Polynomial &p) { if(p.terms.empty())return; //added May 7 2005 if(p.getSugar()>sugar)sugar=p.getSugar(); // fast subtraction //TimerScope ts(&polynomialTimer); TermMap::iterator i=terms.lower_bound(p.terms.begin()->first); for(TermMap::const_iterator j=p.terms.begin();j!=p.terms.end();j++) { while(i!=terms.end() && (terms.value_comp()(*i,*j)))i++; if(i==terms.end()) { terms.insert(i,TermMap::value_type(j->first,-j->second)); } else { if(!terms.value_comp()(*j,*i)) { // they must be equal FieldElement c=i->second-j->second; if(c.isZero()) { // if(i->fist.exponent==marked.exponent)marked=Term); TermMap::iterator oldI=i; i++; terms.erase(oldI); } else { i->second=c; } } else { terms.insert(i,TermMap::value_type(j->first,-j->second)); } } } // slow subtraction /* for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) { if(terms.count(i->first)==1) { terms[i->first]=terms[i->first]-i->second; if(terms[i->first].isZero())terms.erase(i->first); } else terms[i->first]=-i->second; } */ } Polynomial operator+(const Polynomial &p, const Polynomial &q) { Polynomial r(p); r+=q; return r; } Polynomial operator-(const Polynomial &p, const Polynomial &q) { Polynomial r(p); r-=q; return r; } void Polynomial::operator*=(const Term &t) { sugar+=t.m.exponent.sum(); #if 0 Polynomial p(theRing); for(TermMap::iterator i=terms.begin();i!=terms.end();i++) { FieldElement prod=i->second; prod*=t.c; p.terms.insert(p.terms.end(),TermMap::value_type(Monomial(theRing,i->first.exponent+t.m.exponent),prod)); } terms=p.terms; #else //This might violate the C++ standard but will work for any sane implementation of STL. for(TermMap::iterator i=terms.begin();i!=terms.end();i++) { (IntegerVector &)(i->first.exponent)+=t.m.exponent; i->second*=t.c; } #endif } void Polynomial::operator*=(const Monomial &m) { sugar+=m.exponent.sum(); #if 0 Polynomial p(theRing); for(TermMap::iterator i=terms.begin();i!=terms.end();i++) { FieldElement prod=i->second; p.terms.insert(p.terms.end(),TermMap::value_type(Monomial(theRing,i->first.exponent+m.exponent),prod)); } terms=p.terms; #else //This might violate the C++ standard but will work for any sane implementation of STL. for(TermMap::iterator i=terms.begin();i!=terms.end();i++)(IntegerVector &)(i->first.exponent)+=m.exponent; #endif } void Polynomial::operator*=(FieldElement const &c) { for(TermMap::iterator i=terms.begin();i!=terms.end();i++) { i->second*=c; } } void Polynomial::operator*=(Polynomial const &p) { Polynomial r(theRing); #if 0 if(terms.size()>p.terms.size()) {Polynomial q=p;q*=*this;*this=q;} else if(isZero()) *this=Polynomial(theRing); else if(terms.size()==1) *this=p*Term(terms.begin()->second,terms.begin()->first); else { Polynomial A=half(true); Polynomial B=half(false); A*=p; B*=p; *this=A+B; } #else if(terms.size()>p.terms.size()) { Polynomial q=p;q*=*this;*this=q; } else { for(TermMap::iterator i=terms.begin();i!=terms.end();i++) { r+=p*Term(i->second,i->first); } *this=r; } #endif } Polynomial operator*(const Polynomial &p, Term const &t) { Polynomial r(p); r*=t; return r; } Polynomial operator*(const Polynomial &p, Monomial const &m) { Polynomial r(p); r*=m; return r; } Polynomial operator*(const Polynomial &p, FieldElement const &c) { Polynomial r(p); r*=c; return r; } Polynomial operator*(const Polynomial &p, const Polynomial &q) { Polynomial r(p); r*=q; return r; } bool Polynomial::divides(const Polynomial &p, Polynomial *result)const { // debug<first.exponent.isZero() && terms.begin()->second.isOne(); } int Polynomial::numberOfTerms()const { return terms.size(); } IntegerVector Polynomial::exponentsSum()const { IntegerVector sum(numberOfVariablesInRing()); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) sum+=i->first.exponent; return sum; } IntegerVectorList Polynomial::exponents()const { IntegerVectorList ret; for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) ret.push_back(i->first.exponent); return ret; } IntegerVector Polynomial::greatestCommonMonomialDivisor()const { assert(!isZero()); IntegerVector ret=terms.begin()->first.exponent; for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) ret=min(ret,i->first.exponent); return ret; } IntegerVector Polynomial::degreeVector()const { IntegerVector ret(this->getRing().getNumberOfVariables()); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) ret=max(ret,i->first.exponent); return ret; } bool Polynomial::isMonomial()const { return terms.size()==1;//could it be faster to compare begin and end iterators? } int Polynomial::totalDegree()const { // int d=-1; int d=std::numeric_limits::lowest(); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) if(i->first.exponent.sum()>d)d=i->first.exponent.sum(); return d; } int Polynomial::lowestTotalDegree()const { // int d=-1; int d=std::numeric_limits::max(); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) if(d==std::numeric_limits::max() || i->first.exponent.sum()first.exponent.sum(); return d; } int64 Polynomial::degree(IntegerVector const &w)const { bool first=true; int64 d=0; for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { if(first||dotLong(i->first.exponent,w)>d)d=dotLong(i->first.exponent,w); first=false; } assert(!first); return d; } Polynomial Polynomial::homogenization(PolynomialRing const &newRing, IntegerVector const *w)const //does not compute sugar { int degree; Polynomial ret(newRing); if(w) degree=this->degree(*w); else degree=totalDegree(); IntegerVector m; for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { IntegerVector v=i->first.exponent; int d; if(w) d=dot(v,*w); else d=v.sum(); IntegerVector a(v.size()); a.grow(a.size()+1); v.grow(v.size()+1); a[a.size()-1]=degree-d; v+=a; ret+=Term(i->second,Monomial(newRing,v)); if(isMarked())if(marked.m.exponent==i->first.exponent)m=v; } if(isMarked()) { IntegerVector v=m; /* if(m.size()+1==newRing.getNumberOfVariables()) { v.grow(m.size()+1); v[m.size()]=degree-v.sum(); ret.mark(Monomial(newRing,v)); }*/ if(m.size()==newRing.getNumberOfVariables()) { ret.mark(Monomial(newRing,v)); } // assert(m.size()==newRing.getNumberOfVariables()); // ret.mark(Monomial(newRing,m)); assert(ret.isMarked()); } return ret; } Polynomial Polynomial::torusAct(FieldVector const &w)const { Polynomial ret=*this; int n=theRing.getNumberOfVariables(); assert(w.size()==n); for(TermMap::iterator i=ret.terms.begin();i!=ret.terms.end();i++) { FieldElement c=theRing.getField().zHomomorphism(1); for(int j=0;jfirst.exponent[j];k++) c*=w[j]; i->second=i->second*c; } if(isMarked()) { ret.mark(marked.m); } return ret; } /*Polynomial Polynomial::derivative()const { Polynomial ret(theRing); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { IntegerVector v=i->first.exponent; assert(v.size()==1); if(v[0]!=0) { v[0]--; ret+=Term(i->second*theRing.getField().zHomomorphism(v[0]+1),Monomial(theRing,v)); } } return ret; }*/ Polynomial Polynomial::derivative(int j)const { Polynomial ret(theRing); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { IntegerVector v=i->first.exponent; if(v[j]!=0) { v[j]--; ret+=Term(i->second*theRing.getField().zHomomorphism(v[j]+1),Monomial(theRing,v)); } } return ret; } Polynomial Polynomial::deHomogenization(PolynomialRing const &r)const { Polynomial ret=*this; int n=numberOfVariablesInRing(); assert(n>0); ret.changeNumberOfVariables(r); return ret; } Polynomial Polynomial::deHomogenizationInSameRing()const { Polynomial ret(getRing()); int n=getRing().getNumberOfVariables(); assert(n>0); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { IntegerVector v=i->first.exponent; v[n-1]=0; FieldElement e=i->second; ret+=Term(e,Monomial(theRing,v)); } if(isMarked()) { ret.marked.m.exponent=marked.m.exponent.subvector(0,n-1); ret.isMarkedBool=true; } return ret; } int Polynomial::numberOfVariablesInRing()const { return theRing.getNumberOfVariables(); // assert(terms.size()!=0); // return terms.begin()->first.exponent.size(); } void Polynomial::saturate(int variableNum)//does not compute sugar { // Should use greatestCommonMonomialDivisor() and operator* instead. if(!terms.empty()) { IntegerVector smallest=terms.begin()->first.exponent; for(TermMap::iterator i=terms.begin();i!=terms.end();i++) smallest=min(smallest,i->first.exponent); if(variableNum!=-1) { for(int j=0;jfirst.exponent-smallest),i->second)); terms=p.terms; //for(TermMap::iterator i=terms.begin();i!=terms.end();i++)i->first.exponent-=smallest; Would be faster but does not compile if(isMarked()) { marked.m.exponent-=smallest; } } } } void Polynomial::computeInitialSugar() { sugar=totalDegree(); } int Polynomial::getSugar()const { return sugar; } bool Polynomial::isMarked()const { return isMarkedBool; // return marked.m.exponent.size()!=0; } bool Polynomial::isValid(int numberOfVariables)const { if(!terms.empty()) { if(numberOfVariables==-1)numberOfVariables=numberOfVariablesInRing(); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { if(i->first.exponent.size()!=numberOfVariables) { fprintf(Stderr,"Polynomial::isValid failed!!!!\n"); return false; } } if(isMarked()) { assert(marked.m.exponent.size()==numberOfVariables); } } return true; } FieldElement Polynomial::evaluate(const FieldElement &x)const { FieldElement r=x-x; for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { IntegerVector v=i->first.exponent; assert(v.size()==1); FieldElement s=theRing.getField().zHomomorphism(1); for(int j=0;jsecond*s; } return r; } int Polynomial::maximalIndexOfVariableInSupport()const { int ret=-1; for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { IntegerVector v=i->first.exponent; for(int j=ret+1;jfirst.exponent.supportAsZeroOneVector()); } return ret; } Polynomial Polynomial::embeddedInto(PolynomialRing const &r2, list const *chosenVariables)const { Polynomial q(r2); if(chosenVariables) { assert(chosenVariables->size()==r2.getNumberOfVariables()); } for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { IntegerVector v=i->first.exponent; if(chosenVariables) v=v.subvector(*chosenVariables); else v.resize(r2.getNumberOfVariables()); FieldElement e=i->second; q+=Term(e,Monomial(r2,v)); } if(isMarked()) { IntegerVector m=marked.m.exponent; //AsciiPrinter(Stderr)<<*this<<"\n"; if(chosenVariables) m=m.subvector(*chosenVariables); else m.resize(r2.getNumberOfVariables()); q.mark(Monomial(r2,m)); } // q.marked.m.exponent.resize(r2.getNumberOfVariables()); return q; } Polynomial Polynomial::embeddedInto2(PolynomialRing const &r2, vector const &positionOfVariables)const { Polynomial q(r2); assert(positionOfVariables.size()==getRing().getNumberOfVariables()); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { IntegerVector v=i->first.exponent; v=v.expanded(r2.getNumberOfVariables(),positionOfVariables); FieldElement e=i->second; q+=Term(e,Monomial(r2,v)); } if(isMarked()) { IntegerVector m=marked.m.exponent; m=m.expanded(r2.getNumberOfVariables(),positionOfVariables); q.mark(Monomial(r2,m)); } return q; } Polynomial Polynomial::withRestrictedVariables(IntegerVector const &keepVariable, PolynomialRing const &r2)const { assert(theRing.getNumberOfVariables()==keepVariable.size()); assert(r2.getNumberOfVariables()==keepVariable.sum()); Polynomial q(r2); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) q+=Term(i->second,Monomial(r2,i->first.exponent.subvectorSubsetBoolean(keepVariable))) ; return q; } Polynomial Polynomial::withExpandedVariables(IntegerVector const &wasKeptVariables, PolynomialRing const &r1)const { assert(theRing.getNumberOfVariables()==wasKeptVariables.sum()); assert(r1.getNumberOfVariables()==wasKeptVariables.size()); Polynomial q(r1); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) q+=Term(i->second,Monomial(r1,i->first.exponent.expandedBoolean(wasKeptVariables))); return q; } int Polynomial::numberOfVariablesInUseConsecutive()const { int ret=0; for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { int a=i->first.exponent.indexOfLargestNonzeroEntry()+1; if(a>ret)ret=a; } return ret; } string Polynomial::toString(bool latex/*, bool mathMode*/)const { stringstream s; /* if(latex && !mathMode) s << "$"; */ bool first=true; if(terms.empty()) { s << "0"; return s.str(); } // If the polynomial has a marked term it is written first // printString("_"); IntegerVector e=getMarked().m.exponent; for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) if(e==i->first.exponent) { s << i->second.toString(i->first.exponent.isZero(),!first,latex); if((!i->first.exponent.isZero())&&(!i->second.isOne())&&(!(-(i->second)).isOne()))s<<"*"; s << i->first.toString(false,false,latex); first=false; } // printString("_"); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) if(e!=i->first.exponent) { s << i->second.toString(i->first.exponent.isZero(),!first,latex); if((!i->first.exponent.isZero())&&(!i->second.isOne())&&(!(-(i->second)).isOne()))s<<"*"; s << i->first.toString(false,false,latex); /* printFieldElement(i->second,i->first.exponent.isZero(),!first); if((!i->first.exponent.isZero())&&(!i->second.isOne())&&(!(-(i->second)).isOne()))printString("*"); printMonomial(i->first,false,false);*/ first=false; } /* if(latex && !mathMode) s << "$"; */ return s.str(); } bool Polynomial::checkExponentVectors()const { int n=getRing().getNumberOfVariables(); for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) if(i->first.exponent.v.size()!=n) { // log1 { // AsciiPrinter(Stderr)<<"Exponent vector length does not match ring\n"<<*this; assert(0); } return false; } return true; } double Polynomial::evaluateFloat(FloatVector const &x)const { int n=getRing().getNumberOfVariables(); assert(x.size()==n); double ret=0; for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++) { IntegerVector const v=i->first.exponent; double m=i->second.floatingPointApproximation(); for(int i=0;ifirst.exponent; ComplexNumber m=i->second.floatingPointApproximation(); for(int i=0;isecond,Monomial(r2,j->first.exponent.withIthCoordinateRemoved(i))); for(int k=0;kfirst.exponent[i];k++) temp*=Term(v,Monomial(r2)); ret+=temp; } return ret; } Polynomial Polynomial::modularRepresentative(PolynomialRing const &r2)const { Polynomial ret(r2); for(TermMap::const_iterator j=terms.begin();j!=terms.end();j++) { ret+=Term(j->second.modularRepresentative(r2.getField()),Monomial(r2,j->first.exponent)); } return ret; } Polynomial Polynomial::integralRepresentative(PolynomialRing const &r2)const { Polynomial ret(r2); for(TermMap::const_iterator j=terms.begin();j!=terms.end();j++) { ret+=Term(r2.getField().zHomomorphism(j->second.getIntegerRepresentation()),Monomial(r2,j->first.exponent)); } return ret; } bool Polynomial::operator==(Polynomial const &q)const { return !PolynomialCompare()(*this,q) && !PolynomialCompare()(*this,q); } //----------------------------------------- // PolynomialSet //----------------------------------------- void PolynomialSet::saturate(int variableNum) { for(iterator i=begin();i!=end();i++) i->saturate(variableNum); } PolynomialSet PolynomialSet::polynomialRingIntersection(PolynomialRing const &newRing, list const *chosenVariables)const { PolynomialSet ret(newRing); if(chosenVariables==0) { for(PolynomialSet::const_iterator i=begin();i!=end();i++) if(i->maximalIndexOfVariableInSupport()embeddedInto(newRing)); } } else { int n=theRing.getNumberOfVariables(); IntegerVector allowedVariables(n); for(list::const_iterator i=chosenVariables->begin();i!=chosenVariables->end();i++)allowedVariables[*i]=1; for(PolynomialSet::const_iterator i=begin();i!=end();i++) { if(i->usedVariables().divides(allowedVariables)) { ret.push_back(i->embeddedInto(newRing,chosenVariables)); } } } return ret; } void PolynomialSet::changeNumberOfVariables(PolynomialRing const &r2) { /* int numberOfVariables=0; if(n==-1) { for(PolynomialSet::const_iterator i=begin();i!=end();i++) { if(i->getNumberOfVariables()>numberOfVariables)numberOfVariables=i->getNumberOfVariables(); } } else { numberOfVariables=n; } // fprintf(Stderr,"numberOFva%i\n",numberOfVariables); for(iterator i=begin();i!=end();i++) { i->changeNumberOfVariables(numberOfVariables); } */ for(iterator i=begin();i!=end();i++) { i->changeNumberOfVariables(r2); } this->theRing=r2;//bad style } void PolynomialSet::mark(class TermOrder const &termOrder) { for(iterator i=begin();i!=end();i++) i->mark(termOrder); } void PolynomialSet::markAndScale(TermOrder const &termOrder) { mark(termOrder); scaleMarkedCoefficientsToOne(); } void PolynomialSet::copyMarkings(PolynomialSet const &g) { PolynomialSet::const_iterator j=g.begin(); for(PolynomialSet::iterator i=begin();i!=end();i++,j++) i->copyMarking(*j); } void PolynomialSet::scaleMarkedCoefficientsToOne() { for(iterator i=begin();i!=end();i++) i->scaleMarkedCoefficientToOne(); } bool PolynomialSet::checkMarkings(IntegerVector const &w)const { for(const_iterator i=begin();i!=end();i++) if(!i->checkMarking(w))return false; if(!w.isPositive())return false; return true; } bool PolynomialSet::checkMarkings(TermOrder const &termOrder)const { for(const_iterator i=begin();i!=end();i++) if(!i->checkMarking(termOrder))return false; return true; } bool PolynomialSet::containsInClosedGroebnerCone(IntegerVector const &v)const { for(const_iterator i=begin();i!=end();i++) { if(i->degree(v)>dotLong(v,i->getMarked().m.exponent))return false; } return true; } bool PolynomialSet::isHomogeneous(IntegerVector const &v)const { for(const_iterator i=begin();i!=end();i++) { if(!i->isHomogeneous(v))return false; } return true; } bool PolynomialSet::isHomogeneous()const { IntegerVector v=IntegerVector::allOnes(theRing.getNumberOfVariables()); return isHomogeneous(v); } void PolynomialSet::unionPolynomial(const Polynomial &p) { const_iterator j; for(j=begin();j!=end();j++) if((p-*j).isZero())break; if(j==end())push_back(p); } void PolynomialSet::unionSet(const PolynomialSet &s) { for(const_iterator i=s.begin();i!=s.end();i++) unionPolynomial(*i); } bool PolynomialCompare::operator()(const Polynomial &a, const Polynomial &b)const { if(a.terms.size()first.exponent,j->first.exponent))return true; if(LexicographicTermOrder()(j->first.exponent,i->first.exponent))return false; } if((a-b).isZero())return false; if((a+b).isZero())return false; // we need some way of comparing field elements /* AsciiPrinter(Stderr).printPolynomial(a); fprintf(Stderr,"\n"); AsciiPrinter(Stderr).printPolynomial(b); */ i=a.terms.begin(); for(TermMap::const_iterator j=b.terms.begin();j!=b.terms.end();j++,i++) { int s=(i->second - j->second).sign();//TODO: Make this work for fields which are not ordered if(s==1)return false; if(s==-1)return true; } // assert("Polynomial compare must be improved to handle this case"==0); return false; } PolynomialCompareMarkedTerms::PolynomialCompareMarkedTerms(TermOrder const &termOrder_): termOrder(termOrder_) { } bool PolynomialCompareMarkedTerms::operator()(const Polynomial &a, const Polynomial &b)const { return termOrder(a.getMarked().m.exponent,b.getMarked().m.exponent); } PolynomialCompareMarkedTermsReverse::PolynomialCompareMarkedTermsReverse(TermOrder const &termOrder_): termOrder(termOrder_) { } bool PolynomialCompareMarkedTermsReverse::operator()(const Polynomial &a, const Polynomial &b)const { return termOrder(b.getMarked().m.exponent,a.getMarked().m.exponent); } bool PolynomialCompareNumberOfTermsStable::operator()(const Polynomial &a, const Polynomial &b)const { return a.numberOfTerms()totalDegree())d=i->totalDegree(); return d; } void PolynomialSet::sort_() { sort(PolynomialCompare()); } void PolynomialSet::simplestPolynomialsFirst() { sort(PolynomialCompareNumberOfTermsStable()); } int PolynomialSet::numberOfVariablesInRing()const { return theRing.getNumberOfVariables(); // assert(size()!=0); // return begin()->numberOfVariablesInRing(); } bool operator==(PolynomialSet const &a, PolynomialSet const &b) { return b.isEqualTo(a); } bool PolynomialSet::isEqualTo(PolynomialSet const &a)const { if(a.size()!=size())return false; PolynomialSet::const_iterator j=begin(); for(PolynomialSet::const_iterator i=a.begin();i!=a.end();i++) { if(!(*i-*j).isZero())return false; j++; } return true; } bool PolynomialSet::isUnitIdeal()const { return division(theRing.one(),*this,StandardGradedLexicographicTermOrder()).isZero(); } IntegerVector PolynomialSet::exponentsSum()const { IntegerVector sum(numberOfVariablesInRing()); for(const_iterator i=begin();i!=end();i++) sum+=i->exponentsSum(); return sum; } PolynomialSet PolynomialSet::markedTermIdeal()const { PolynomialSet LT(theRing); for(const_iterator i=begin();i!=end();i++) { LT.push_back(Polynomial(i->getMarked())); } return LT; } void PolynomialSet::computeInitialSugar() { for(iterator i=begin();i!=end();i++) i->computeInitialSugar(); } bool PolynomialSet::isMarked()const { for(const_iterator i=begin();i!=end();i++) if(!i->isMarked())return false; return true; } PolynomialSet PolynomialSet::torusAct(FieldVector const &w)const { PolynomialSet ret(theRing); for(const_iterator i=begin();i!=end();i++) ret.push_back(i->torusAct(w)); return ret; } PolynomialSet PolynomialSet::homogenization(PolynomialRing const &newRing, IntegerVector const *w)const { PolynomialSet ret(newRing); for(const_iterator i=begin();i!=end();i++) ret.push_back(i->homogenization(newRing,w)); return ret; } list PolynomialSet::multiDeHomogenizationToKeep()const { int n=getRing().getNumberOfVariables(); FieldMatrix m=integerMatrixToFieldMatrix(rowsToIntegerMatrix(wallInequalities(*this),n),Q); m.reduce(); return m.pivotColumns(); } PolynomialSet PolynomialSet::multiDeHomogenization()const { int n=getRing().getNumberOfVariables(); list toKeep=multiDeHomogenizationToKeep(); PolynomialRing R2=PolynomialRing(getRing().getField(),toKeep.size()); return embeddedInto(R2,&toKeep); } PolynomialSet PolynomialSet::deHomogenization()const { PolynomialSet ret(PolynomialRing(theRing.getField(),theRing.getNumberOfVariables()-1)); for(const_iterator i=begin();i!=end();i++) ret.push_back(i->deHomogenization(ret.getRing())); return ret; } PolynomialSet PolynomialSet::deHomogenizationInSameRing()const { PolynomialSet ret(theRing); for(const_iterator i=begin();i!=end();i++) ret.push_back(i->deHomogenizationInSameRing()); return ret; } bool PolynomialSet::isValid()const { if(size()!=0) { int n=numberOfVariablesInRing(); for(const_iterator i=begin();i!=end();i++) if(!i->isValid(n))return false; } return true; } PolynomialSet PolynomialSet::embeddedInto(PolynomialRing const &r2, list const *chosenVariables)const { PolynomialSet ret(r2); for(const_iterator i=begin();i!=end();i++) ret.push_back(i->embeddedInto(r2,chosenVariables)); return ret; } PolynomialSet PolynomialSet::embeddedInto2(PolynomialRing const &r2, vector const &positionsOfVariables)const { PolynomialSet ret(r2); for(const_iterator i=begin();i!=end();i++) ret.push_back(i->embeddedInto2(r2,positionsOfVariables)); return ret; } PolynomialSet PolynomialSet::withRestrictedVariables(IntegerVector const &keepVariable, PolynomialRing const &r2)const { assert(theRing.getNumberOfVariables()==keepVariable.size()); assert(r2.getNumberOfVariables()==keepVariable.sum()); PolynomialSet ret(r2); for(const_iterator i=begin();i!=end();i++) ret.push_back(i->withRestrictedVariables(keepVariable,r2)); return ret; } PolynomialSet PolynomialSet::withExpandedVariables(IntegerVector const &wasKeptVariables, PolynomialRing const &r1)const { assert(theRing.getNumberOfVariables()==wasKeptVariables.sum()); assert(r1.getNumberOfVariables()==wasKeptVariables.size()); PolynomialSet ret(r1); for(const_iterator i=begin();i!=end();i++) ret.push_back(i->withExpandedVariables(wasKeptVariables,r1)); return ret; } int PolynomialSet::numberOfVariablesInUseConsecutive()const { int ret=0; for(const_iterator i=begin();i!=end();i++) { int a=i->numberOfVariablesInUseConsecutive(); if(a>ret)ret=a; } return ret; } int PolynomialSet::totalNumberOfTerms()const { int ret=0; for(const_iterator i=begin();i!=end();i++) ret+=i->numberOfTerms(); return ret; } list PolynomialSet::exponents()const { list ret; for(const_iterator i=begin();i!=end();i++)ret.push_back(i->exponents()); return ret; } FloatVector PolynomialSet::evaluateFloat(FloatVector const &x)const { assert(x.size()==numberOfVariablesInRing()); FloatVector ret(size()); int I=0; for(const_iterator i=begin();i!=end();i++,I++) ret[I]=i->evaluateFloat(x); return ret; } ComplexVector PolynomialSet::evaluateComplex(ComplexVector const &x)const { assert(x.size()==numberOfVariablesInRing()); ComplexVector ret(size()); int I=0; for(const_iterator i=begin();i!=end();i++,I++) ret[I]=i->evaluateComplex(x); return ret; } PolynomialSet PolynomialSet::withIthVariableSubstituted(PolynomialRing const &r2, int i, FieldElement const &v)const { PolynomialSet ret(r2); for(const_iterator j=begin();j!=end();j++) ret.push_back(j->withIthVariableSubstituted(r2,i,v)); return ret; } void PolynomialSet::removeZeros() { for(PolynomialSet::iterator i=begin();i!=end();i++) { if(i->isZero()) { PolynomialSet::iterator j=i; j++; erase(i); j--; i=j; } } } void PolynomialSet::removeDuplicates() { sort_(); unique(); } PolynomialSet PolynomialSet::modularRepresentative(PolynomialRing const &r2)const { PolynomialSet ret(r2); for(PolynomialSet::const_iterator i=begin();i!=end();i++) ret.push_back(i->modularRepresentative(r2)); return ret; } gfan0.8beta/src/traverser_resultantfanspecialization.cpp0000664000175000017500000006357615177170257023461 0ustar andersanders/* * traverser_resultantfanspecialization.cpp * * Created on: Jul 1, 2011 * Author: anders */ #include "traverser_resultantfanspecialization.h" #include "traverser_secondaryfan.h" #include "halfopencone.h" class Shrinking { public: IntegerVector subset; int newCount; public: Shrinking(IntegerVector const &subset_): subset(subset_), newCount(subset_.sum()) { } Shrinking(set const &subsetIndices, int N): subset(N), newCount(subsetIndices.size()) { for(set::const_iterator i=subsetIndices.begin();i!=subsetIndices.end();i++)subset[*i]=1; } IntegerVector shrink(IntegerVector const &a)const { assert(a.size()==subset.size()); IntegerVector ret(newCount); int I=0; for(int i=0;i=0){if(subset[old])ret++;old--;} return ret; } int oldPosition(int n) { assert(n=0); int ret=0; while(n>=0){if(subset[ret++])n--;} return ret-1; } vector > shrinkIntervals(vector >const &intervals) { vector > ret; for(vector >::const_iterator i=intervals.begin();i!=intervals.end();i++) ret.push_back(pair(newPosition(i->first),newPosition(i->second))); return ret; } }; bool isSpecializedResultantEmpty(IntegerMatrix const &exponents, vector > const &intervals, IntegerVector const &isSpecial) { /* * This check is done by creating a new point configuration whose resultant is full-dimensional iff the specialized resultant is non-empty. */ list > extended; int nnonspecial=isSpecial.size()-isSpecial.sum(); int I=0; int J=0; for(vector >::const_iterator i=intervals.begin();i!=intervals.end();i++) { list temp; for(int j=i->first;j!=i->second;j++,I++) { IntegerVector t(nnonspecial); if(!isSpecial[I])t[J++]=1; temp.push_back(concatenation(exponents.column(I),t)); } extended.push_back(temp); } IntegerVector choice; // for(list::const_iterator i=extended.begin();i!=extended.end();i++)debug<<*i; return (coDimensionOfResultantVariety(extended,exponents.getHeight()+nnonspecial,&choice)!=0); } /** * The number of columns in the cayley configuration is n, which is also the number of entries of special and subset. Those are considered to be vectors of bools. * The subset tells the routine which columns of cayley to consider. The rest is simply ignored and zeroes are returned for those entries. * This routine will compute a vector in the resultant fan of the cayley, but outside the lineality space - that is the rowspace of cayley. */ IntegerVector nonTrivialVectorInSpecializedResultant(IntegerMatrix const &exponents, vector > const &intervals, IntegerVector const &subset, IntegerVector const &isSpecial) { if(!(subset-IntegerVector::allOnes(subset.size())).isZero()) { Shrinking s(subset); IntegerMatrix exponents2=exponents.submatrixColumnSubsetBoolean(subset); vector > intervals2=s.shrinkIntervals(intervals); IntegerVector subset2=IntegerVector::allOnes(subset.sum()); IntegerVector isSpecial2=s.shrink(isSpecial); IntegerVector ret2=nonTrivialVectorInSpecializedResultant(exponents2,intervals2,subset2,isSpecial2); return s.expand(ret2); } // After this we may assume that subset is everything. assert(isSpecial.size()==exponents.getWidth()); PolyhedralCone subspace=specializedToSubspace(isSpecial); // A will be the cayley embedding of the cofingurations - that is the matrix whose secodary fan we consider IntegerMatrix A=exponents; for(vector >::const_iterator i=intervals.begin();i!=intervals.end();i++) A.appendRow(IntegerVector::interval(subset.size(),i->first,i->second)); log1 D(A.getRows()); log1 D(isSpecial); // We compute the linality space the stable intersection PolyhedralCone linealityIntersection=intersection(PolyhedralCone::givenByRays(IntegerVectorList(),A.getRows(),A.getWidth()),subspace); int linealitySpaceDim=linealityIntersection.dimension(); // Check if stable intersection is only the lineality space, by computing its dimension. // We need to transform the exponent matrix in to a list of lists of exponents, // then compute the dimension of this, and subtract the codimension of the subspace. { list > nonExtended; int I=0; int J=0; for(vector >::const_iterator i=intervals.begin();i!=intervals.end();i++) { list temp; for(int j=i->first;j!=i->second;j++,I++) temp.push_back(exponents.column(I)); nonExtended.push_back(temp); } int bigCodimension=coDimensionOfResultantVariety(nonExtended,exponents.getHeight(),0); if(isSpecial.size()-(bigCodimension+isSpecial.sum())<=linealitySpaceDim) return IntegerVector(isSpecial.size()); } // We now know that there is a vector outside the lineality space to be found. // We run through all edge choices. SelectionIterator iter(intervals); do { // For this edge choice, build the corresponding cone in the the tropical resultant IntegerVectorList gen; int I=0; for(int i=0;ilinealitySpaceDim) { // We find generators of the intersection cone (and linality space). One of these must be outside // the linality space of the stable intersection and can be returned. inter.canonicalize(); IntegerVectorList candidates=inter.extremeRays(); IntegerVectorList candidates2=inter.generatorsOfLinealitySpace(); for(IntegerVectorList::const_iterator i=candidates2.begin();i!=candidates2.end();i++)candidates.push_back(*i); for(IntegerVectorList::const_iterator i=candidates.begin();i!=candidates.end();i++) { if(!linealityIntersection.contains(*i)) return *i; } debug<<"NOT FOUND - THIS IS A BUG"; assert(0); } } while(++iter); debug<<"NOT FOUND2 - THIS IS A BUG"; assert(0); return IntegerVector(isSpecial.size()); } /** * ToBeAvoided should be contained in the rowspace of the cayley + span of the standard vectors corresponding to * the variables not in the subproblem. It should also be contained in the non-special space. * * The to avoided space is a */ IntegerVectorList perturbationSequenceRek(IntegerMatrix const &exponents, vector > const &intervals, IntegerVector const &subset, IntegerVector const &isSpecial, PolyhedralCone const &toBeAvoided) { log1 debug<<"INSUBSET"< > intervals2=s.shrinkIntervals(intervals); for(vector >::const_iterator i=intervals2.begin();i!=intervals2.end();i++) A.appendRow(IntegerVector::interval(A.getWidth(),i->first,i->second)); } */ IntegerMatrix B=exponents; for(vector >::const_iterator i=intervals.begin();i!=intervals.end();i++) B.appendRow(IntegerVector::interval(B.getWidth(),i->first,i->second)); for(int k=0;k > intervals2=s.shrinkIntervals(intervals); for(vector >::const_iterator i=intervals.begin();i!=intervals.end();i++)newCayley.appendRow(s.shrink(IntegerVector::interval(exponents.getWidth(),i->first,i->second))); Triangulation2 theTriangulation(newCayley); log1 debug<<"omega"< > subproblems=mixedCells(intervals2,theTriangulation,newCayley.transposed(),newOmega); log1 D((int)subproblems.size()); // At this point we forgot the codimension of the resultant fan and need to recompute it. // Does this really handle specialization correctly? int minimalcodim=100; for(set >::const_iterator i=subproblems.begin();i!=subproblems.end();i++) { IntegerVector newSubset(subset.size()); for(set::const_iterator j=i->begin();j!=i->end();j++)newSubset[s.oldPosition(*j)]=1; { // D(exponents.getRows()); // D(newSubset); Shrinking S(newSubset); IntegerMatrix exponents2=rowsToIntegerMatrix(S.shrink(exponents.getRows()),S.newCount); // D(exponents2.getRows()); IntegerVectorListList tuple2; vector >intervals2=S.shrinkIntervals(intervals); for(vector >::const_iterator i=intervals2.begin();i!=intervals2.end();i++) { IntegerVectorList temp; for(int j=i->first;jsecond;j++)temp.push_back(exponents2.transposed()[j]); tuple2.push_back(temp); } // D(tuple2); int codimension=coDimensionOfResultantVariety(tuple2,exponents.getHeight(),0); // D(codimension); if(codimension >::const_iterator i=subproblems.begin();i!=subproblems.end();i++) { IntegerVector newSubset(subset.size()); for(set::const_iterator j=i->begin();j!=i->end();j++)newSubset[s.oldPosition(*j)]=1; { // D(exponents.getRows()); // D(newSubset); Shrinking S(newSubset); IntegerMatrix exponents2=rowsToIntegerMatrix(S.shrink(exponents.getRows()),S.newCount); IntegerVectorListList tuple2; vector >intervals2=S.shrinkIntervals(intervals); for(vector >::const_iterator i=intervals2.begin();i!=intervals2.end();i++) { IntegerVectorList temp; for(int j=i->first;jsecond;j++)temp.push_back(exponents2.transposed()[j]); tuple2.push_back(temp); } // D(tuple2); int codimension=coDimensionOfResultantVariety(tuple2,exponents.getHeight(),0); // D(codimension); if(codimension!=minimalcodim)continue; } log1 debug<<"Iterating\n"; IntegerVectorList ret=perturbationSequenceRek(exponents,intervals,newSubset,isSpecial,newToBeAvoided); // Perturb the returned vector to make it generic in the big resultant: // for(int k=0;kcount(k)==0)ret.push_back(IntegerVector::standardVector(subset.size(),k)); // We add to our found omega epsilon times the vector found recursively and return: ret.push_front(omega); // debug<<"RETURNING"< > intervals_, IntegerVector const &isSpecial_, IntegerVector omega, int dim): ConeTraverser(cayley.getHeight()), theTriangulation(cayley.transposed()), theCone(0), theConfiguration(cayley), // g(g_), tuple(tuple_), isSpecial(isSpecial_), intervals(intervals_), subspace(specializedToSubspace(isSpecial_)), D1(D_) { log1 debug<<"OMEGA"<>C; C.canonicalize(); /* IntegerVectorList inequalities=C.getHalfSpaces(); IntegerVectorList equations=C.getEquations(); for(IntegerVectorList::const_iterator i=inequalities.begin();i!=inequalities.end();i++) if((dotLong(ridgeVector,*i)==0)&&(dotLong(rayVector,*i)==0))equations.push_back(*i); theCone=PolyhedralCone(inequalities,equations,C.ambientDimension()); */ IntegerVectorList temp;temp.push_back(ridgeVector);temp.push_back(rayVector); theCone=C.faceContainingPerturbed(temp); //debug>>theCone; theCone.canonicalize(); assert(theCone.contains(ridgeVector)); assert(theCone.link(ridgeVector).contains(rayVector)); theCone=intersection(theCone,subspace); theCone.canonicalize(); assert(theCone.dimension()==d); assert(theCone.contains(ridgeVector)); assert(theCone.link(ridgeVector).contains(rayVector)); } IntegerVectorList ResultantFanSpecializationTraverser::link(IntegerVector const &ridgeVector) { // debug<<"Ridge"< > subproblems=mixedCells(intervals,theTriangulation,theConfiguration,ridgeVector); set ret; // debug<<"\nNPROBLEMS:"<<(int)subproblems.size()<<"\n"; for(set >::const_iterator i=subproblems.begin();i!=subproblems.end();i++) { /* debug<<"\nPROBLEM"; for(set::const_iterator j=i->begin();j!=i->end();j++) { debug<<*j; } */ IntegerVector subset(n); for(set::const_iterator j=i->begin();j!=i->end();j++)subset[*j]=1; Shrinking S(subset); vector > intervals2=S.shrinkIntervals(intervals); vector subproblem;for(set::const_iterator j=i->begin();j!=i->end();j++)subproblem.push_back(*j); #if 1 // Compute link in stable intersection by computing a restricted secondary fan and checking its rays { IntegerVectorList subMatrix; IntegerVector subIsSpecial(i->size()); int J=0; for(set::const_iterator j=i->begin();j!=i->end();j++,J++) { subMatrix.push_back(theConfiguration[*j]); subIsSpecial[J]=isSpecial[*j]; } IntegerMatrix subA=rowsToIntegerMatrix(subMatrix); PolyhedralCone subSubSpace=specializedToSubspace(subIsSpecial); // debug<<"SUBA"< > theMixedCells=mixedCells(intervals2,t,subA.transposed(),*i); log1 debug<<"TESTINGAAA"<<(int)theMixedCells.size()<<"\n"; {for(set >::const_iterator i=theMixedCells.begin();i!=theMixedCells.end();i++) { log1 debug<<"\nMIXEd"; for(set::const_iterator j=i->begin();j!=i->end();j++) { log1 debug<<*j; } log1 debug<<"\n"; } } if(theMixedCells.size()) { // we now know that the ray is in the resultantant of the link, but not necessarily in the // specialized resultant. We need to check if this is the case by checking if the specialized // resultants of the subconfigurations are non-empty. bool isInSpecializedResultant=false; for(set >::const_iterator j=theMixedCells.begin();j!=theMixedCells.end();j++) { Shrinking S(*j,n); IntegerMatrix subA3=subA.submatrixColumnSubsetBoolean(S.expand(IntegerVector::allOnes(j->size()))); subA3=subA3.submatrix(intervals.size(),0,subA3.getHeight(),subA3.getWidth()); log1 debug<<"subA3:"< > intervals3=S.shrinkIntervals(intervals2); //debug<<"subA3:"< > ::const_iterator k=intervals3.begin();k!=intervals3.end();k++) { log1 debug<first<second<<"\n"; } if(!isSpecializedResultantEmpty(subA3,intervals3,isSpecial3)){isInSpecializedResultant=true;break;} } if(isInSpecializedResultant)ret.insert(S.expand(*i)); } log1 debug<<"TESTINGBBB\n"; } } } } #else // compute linke in stable intersection as a projection // vector > intervals=subsetToIntervals(g,*i); SelectionIterator iterator(intervals2); int numberOfIterations=0; do { IntegerVectorList generators; for(int j=0;jcount(j)))generators.push_back(IntegerVector::standardVector(n,j)); int I=0; for(int i=0;i::const_iterator i=ret.begin();i!=ret.end();i++) ret2.push_back(*i); // debug<<"LINK AT"< #include #include "cstdio" using namespace std; namespace linalgfloat { std::ostream& operator<<(std::ostream& s, const Vector &v) { s<<"("; for(int j=0;jlast) { ret[i++]=v[++last]; // cerr<<"("<<(i-1)<<","< #include #include "vektor.h" #include "polynomial.h" #include "termorder.h" class SymmetryGroup{ unsigned char *byteTable; int byteTableHeight; class Trie *trie; public: typedef set ElementContainer2; typedef vector ElementContainer; ElementContainer elements; int sizeOfBaseSet()const; /** Applies the permutation v to each vector in the list l. */ static IntegerVectorList permuteIntegerVectorList(IntegerVectorList const &l, IntegerVector const &v); static void appendPermutedIntegerVectorList(IntegerVectorList const &l, IntegerVector const &v, IntegerVectorList &dest); static Polynomial permutePolynomial(const Polynomial &p, IntegerVector const &v); static PolynomialSet permutePolynomialSet(PolynomialSet const &s, IntegerVector const &v); Polynomial computeUniqueRepresentative(Polynomial p); static IntegerVector compose(IntegerVector const &perm, IntegerVector const &b); static void composeAssign(IntegerVector const &perm, IntegerVector const &b, IntegerVector &dest); static IntegerVector composeInverse(IntegerVector const &perm, IntegerVector const &b); static IntegerVectorList permuteInverseIntegerVectorList(IntegerVector const &perm, IntegerVectorList const &l); static IntegerVector identity(int numberOfElements); static IntegerVector inverse(IntegerVector const &a); static bool isPermutation(IntegerVector const &a); /** * Takes a permutation of variables and sign changes of variables and combines them in to a single permutation of the variables and their inverses. That is, the permutation is a permutation on 2n elements. */ static IntegerVector combinePermutationAndSignChanges(IntegerVector const &permutation, IntegerVector const &signChanges); /** * Does the opposite transformation as combinePermutationAndSignChanges. */ static void extractPermuationAndSignChanges(IntegerVector const &v, IntegerVector &permutation, IntegerVector &signChanges); /** The set of vectors which are not improved lexicographically when perm is applied to them is convex. Its closure is a halfspace. This routine returns the inner normal of this halfspace. The only exception is if perm is the identity then the zero vector is returned. If alternative is true, then a different strategy of obtaining a fundamental domain is used. */ static IntegerVector fundamentalDomainInequality(IntegerVector const &perm, bool alternative=false); /** The set of vectors which cannot be improved lexicographically by applying an element from the group is a convex set. Its closure is a polyhedral cone. This routine returns a set of inequalities The returned list does not contain the zero vector. If alternative is true, then a different strategy of obtaining a fundamental domain is used. */ IntegerVectorList fundamentalDomainInequalities(bool alternative=false)const; SymmetryGroup(int n); // void computeClosure(IntegerVector const &v); void computeClosure(IntegerVectorList const &l); IntegerVectorList getUniqueGenerators()const; int orbitSize(IntegerVector const &stable)const; bool isTrivial()const; void print(FILE *f); /** The symmetry group acts on vectors by permuting the entries. The following routine returns a unique representative for the orbit containing v. This makes it easy to check if two elements are in the same orbit. The permutation used to get this representative is stored in *usedPermutation (if pointer not 0). */ IntegerVector orbitRepresentative(IntegerVector const &v, IntegerVector *usedPermutation=0)const; IntegerVector orbitRepresentative(IntegerVector const &v, int &usedPermutationIndex)const; IntegerVector const &referenceToIthVector(int index)const; /** This routine works as orbitRepresentative() except that the symmetry group considered is only the subgroup keeping the vector fixed fixed. */ IntegerVector orbitRepresentativeFixing(IntegerVector const &v, IntegerVector const &fixed)const; // Methods for highly optimized symmetry group computations: void createByteTable();//Can only be called once. SymmetryGroup is not allowed to be changed afterwards or to be copied. Leaks memory at destruction. void createTrie(); unsigned char *getByteTable()const; int getByteTableHeight()const; IntegerVectorList stabilizer(IntegerVector const &v)const; }; /** * Sorts v and returns the number of swaps performed. */ int mergeSort(IntegerVector &v); #endif gfan0.8beta/src/lattice.h0000664000175000017500000000010715177170257014766 0ustar andersanders#include "vektor.h" bool isPartOfAZBasis(IntegerVectorList const &l); gfan0.8beta/src/myassert.h0000664000175000017500000000067315177170257015220 0ustar andersanders/* * myassert.h * * Created on: Jul 10, 2011 * Author: anders */ #ifndef MYASSERT_H_ #define MYASSERT_H_ /* * This header does not have to be included, unless an explicit dumpStackTrace call is needed. * Compiling (using gcc) with -DSTACKDUMP_ENABLED -D__assert_fail=__assert_fail2 (and linking the * .o file) will make the assertions fail with a stack dump automatically. */ void dumpStackTrace(); #endif /* MYASSERT_H_ */ gfan0.8beta/src/app_transposematrix.cpp0000664000175000017500000000141515177170257020002 0ustar andersanders#include "vektor.h" #include "printer.h" #include "parser.h" #include "gfanapplication.h" #include "lp.h" class TransposeMatrixApplication : public GFanApplication { public: bool includeInDefaultInstallation() // Not included since the program has no relation to the main programs { return false; } TransposeMatrixApplication() { registerOptions(); } const char *name() { return "_transposematrix"; } int main() { lpSetSolver("cddgmp"); FileParser P(Stdin); IntegerVectorList v=P.parseIntegerVectorList(); AsciiPrinter(Stdout).printVectorList(transposeIntegerVectorList(v)); return 0; } const char *helpText() { return "Takes a matrix and transposes it.\n"; } }; static TransposeMatrixApplication theApplication; gfan0.8beta/src/app_generictropicalspecialization.cpp0000664000175000017500000000651515177170257022656 0ustar andersanders/* * app_generictropicalspecialization.cpp * * Created on: Nov 20, 2025 * Author: anders */ #include "parser.h" #include "printer.h" #include "polynomial.h" #include "buchberger.h" #include "wallideal.h" #include "termorder.h" #include "gfanapplication.h" #include "tropical2.h" #include "matrix.h" #include "field_rationalfunctions.h" #include "field_rationalfunctions2.h" class GenericTropicalSpecialisationApplication : public GFanApplication { SimpleOption optionMinT; SimpleOption optionNonGeneric; public: bool includeInDefaultInstallation() { return false; } const char *helpText() { return "This program takes a set of polynomials in a ring k[m_1,...,m_N,x_1,...,x_n] and a choice of valuation for m_1,...,m_n. For each polynomial it is determined which tropical hypersurface would appear if m_1,...,m_n are specialized to values with these valuations - or rather a defining polynomial polynomial is produced (its tropicalisation defines the hypersurface) with coefficients being functions in t. If the coefficients of the values are chosen generically this procedure is always successful. On the other hand if the first coefficients of the values could be algebraically dependent, the process might fail, since cancellations might make it impossible to determine valuations of coefficients after substitution. By using the option --nongeneric the polynomials having this problem will be filtered out.\n"; } GenericTropicalSpecialisationApplication(): optionMinT("--mint","In a field with parameter t this option decides if maximal or minimal degrees of t determine the valuation."), optionNonGeneric("--nongeneric","Remove polynomials from the output if the tropical hypersurface cannot trivially be determined without the assumption that the first coefficients of the specialisation values are generic.") { registerOptions(); } const char *name() { return "_generictropicalspecialization"; } int main() { // debug<<"IF COEFFICIENTS ARE NOT SINGLE TERMS THE TROPICALISATION WILL DEPEND ON WHICH CONVENTION IS USED -- AT THE MOMENT THIS IS MAX FOR COEFFICIENTS\n"; FileParser P(Stdin); auto valuations=P.parseIntegerVector(); PolynomialSet g=P.parsePolynomialSetWithRing(); auto g2=makeVariablesParameters(makeVariablesParameters(g.getRing(),valuations.size()),g); AsciiPrinter(Stderr).printPolynomialRing(g2.getRing()); AsciiPrinter(Stderr).printPolynomialSet(g2); auto CoefRing=FieldRationalFunctions(g.getRing().getField(),string("t")); PolynomialRing r(CoefRing,g2.getRing().getVariableNames()); int signFlip=1; if(optionMinT.getValue()) { valuations=-valuations; signFlip=-1; } PolynomialSet g3(r); for(auto const &f:g2) { Polynomial F(r); bool polyOK=true; for(TermMap::const_iterator i=f.terms.begin();i!=f.terms.end();i++) { auto p=getNumeratorAndDenominatorOfRationalFunction2(i->second).first; if(!initialForm(p,valuations).isMonomial())polyOK=false; int exp=signFlip*p.degree(valuations); Polynomial tt=Polynomial(Term(CoefRing.exponent(exp),Monomial(r,i->first.exponent))); F=F+tt; } if(polyOK || optionNonGeneric.getValue()==false) g3.push_back(F); } pout<terms.begin();j!=i->terms.end();j++) return j->second; assert(0); return a; } /* * This procedure does not work */ static PolynomialSet singleSaturation(PolynomialSet const &s)//TO DO: call idealIntersection to do the intersection { assert(0); PolynomialRing theRing=s.getRing(); int n=s.numberOfVariablesInRing(); FieldElement one=getFieldElement(s).one(); // add a variable // PolynomialSet s2=s;s2.changeNumberOfVariables(n+1); IntegerVector temp(theRing.getNumberOfVariables()); PolynomialSet s2=s.homogenization(theRing.withVariablesAppended("T"),&temp); /* IntegerMatrix mat(n+1,n); for(int i=0;i const &rays; IntegerVector const &permutation; Pair(vector const &rays_, int rayIndex_, IntegerVector const & permutation_): rays(rays_), rayIndex(rayIndex_), permutation(permutation_) { } bool operator<(Pair const &b)const { return SymmetryGroup::compose(permutation,rays[rayIndex]) rays; void print() { for(set::const_iterator i=rays.begin();i!=rays.end();i++) { fprintf(Stderr,"--:%i ",i->rayIndex); AsciiPrinter(Stderr).printVector((i->permutation)); fprintf(Stderr,"\n"); } } }; static list computeFacets(SymmetricComplex::Cone const &theCone, IntegerMatrix const &rays, IntegerVectorList const &facetCandidates, SymmetricComplex const &theComplex/*, int linealityDim*/) { set ret; for(IntegerVectorList::const_iterator i=facetCandidates.begin();i!=facetCandidates.end();i++) { set indices; bool notAll=false; for(vector::const_iterator j=theCone.indices.begin();j!=theCone.indices.end();j++) if(dotLong(rays[*j],*i)==0) indices.insert(*j); else notAll=true; SymmetricComplex::Cone temp(indices,theCone.dimension-1,0,false,theComplex); /* temp.multiplicity=0; temp.dimension=theCone.dimension-1; temp.setIgnoreSymmetry(true); */ if(notAll)ret.insert(temp); } // fprintf(Stderr,"HEJ!!!!\n"); list ret2; for(set::const_iterator i=ret.begin();i!=ret.end();i++) { bool isMaximal=true; /* if(i->indices.size()+linealityDimdimension)//#3 isMaximal=false; else*/ for(set::const_iterator j=ret.begin();j!=ret.end();j++) if(i!=j && i->isSubsetOf(*j)) { isMaximal=false; break; } if(isMaximal) { SymmetricComplex::Cone temp(i->indexSet(),i->dimension,i->multiplicity,true,theComplex); // temp.setIgnoreSymmetry(false); ret2.push_back(temp); } } return ret2; } SymmetricComplex dualMinkowskiMixed(PolynomialSet const &g, SymmetryGroup const &sym, PolyhedralFan const &cones) { /* The set of rays of the dual fan is the vertices of the Minkowski sum after centering around zero. We only generate them up to symmetry. */ int n=cones.getAmbientDimension(); int nMaxOrbits=0; for(PolyhedralFan::coneIterator i=cones.conesBegin();i!=cones.conesEnd();i++)nMaxOrbits++; vector rays(nMaxOrbits); FieldVector translationVector(Q,n); for(PolynomialSet::const_iterator i=g.begin();i!=g.end();i++) translationVector+=Q.zHomomorphism(i->numberOfTerms()).inverse()*integerVectorToFieldVector(i->exponentsSum(),Q); { int j=0; for(PolyhedralFan::coneIterator i=cones.conesBegin();i!=cones.conesEnd();i++,j++) { FieldVector temp=integerVectorToFieldVector(i->getRelativeInteriorPoint(),Q); temp+=(Q.zHomomorphism(-1)*translationVector); rays[j]=temp.primitive(); } } fprintf(Stderr,"The new rays:\n"); for(int i=0;i newCones(primaryRays.size()); IntegerVectorList::const_iterator K=primaryRays.begin(); for(int k=0;kcontains(v)) { newCones[k].rays.insert(MyCone::Pair(rays,j,*l)); } } } } fprintf(Stderr,"Facets with their vertices:\n"); for(int k=0;k > allRaysIndices(nMaxOrbits); { int j=0; for(PolyhedralFan::coneIterator i=cones.conesBegin();i!=cones.conesEnd();i++,j++) { int k=0; for(IntegerVectorList::const_iterator l=allPrimaryRays.begin();l!=allPrimaryRays.end();l++,k++) if(i->contains(*l))allRaysIndices[j].insert(k); } } fprintf(Stderr,"Facets with their vertices (as indices):\n"); for(int k=0;k::const_iterator j=allRaysIndices[k].begin();j!=allRaysIndices[k].end();j++) fprintf(Stderr,"%i ",*j); fprintf(Stderr,"\n\n"); // newCones[k].print(); } /* We prepare the complex to return. */ SymmetricComplex ret(n,allPrimaryRays,sym); /* For every dual cone we need to compute facet normal. This is done by cddlib. Afterward we use these facet normals to add the faces of the dual cone to our collection of cones (pre-complex) - each time checking that the corresponding face is mixed. */ fprintf(Stderr,"Adding mixed faces for cones:\n"); for(int k=0;k::const_iterator i=newCones[k].rays.begin();i!=newCones[k].rays.end();i++) { a.push_back(SymmetryGroup::compose(i->permutation,rays[i->rayIndex])); } AsciiPrinter(Stderr).printVectorList(a); IntegerVectorList empty; PolyhedralCone C(a,empty,n); IntegerVectorList facetCandidates=C.extremeRays(); fprintf(Stderr,"Cone %i\nFacetNormals:\n",k); AsciiPrinter(Stderr).printVectorList(facetCandidates); /* list clist; { set indices; for(int j=0;j facets=computeFacets(theCone,rays,facetCandidates,c); clist.splice(clist.end(),facets); } clist.pop_front(); } */ } /* For every cone in the final "pre-complex" we translate it into a cone in the primary */ return ret; } gfan0.8beta/src/gfanlib_traversal.cpp0000664000175000017500000003332715177170257017373 0ustar andersanders#include "gfanlib_traversal.h" #include "gfanlib_symmetry.h" #include #include #include //#include "log.h" using namespace std; using namespace gfan; static list rowsToList(ZMatrix const &m) { list ret; for(int i=0;i EFirst; struct ESecond{// L2 maybe zero, in that case i1==i2 list* L1; list::iterator i1; list *L2; list::iterator i2; ESecond():L1(0),L2(0){}; ESecond(list* L1_,list::iterator i1_,list* L2_,list::iterator i2_): L1(L1_), i1(i1_), L2(L2_), i2(i2_) { } }; SymmetryGroup const &sym; map theSet; int theSetSize; public: Boundary(SymmetryGroup const &sym_): sym(sym_), theSetSize(0) { } int size()const { return theSetSize; } pair normalForm(ZVector const &ridge, ZVector const &ray)const { pair ret; Permutation perm(ridge.size()); ret.first=sym.orbitRepresentative(ridge,&perm); ret.second=sym.orbitRepresentativeFixing(perm.apply(ray),ret.first); return ret; } bool containsFlip(ZVector const &ridge, ZVector const &ray, list *storedInList_, list::iterator listIterator_, list *storedInList2_, list::iterator listIterator2_) { assert(ridge.size()==ray.size()); EFirst p=normalForm(ridge,ray); if(theSet.count(p)==1) { theSet[p].L1->erase(theSet[p].i1); if(theSet[p].L2)theSet[p].L2->erase(theSet[p].i2); theSet.erase(p); theSetSize--; return true; } theSet[p]=ESecond(storedInList_,listIterator_,storedInList2_,listIterator2_); theSetSize++; return false; } /** * This routine remove rays from rays, such that only one ridge-ray pair is left for each orbit. * The routine allows an additional list of vectors with the same number of elements as rays to be passed. * The routine will remove those vectors from this set which correspond to rays removed from rays. * * To do this it must know the symmetry group. */ void removeDuplicates(ZVector const &ridge, list &rays, list *normals=0)const { list ret; list normalsRet; set representatives; list::const_iterator I; if(normals)I=normals->begin(); for(list::const_iterator i=rays.begin();i!=rays.end();i++) { ZVector rep=sym.orbitRepresentativeFixing(*i,ridge); if(representatives.count(rep)==0) { representatives.insert(rep); ret.push_back(*i); if(normals)normalsRet.push_back(*I); } if(normals)I++; } rays=ret; if(normals)*normals=normalsRet; } void print()const { cerr<< "Boundary" <::const_iterator i=theSet.begin();i!=theSet.end();i++) { cerr << i->first.first << i->first.second; cerr << endl; } cerr< rays; ZVector parentRay; }; struct pathStepFacet { list ridges; list ridgesRayUniqueVector;//stores the ray of the link that we came from }; }; /** We need to simulate two mutually recursive functions. An actual implementation of these two functions would probably not work since the recursion depth could easily be 10000. Here follows a sketch of the simulation lav kegle find ridges skriv ned i objekt put paa stakken L1: if ridges in top element compute tropical curve construct stak object with rays; set parrentRidge,ridgeRays push ridge else pop facet if empty break; goto L2 L2: if(ridgeRays not empty) change CONE <---entry point push facet else pop ridge change CONE goto L1 The strategy for marking is as follows Before a vertex is pushed the edges that needs to be taken are written in its data. A edge is only written if its orbit has not been marked. Each time an edge is written it is simultaneously marked. */ static void printStack(list const &facetStack, list const &ridgeStack) { list::const_iterator i=facetStack.begin(); list::const_iterator j=ridgeStack.begin(); cerr<<"STACK:"<ridgeStack.size())goto entry; do { cerr<<"RIDGE:"<parentRidge<rays<parentRay; cerr<ridges; cerr<> a; } void traverse(FanTraverser &traverser, Target &target, SymmetryGroup const *symmetryGroup) { //TO DO: at the moment a conetraverser can only report that it has no state if it is traversing a complete fan. //This is because symmetricTraverse needs go BACK to compute the links of previously seen facets. //Alternative the links should be computed and stored the first time a facet is seen. //Or the conetraverse should be given more info about the ridge to make computations quicker. int lastNumberOfEdges=0; float averageEdge=0; int n=traverser.refToPolyhedralCone().ambientDimension();//symmetryGroup->sizeOfBaseSet(); SymmetryGroup localSymmetryGroup(n); if(!symmetryGroup)symmetryGroup=&localSymmetryGroup; ZMatrix linealitySpaceGenerators=traverser.refToPolyhedralCone().generatorsOfLinealitySpace(); int d=traverser.refToPolyhedralCone().dimension(); Boundary boundary(*symmetryGroup); list facetStack; list ridgeStack; int numberOfCompletedFacets=0; int numberOfCompletedRidges=0; int stackSize=0; ZVector facetUniqueVector; goto entry; while(1) { L1: // printStack(facetStack,ridgeStack); //if we have more ProcessRidge calls to do if(!facetStack.front().ridges.empty()) { //ProcessRidge "called" pathStepRidge top; if(traverser.hasNoState()) top.parentRay=facetStack.front().ridgesRayUniqueVector.front(); else { ZCone link=traverser.refToPolyhedralCone().link(facetStack.front().ridges.front()); link.canonicalize(); top.parentRay=link.getUniquePoint(); } top.parentRidge=facetStack.front().ridges.front(); // AsciiPrinter(Stderr)< rays; if(traverser.hasNoState()) { rays.push_back(top.parentRay); rays.push_back(-top.parentRay); } else rays=traverser.link(facetStack.front().ridges.front()); assert(!rays.empty()); boundary.removeDuplicates(top.parentRidge,rays); ridgeStack.push_front(top);stackSize++; ZVector ridgeRidgeRidge=facetStack.front().ridges.front(); for(list::const_iterator i=rays.begin();i!=rays.end();i++) { ridgeStack.front().rays.push_front(*i); if(boundary.containsFlip(ridgeRidgeRidge,*i,&ridgeStack.front().rays,ridgeStack.front().rays.begin(),0,ridgeStack.front().rays.begin())) ridgeStack.front().rays.pop_front(); } // "state saved" ready to do calls to ProcessFacet numberOfCompletedRidges++; } else { // No more calls to do - we now return from ProcessFacet //THIS IS THE PLACE TO CHANGE CONE BACK facetStack.pop_front();stackSize--; if(facetStack.empty())break; // log1 cerr<<"BACK"< facetNormals=rowsToList(traverser.refToPolyhedralCone().getFacets()); pathStepFacet stepFacet; list ridges; for(list::iterator i=facetNormals.begin();i!=facetNormals.end();i++) { ZVector v(n); // for(IntegerVectorList::const_iterator j=extremeRays.begin();j!=extremeRays.end();j++) for(int j=0;j::const_iterator I=facetNormals.begin(); for(list::const_iterator i=ridges.begin();i!=ridges.end();i++,I++) { ZVector rayUniqueVector; if(d==n) { rayUniqueVector =I->normalized(); // if(dotLong(rayUniqueVector,*I) } else { ZCone rayCone=traverser.refToPolyhedralCone().link(*i); rayCone.canonicalize(); rayUniqueVector=rayCone.getUniquePoint(); // debug<=2)||(preassumptions&PCP_facetsKnown);} /** * Returns true iff it is known that the set of equations span the space of implied equations of the description. */ bool areImpliedEquationsKnown()const{return (state>=1)||(preassumptions&PCP_impliedEquationsKnown);} /** * Returns true iff the extreme rays are known. */ bool areExtremeRaysKnown()const{return haveExtremeRaysBeenCached;} /** * Takes the cone to a canonical form. After taking cones to canonical form, two cones are the same * if and only if their matrices of equations and inequalities are the same. */ void canonicalize(); /** * Computes and returns the facet inequalities of the cone. */ ZMatrix getFacets()const; /** * After this function has been called all inequalities describe different facets of the cone. */ void findFacets(); /** * The set of linear forms vanishing on the cone is a subspace. This routine returns a basis * of this subspace as the rows of a matrix. */ ZMatrix getImpliedEquations()const; /** * After this function has been called a minimal set of implied equations for the cone is known and is * returned when calling getEquations(). The returned equations form a basis of the space of implied * equations. */ void findImpliedEquations(); /** * Constructor for polyhedral cone with no inequalities or equations. Tthat is, the full space of some dimension. */ ZCone(int ambientDimension=0); /** * Computes are relative interior point of the cone. */ ZVector getRelativeInteriorPoint()const; /** Assuming that this cone C is in state at least 3 (why not 2?), this routine returns a relative interior point v(C) of C with the following properties: 1) v is a function, that is v(C) is found deterministically 2) for any angle preserving, lattice preserving and lineality space preserving transformation T of R^n we have that v(T(C))=T(v(C)). This makes it easy to check if two cones in the same fan are equal up to symmetry. Here preserving the lineality space L just means T(L)=L. */ ZVector getUniquePoint()const; /** * Takes a list of possible extreme rays and add up those actually contained in the cone. */ ZVector getUniquePointFromExtremeRays(ZMatrix const &extremeRays)const; /** * Returns the dimension of the ambient space. */ int ambientDimension()const; /** * Returns the dimension of the cone. */ int dimension()const; /** * Returns (ambient dimension)-(dimension). */ int codimension()const; /** * Returns the dimension of the lineality space of the cone. */ int dimensionOfLinealitySpace()const; /** * Returns true iff the cone is the origin. */ bool isOrigin()const; /** * Returns true iff the cone is the full space. */ bool isFullSpace()const; /** * Returns the intersection of cone a and b as a cone object. */ friend ZCone intersection(const ZCone &a, const ZCone &b); /** * Returns the Cartesian product of the two cones a and b. */ friend ZCone product(const ZCone &a, const ZCone &b); /** * Returns the positive orthant of some dimension as a polyhedral cone. */ static ZCone positiveOrthant(int dimension); /** * Returns the cone which is the sum of row span of linealitySpace and * the non-negative span of the rows of generators. */ static ZCone givenByRays(ZMatrix const &generators, ZMatrix const &linealitySpace); /** * To use the comparison operator< the cones must have been canonicalized. */ friend bool operator<(ZCone const &a, ZCone const &b); /** * To use the comparison operator!= the cones must have been canonicalized. */ friend bool operator!=(ZCone const &a, ZCone const &b); /** * Returns true iff the cone contains a positive vector. */ bool containsPositiveVector()const; /** * Returns true iff the cone contains the specified vector v. */ bool contains(ZVector const &v)const; /** * Returns true iff the cone contains all rows of the matrix l. */ bool containsRowsOf(ZMatrix const &l)const; /** * Returns true iff c is contained in the cone. */ bool contains(ZCone const &c)const; /** * Returns true iff the PolyhedralCone contains v in its relative interior. False otherwise. The cone must be in state at least 1. */ bool containsRelatively(ZVector const &v)const; /* * Returns true iff the cone is simplicial. That is, iff the dimension of the cone equals the number of facets. */ bool isSimplicial()const; //PolyhedralCone permuted(IntegerVector const &v)const; /** * Returns the lineality space of the cone as a polyhedral cone. */ ZCone linealitySpace()const; /** * Returns the dual cone of the cone. */ ZCone dualCone()const; /** * Return -C, where C is the cone. */ ZCone negated()const; /** * Compute the extreme rays of the cone, and return generators of these as the rows of a matrix. * The returned extreme rays are represented by vectors which are orthogonal to the lineality * space and which are primitive primitive. * This makes them unique and invariant under lattice and angle preserving linear transformations * in the sense that a transformed cone would give the same set of extreme rays except the * extreme rays have been transformed. * If generators for the lineality space are known, they can be supplied. This can * speed up computations a lot. */ ZMatrix extremeRays(ZMatrix const *generatorsOfLinealitySpace=0)const; /** The cone defines two lattices, namely Z^n intersected with the span of the cone and Z^n intersected with the lineality space of the cone. Clearly the second is contained in the first. Furthermore, the second is a saturated lattice of the first. The quotient is torsion-free - hence a lattice. Generators of this lattice as vectors in the span of the cone are computed by this routine. The implied equations must be known when this function is called - if not the routine asserts. */ ZMatrix quotientLatticeBasis()const; /** For a ray (dim=linealitydim +1) the quotent lattice described in quotientLatticeBasis() is isomorphic to Z. In fact the ray intersected with Z^n modulo the lineality space intersected with Z^n is a semigroup generated by just one element. This routine computes that element as an integer vector in the cone. Asserts if the cone is not a ray. Asserts if the implied equations have not been computed. */ ZVector semiGroupGeneratorOfRay()const; /** Computes the link of the face containing v in its relative interior. */ ZCone link(ZVector const &w)const; /** Tests if f is a face of the cone. */ bool hasFace(ZCone const &f)const; /** Computes the face of the cone containing v in its relative interior. The vector MUST be contained in the cone. */ ZCone faceContaining(ZVector const &v)const; /** * Computes the projection of the cone to the first newn coordinates. * The ambient space of the returned cone has dimension newn. */ // PolyhedralCone projection(int newn)const; friend std::ostream &operator<<(std::ostream &f, ZCone const &c); std::string toString()const; }; } #endif /* LIB_CONE_H_ */ gfan0.8beta/src/tropical.cpp0000664000175000017500000001556615177170257015530 0ustar andersanders#include "tropical.h" #include "vektor.h" #include "lp.h" #include "wallideal.h" #include "printer.h" #include "buchberger.h" #include "division.h" #include "matrix.h" #include "linalg.h" #include "log.h" bool isFullColored(IntegerVectorList const &inequalityColors, IntegerVector const &v) { assert(inequalityColors.size()==v.size()); int nColors=inequalityColors.begin()->size(); for(int i=0;inumberOfVariablesInRing(); // fprintf(Stderr,"computTermInIdeal(%i,%i)\n",m,n); // AsciiPrinter(Stderr).printPolynomialSet(ideal); if(m>=n) { Polynomial p=*ideal.begin(); assert(!p.isZero()); p.mark(LexicographicTermOrder()); Term t=p.getMarked(); t.m.exponent=IntegerVector(n); //fprintf(Stderr,"returning\n"); return t; } PolynomialSet g=ideal; buchberger(&g,ReverseLexicographicTermOrder(m+1)); //is this the right order? //fprintf(Stderr,"GB:\n"); //AsciiPrinter(Stderr).printPolynomialSet(g); PolynomialSet g2=g; for(PolynomialSet::iterator j=g.begin();j!=g.end();j++) j->saturate(m); //AsciiPrinter(Stderr).printPolynomialSet(g); buchberger(&g,ReverseLexicographicTermOrder(m)); //is this the right order? //AsciiPrinter(Stderr).printPolynomialSet(g); Term a=computeTermInIdeal(g,m+1); //fprintf(Stderr,"Returned term:"); //AsciiPrinter(Stderr).printPolynomial(Polynomial(a)); //fprintf(Stderr,"\n"); for(int i=0;true;i++) { a.m.exponent[m]=i; Polynomial p=Polynomial(a); if(division(p,g2,LexicographicTermOrder()).isZero())return a; } assert(0); return a; } bool containsMonomialTraditional(PolynomialSet const &ideal) { // Assuming the ideal is homogeneous if(ideal.empty())return false; for(PolynomialSet::const_iterator i=ideal.begin();i!=ideal.end();i++) if(i->isMonomial())return true; int n=ideal.begin()->numberOfVariablesInRing(); PolynomialSet g=ideal; for(int i=0;isaturate(); // fprintf(Stderr,"after:"); // AsciiPrinter(Stderr).printPolynomialSet(g); } buchberger(&g,ReverseLexicographicTermOrder(0)); // fprintf(Stderr,"after:"); // AsciiPrinter(Stderr).printPolynomialSet(g); return g.size()==1 && g.begin()->isMonomial(); } bool containsMonomialDehomogenize(PolynomialSet const &ideal) { PolynomialSet ideal2=ideal.multiDeHomogenization(); PolynomialRing R3=ideal2.getRing().withVariablesAppended("H"); return containsMonomialTraditional(ideal2.homogenization(R3)); } bool containsMonomial(PolynomialSet const &ideal) { log2 debug<<"containsMonomial() called on input ideal:\n"<isMonomial())return true; return containsMonomialDehomogenize(ideal); } PolynomialSet saturatedIdeal(PolynomialSet const &ideal) { // Assuming the ideal is homogeneous assert(!ideal.empty()); int n=ideal.begin()->numberOfVariablesInRing(); PolynomialSet g=ideal; for(int i=0;isaturate(); } // assert(0); buchberger(&g,ReverseLexicographicTermOrder(0)); //assert(0); return g; } gfan0.8beta/src/tropicaltraverse.h0000664000175000017500000000073115177170257016735 0ustar andersanders#ifndef TROPICALTRAVERSE_H_INCLUDED #define TROPICALTRAVERSE_H_INCLUDED #include "bergman.h" /** Represents a tropical variety up to symmetry. New strategy. */ PolyhedralFan tropicalTraverse(PolynomialSet coneGroebnerBasis, PolynomialSet idealGroebnerBasis, SymmetryGroup const *symmetryGroup=0); void coneChangeDebugger(PolynomialSet coneGroebnerBasis, PolynomialSet idealGroebnerBasis, IntegerVectorList const &ridges, IntegerVectorList const &rays); #endif gfan0.8beta/src/gfanlib_paralleltraverser.cpp0000664000175000017500000004636315177170257021126 0ustar andersanders// Parallel abstract graph traverser. Contributed by Bjarne Knudsen. #include #include #include #include #include #include //#include #include #include //anders #include #include #include "gfanlib_paralleltraverser.h" #include "interrupt.h" // Added by Anders /* TODO: - Consider giving JobTransfers an affinity to a specific thread. - Consider if the amount of entries to be copied in the stack for deep searches can be reduced. - Consider making a more compact stack for limited in and out edge counts. */ using namespace std; namespace gfan{ // This struct holds information about one step of a traversal. struct TraverseState { // The number of next edges int next_count; // The index of the next edge that was followed int next_index; // The index of the previous edge to get back int prev_index; TraverseState( int next_count, int next_index, int prev_index ) { this->next_count = next_count; this->next_index = next_index; this->prev_index = prev_index; } }; void traverse_simple_recursive( Traverser* traverser ) { int count = traverser->getEdgeCountNext(); traverser->collectInfo(); for (int i = 0; i < count; i++) { int prev_index = traverser->moveToNext(i, true); if (prev_index == 0) { // Only traverse each state once, so do it for the zero'th // parent. traverse_simple_recursive(traverser); } traverser->moveToPrev(prev_index); } } // This function creates a stack that represents the full job to be // done. Info is also collected for the start state. vector* create_first_job_stack( Traverser* traverser ) { vector* stack = new vector(); stack->push_back(TraverseState(traverser->getEdgeCountNext(), -1, -1)); traverser->collectInfo(); return stack; } void traverse_simple_stack( Traverser* traverser ) { // The stack holds information about what we have done so far vector* stack = create_first_job_stack(traverser); while (!stack->empty()) { stack->back().next_index++; TraverseState state = stack->back(); if (state.next_index == state.next_count || traverser->aborting /* Added by Anders */) { if (state.prev_index != -1) { traverser->moveToPrev(state.prev_index); } stack->pop_back(); } else { int prev_index = traverser->moveToNext(state.next_index, true); if (prev_index == 0) { traverser->collectInfo(); stack->push_back(TraverseState(traverser->getEdgeCountNext(), -1, prev_index)); } else { traverser->moveToPrev(prev_index); } } } delete stack; } void traverse_simple( Traverser* traverser ) { traverse_simple_stack(traverser); } // A Job holds a traverser and a stack representing the job. The stack // is changed along with the traverser, so it represents the state of // the traverser. class Job { Traverser* traverser; vector* stack; vector> leftOverWork;//Anders:used when aborting // The lowest index in the stack where there is some unfinished // work. -1 if there is no unfinished work. int first_split; // For a given starting point, find the first index of the stack // with unfinished work. -1 if there is no unfinished work. static int find_first_split( vector* stack, int start ) { auto it = stack->begin(); it += start; while (it != stack->end() && it->next_index == it->next_count - 1) { start++; it++; } if (it == stack->end()) { return -1; } else if (it->next_index == -1 && it->next_count == 1) { return -1; } return start; } public: bool aborting; // Added by Anders // Create a new Job. if first_split is not set (or it is -2), the // first split will be found. Job( vector* stack = new vector(), int first_split = -2 ) :aborting(false) // Added by Anders { // std::cerr<<"NEw job\n"; assert(first_split!=-1); if (first_split == -2) { first_split = find_first_split(stack, 0); } this->stack = stack; this->first_split = first_split; } bool hasLeftOver() { return leftOverWork.size(); } vector> getLeftOver() { vector> ret; ret.reserve(leftOverWork.size()); //std::cerr<<"LEFTOVER"<=0;i--) ret.push_back(std::pair(leftOverWork[i].first,leftOverWork[i].second)); leftOverWork=vector>(); //std::cerr<<"RET"<size()<<"\n"; for(auto &a:leftOverWork) std::cerr<<"("<* last_stack = last_job->stack; unsigned int i; this->traverser = traverser; // Find the first state where the stacks differ: for (i = 0; i < last_stack->size() && i < stack->size(); i++) { if ((*stack)[i].next_index != (*last_stack)[i].next_index) { break; } } // std::cerr<<"i:"< 0) { // TODO: why is this needed? i--; } // std::cerr<<"laststacksize:"<size()<<"\n"; // roll back to the division point while (last_stack->size() > i + 1) { traverser->moveToPrev(last_stack->back().prev_index); last_stack->pop_back(); } if (!last_stack->empty()) { last_stack->pop_back(); } if(stack->size()==0) { // std::cerr<<"STACKSIZEZERO\n"; int count = traverser->getEdgeCountNext(); traverser->collectInfo(); stack->push_back(TraverseState(count, -1, -4)); first_split=find_first_split(stack, 0); } else // go forward so the traverser represents the new job for (; i + 1 < stack->size() ; i++) { // stringstream s; // s<<"Check\n("<getEdgeCountNext()<<")\n"; // std::cerr<getEdgeCountNext()); // std::cerr<<"Move\n"<<(*stack)[i].next_index+1000<<"\n"; traverser->moveToNext((*stack)[i].next_index, false); } } void print( void ) { cout << "--cc-nn-pp----------" << endl; for(vector::const_iterator state=stack->begin();state!=stack->end();state++){ // for (TraverseState state : *stack) { cout << " " << setw(2) << state->next_count << " " << setw(2) << state->next_index << " " << setw(2) << state->prev_index << endl; } cout << "--------------------" << endl; } std::string pretty_iterator_string() //Added by Anders { std::stringstream s; s<<"Bounds:"; for(auto state=stack->begin();state!=stack->end();state++) s<next_count; s<<"\n"; s<<"Counts:"; for(auto state=stack->begin();state!=stack->end();state++) s<next_index; s<<"\n"; return s.str(); } // This function does some work and returns false when there is no // more work. Otherwise does at least step_count steps and returns // true when there is a subjob available. bool step( int step_count ) { int steps = 0; // std::cerr<<"step()\n"; // keep going if there is no subjob available while (steps < step_count || first_split == -1) { if (stack->empty()) { return false; } if(!aborting)//??? stack->back().next_index++; TraverseState state = stack->back(); if (state.next_index == state.next_count || aborting /* Added by Anders */) { if (state.prev_index != -1) { traverser->moveToPrev(state.prev_index); } // if(state.next_index != state.next_count)//Anders if(aborting) { // std::cerr<<"We are not done: next_index"<(state.next_index,state.next_count)); // std::cerr<<"DEPTH"<size()<<"\n"; } stack->pop_back(); if (first_split == -1) { // There is no more work to do in the previous states return false; } } else { if ((int) stack->size() - 1 == first_split) { if (state.next_index == state.next_count - 1) { first_split = -1; } } //print(); int prev_index = traverser->moveToNext(state.next_index, true); aborting=traverser->aborting; /* Added by Anders */ steps++; if (prev_index == 0) { int count = traverser->getEdgeCountNext(); traverser->collectInfo(); if (first_split == -1 && count > 1) { first_split = stack->size(); } stack->push_back(TraverseState(count, -1, prev_index)); } else { traverser->moveToPrev(prev_index); } } } return true; } // Get a new subjob of the current job and adjust the current job so // it does not overlap with the new subjob. first_split may not be // -1 when calling this function. Job* getSubjob( void ) { // We can assume that first_split >= 0. auto it = stack->begin(); it += first_split + 1; // this new job will do the rest vector* new_stack = new vector(stack->begin(), it); it--; // limit the existing job it->next_count = it->next_index + 1; Job* new_job = new Job(new_stack, find_first_split(new_stack, first_split)); first_split = find_first_split(stack, first_split); return new_job; } }; // This class is used to safely transfer a job from one thread to another class JobTransfer { bool is_set; Job* job; mutex mtx; condition_variable cond; public: JobTransfer( void ) { is_set = false; } void setJob( Job* job ) { mtx.lock(); this->job = job; is_set = true; // notify should be done after unlock according to // http://en.cppreference.com/w/cpp/thread/condition_variable/notify_one // but doing so seems to cause a deadlock with 8 threads using // SubsetTraversers of size 16 on my laptop cond.notify_one(); mtx.unlock(); } Job* getJob( void ) { unique_lock lock(mtx); while (!is_set) { cond.wait(lock); } lock.unlock(); return job; } }; class JobCentral; // A struct for holding all the information needed by a thread. struct ThreadContext { JobCentral* central; Traverser* traverser; int step_count; ThreadContext( JobCentral* central, Traverser* traverser, int step_count ) { this->central = central; this->traverser = traverser; this->step_count = step_count; } }; void work( ThreadContext* context ); // This class is used running the whole threaded traversal and for // exchanging jobs between threads class JobCentral { public: vector>> leftOvers; ThreadContext** contexts; int context_count; // int step_count; // Job* first_job; vector>> first_jobs; public: mutex mtx; // This queue is used for transferring jobs between threads. When a // thread requests a job, an empty transfer is put in this queue. It // will then be picked up by a thread that has a subjob // available. The subjob is given to the JobTransfer and is then // received by the thread needing it. deque* transfers; public: bool aborting; // Added by Anders bool stack_printing; // Added by Anders // step_count is the number of algorithm steps taken between // possible job transfers. This value should be high (e.g. 100) if // the traverser is very fast. If the traverser is slow, step_count // should be one. JobCentral( Traverser** traversers, int count, int step_count, bool stack_printing_=false) // Added by Anders :aborting(false), // Added by Anders stack_printing(stack_printing_) // Added by Anders { context_count = count; contexts = new ThreadContext*[count]; for (int i = 0; i < count; i++) { contexts[i] = new ThreadContext(this, traversers[i], step_count); } transfers = new deque(); registerBoolForInterrupt(&aborting); // Added by Anders } ~JobCentral( void ) { unregisterBoolForInterrupt(&aborting); // Added by Anders delete transfers; for (int i = 0; i < context_count; i++) { delete contexts[i]; } delete[] contexts; } // Run a job in multiple threads. This function is usually just // called once with a job representing everything to be done. // void runJob( Job* job ) void runJob( vector>> jobs ) { thread** thr = new thread*[context_count]; // this->first_job = job; this->first_jobs =jobs; for (int i = 0; i < context_count; i++) { thr[i] = new thread(work, contexts[i]); } for (int i = 0; i < context_count; i++) { thr[i]->join(); delete thr[i]; } delete[] thr; } bool hasTransfer( void ) { return !transfers->empty(); } // If no threads are requesting jobs, the return value will be // NULL. Otherwise a JobTransfer will be returned ready for // receiving a new job. JobTransfer* getTransfer( void ) { JobTransfer* transfer = NULL; mtx.lock(); if (!transfers->empty()) { transfer = transfers->back(); transfers->pop_back(); } mtx.unlock(); return transfer; } // Requst a job from another thread. The return value is NULL if all // jobs are done. Job* getJob( void ) { Job* job = NULL; mtx.lock(); /* if (first_job != NULL) { job = first_job; first_job = NULL; } else */ if (first_jobs.size()) { // std::cerr<<"a first_job found\n"; auto v=new vector(); for(auto &i:first_jobs.back())v->emplace_back(i.second,i.first,-3); job=new Job(v); first_jobs.pop_back(); } else if ((int) transfers->size() < context_count - 1) { // std::cerr<<"trying to transfer\n"; JobTransfer* transfer = new JobTransfer(); transfers->push_front(transfer); mtx.unlock(); job = transfer->getJob(); delete transfer; // return now because the mutex is already unlocked return job; } else { // We are fully done for(deque::const_iterator tr=transfers->begin();tr!=transfers->end();tr++){ // for (JobTransfer* tr : *transfers) { (*tr)->setJob(NULL); } } mtx.unlock(); return job; } }; // Do the actual work void work( ThreadContext* context ) { Traverser* traverser = context->traverser; JobCentral* central = context->central; Job* job; Job* last_job = new Job(); // std::cerr<<"Work\n"; while ((job = central->getJob()) != NULL) { job->setTraverser(traverser, last_job); // std::cerr<<"TraverserSet\n"; int step_count = central->hasTransfer() ? 1 : context->step_count; if(central->aborting)job->aborting=true; // Added by Anders while (job->step(step_count)) { if(central->stack_printing) { // Added by Anders thread_local int t; t++; if(t>=1000) { // std::stringstream s; // s<<"Thread ID:"<pretty_iterator_string(); // std::cerr<aborting)job->aborting=true; // Added by Anders if(job->aborting) central->aborting=true; // Added by Anders else { JobTransfer* transfer = central->getTransfer(); if (transfer != NULL) { transfer->setJob(job->getSubjob()); } } step_count = central->hasTransfer() ? 1 : context->step_count; } if(last_job) if(last_job->hasLeftOver()) { std::scoped_lock L(central->mtx); // std::cerr<<"Adding to leftoverA\n"; central->leftOvers.push_back(last_job->getLeftOver()); } delete last_job; last_job = job; } if(last_job) if(last_job->hasLeftOver()) { std::scoped_lock L(central->mtx); // std::cerr<<"Adding to leftoverB\n"; central->leftOvers.push_back(last_job->getLeftOver()); } delete last_job; } // Do the actual work void work2( ThreadContext* context ) { Traverser* traverser = context->traverser; JobCentral* central = context->central; int step_count = context->step_count; Job* job; Job* last_job = new Job(); while ((job = central->getJob()) != NULL) { job->setTraverser(traverser, last_job); while (job->step(step_count)) { JobTransfer* transfer = central->getTransfer(); if (transfer != NULL) { transfer->setJob(job->getSubjob()); } } delete last_job; last_job = job; } delete last_job; } class Progress{ public: vector>> p; Progress()://constructor for "iterator" begin p(1) { } Progress(int i)//empty constructor { } }; #define PROGRESSFILENAME "PrOgReSs.gFaN" std::shared_ptr loadProgress() { // std::cerr<<"LOADING\n"; auto filename=PROGRESSFILENAME; std::shared_ptr ret(new Progress(1)); std::ifstream f(filename); int I; f>>I; for(int i=0;i> v; int J; f>>J; for(int j=0;j>a; f>>b; v.push_back(std::pair(a,b)); } ret->p.push_back(v); } return ret; } void saveProgress(std::shared_ptr progress) { auto filename=PROGRESSFILENAME; std::ofstream f(filename); f<p.size()<<"\n"; for(auto &v:progress->p) { f<<" "< newProgress() { return std::shared_ptr(new Progress()); } //using Progress=vector>>; //typedef vector>> Progress; /*class Progress: public vector>>{ };*/ void traverse_threaded( Traverser** traversers, int count, int step_count, bool stack_printing, std::shared_ptr resumeData) // stack_printing added by Anders { vector>> resumeData2(1); auto ourResumeData=&resumeData2; if(resumeData)ourResumeData=&(resumeData->p); JobCentral central(traversers, count, step_count,stack_printing); central.runJob(*ourResumeData); if(resumeData) resumeData->p=central.leftOvers; } } gfan0.8beta/src/gfanlib_polymakefile.h0000664000175000017500000000346015177170257017511 0ustar andersanders/* * gfanlib_polymakefile.h * * Created on: Nov 17, 2010 * Author: anders */ #ifndef GFANLIB_POLYMAKEFILE_H_INCLUDED #define GFANLIB_POLYMAKEFILE_H_INCLUDED #include #include #include #include #include "gfanlib_matrix.h" namespace gfan { class PolymakeProperty { public: std::string value; std::string name; PolymakeProperty(const std::string &name_, const std::string &value_); }; class PolymakeFile { std::string application,type; std::string fileName; std::list properties; std::list::iterator findProperty(const char *p); void writeProperty(const char *p, const std::string &data); bool isXml; public: // void open(const char *fileName_); void open(std::istream &f); void create(const char *fileName_, const char *application_, const char *type_, bool isXml_=false); void writeStream(std::ostream &file); void close(); bool hasProperty(const char *p, bool doAssert=false); // The following could be part of a subclass to avoid dependencies on gfan Integer readCardinalProperty(const char *p); void writeCardinalProperty(const char *p, Integer n); bool readBooleanProperty(const char *p); void writeBooleanProperty(const char *p, bool n); ZMatrix readMatrixProperty(const char *p, int height, int width); void writeMatrixProperty(const char *p, const ZMatrix &m, bool indexed=false, const std::vector *comments=0); std::vector > readMatrixIncidenceProperty(const char *p); void writeIncidenceMatrixProperty(const char *p, const std::vector > &m); ZVector readCardinalVectorProperty(const char *p); void writeCardinalVectorProperty(const char *p, ZVector const &v); void writeStringProperty(const char *p, const std::string &s); }; } #endif gfan0.8beta/src/linalg.cpp0000664000175000017500000005416115177170257015153 0ustar andersanders#include "linalg.h" #include "field_rationals.h" #include "linalgfloat.h" #include "continuedfractions.h" #include "log.h" //-------------------------------------------------- // FieldVector //-------------------------------------------------- FieldVector::FieldVector(Field const &_theField, int _n): n(_n), theField(_theField), v(_n,_theField.zHomomorphism(0)) { // debug<<"FieldVector constructor\n"; } FieldVector FieldVector::allOnes(Field const &_theField, int _n) { FieldVector ret(_theField,_n); for(int i=0;i<_n;i++)ret[i]=_theField.zHomomorphism(1); return ret; } FieldElement& FieldVector::operator[](int i) { assert(i>=0 && i=0 && i=0); assert(end<=size()); assert(end>=begin); FieldVector ret(theField,end-begin); for(int i=0;i const &l)const { FieldVector ret(theField,l.size()); int I=0; for(list::const_iterator i=l.begin();i!=l.end();i++,I++) ret[I]=v[*i]; return ret; } FieldVector concatenation(FieldVector const &a, FieldVector const &b) { FieldVector ret(a.getField(),a.size()+b.size()); int I=0; for(int i=0;i=0 && i=0 && i const &rowIndices)const { FieldMatrix ret(getField(),rowIndices.size(),getWidth()); int I=0; for(list::const_iterator i=rowIndices.begin();i!=rowIndices.end();i++,I++) ret[I]=rows[*i]; return ret; } void FieldMatrix::madd(int i, FieldElement a, int j) { assert(i!=j); assert(i>=0 && i=0 && j widths(getWidth()); for(int j=0;jmaxWidth)maxWidth=l; } widths[j]=maxWidth; } for(int i=0;i=height)return false; while(++jzHomomorphism(-(((int)(d+10000.5))-10000)); //s=s+multiplier*u; //t=t+multiplier*v; s.madd(multiplier,u); t.madd(multiplier,v); } /* if(((s-u)*(s-u)+(t-v)*(t-v)-(s*s+t*t)).sign()<0)//a simple test to avoid coefficient growth { s=s-u; t=t-v; } if(((s+u)*(s+u)+(t+v)*(t+v)-(s*s+t*t)).sign()<0)//a simple test to avoid coefficient growth { s=s+u; t=t+v; }*/ // debug<<"i"<reduce(); FieldElement sign=theField.zHomomorphism(1-2*(nswaps&1)); int rank=reduceAndComputeRank(); assert(rank+1==width); REformToRREform(); FieldVector ret(theField,width); FieldElement diagonalProduct=theField.zHomomorphism(1); { int pivot2I=-1; int pivot2J=-1; while(nextPivot(pivot2I,pivot2J)) { diagonalProduct*=rows[pivot2I][pivot2J]; } } { int j=nonPivotColumns().front(); int pivot2I=-1; int pivot2J=-1; ret[j]=theField.zHomomorphism(-1); // Pretend that we are appending ret to the matrix, and reducing this // new row by the previous ones. The last entry of the resulting matrix // is lastEntry. FieldElement lastEntry=ret[j]; while(nextPivot(pivot2I,pivot2J)) { ret[pivot2J]=rows[pivot2I][j]*rows[pivot2I][pivot2J].inverse(); //lastEntry+=ret[pivot2J]*ret[pivot2J]; lastEntry+=-ret[pivot2J]*ret[pivot2J]; } ret=(sign*diagonalProduct*lastEntry)*ret; } /* { int n=temp.getWidth(); FieldMatrix temp2(temp.getField(),n,n); for(int i=0;i0); } */ return ret; } FieldMatrix FieldMatrix::reduceAndComputeKernel() { FieldMatrix ret(theField,width-reduceAndComputeRank(),width); REformToRREform(); // AsciiPrinter P(Stderr); // printMatrix(P); int k=0; int pivotI=-1; int pivotJ=-1; bool pivotExists=nextPivot(pivotI,pivotJ); for(int j=0;jtransposed(),identity(getField(),getWidth())); temp.reduce(false,true); int r=0; int pivot2I=-1; int pivot2J=-1; while(temp.nextPivot(pivot2I,pivot2J)&&(pivot2J FieldMatrix::pivotColumns()const { list ret; int pivotI=-1; int pivotJ=-1; while(nextPivot(pivotI,pivotJ)) { ret.push_back(pivotJ); } return ret; } list FieldMatrix::nonPivotColumns()const { list ret; int pivotI=-1; int pivotJ=-1; int firstPossiblePivot=0; while(nextPivot(pivotI,pivotJ)) { for(int j=firstPossiblePivot;j=0); assert(startColumn>=0); assert(endRow<=getHeight()); assert(endColumn<=getWidth()); FieldMatrix ret(theField,endRow-startRow,endColumn-startColumn); for(int i=startRow;i temp(kernel.getWidth()); for(int i=0;i tempInt(kernel.getWidth()); int denominator; doubleVectorToFractions(temp, tempInt, denominator); IntegerVector ret(kernel.getWidth()); for(int i=0;i1000000)goto fallback; if(ret.min()<-1000000)goto fallback; if(ret.isZero())goto fallback; if(!m.inKernel(ret))goto fallback; return ret; } fallback: log2 debug << "LINALG FALLBACK\n"; FieldMatrix m2=integerMatrixToFieldMatrix(m,Q); FieldMatrix ker=m2.reduceAndComputeKernel(); assert(ker.getHeight()==1); return ker[0].primitive(); } FieldMatrix combineOnTop(FieldMatrix const &top, FieldMatrix const &bottom) { assert(bottom.getWidth()==top.getWidth()); FieldMatrix ret(top.theField,top.getHeight()+bottom.getHeight(),top.getWidth()); for(int i=0;isize(); FieldMatrix M(Q,d,n); int j=0; for(IntegerVectorList::const_iterator J=m.begin();J!=m.end();J++,j++) for(int i=0;ij){j++;J++;} ret.push_back(*J); } return ret; } IntegerVectorList basisOfQuotientLattice(IntegerVectorList const &equations, IntegerVectorList const &additionalEquations, int n) { int a=equations.size(); int b=additionalEquations.size(); // small vector space defined by a+b equations.... big by a equations. FieldMatrix M=combineLeftRight(combineLeftRight( integerMatrixToFieldMatrix(rowsToIntegerMatrix(equations,n),Q).transposed(), integerMatrixToFieldMatrix(rowsToIntegerMatrix(additionalEquations,n),Q).transposed()), FieldMatrix::identity(Q,n)); M.reduce(false,true); /* [A|B|I] is reduced to [A'|B'|C'] meaning [A'|B']=C'[A|B] and A'=C'A. [A'|B'] is in row echelon form, implying that the rows of C' corresponding to zero rows of [A'|B'] generate the lattice cokernel of [A|B] - that is the linealityspace intersected with Z^n. [A'] is in row echelon form, implying that the rows of C' corresponding to zero rows of [A'] generate the lattice cokernel of [A] - that is the span of the cone intersected with Z^n. It is clear that the second row set is a superset of the first. Their difference is a basis for the quotient. */ IntegerVectorList ret; for(int i=0;i #include #include #include "gfanlib_hypersurfaceintersection.h" #include "gfanlib_paralleltraverser.h" #include "gfanlib_memoryresource.h" namespace gfan{ template void codimension1ConesB(Matrix nonstrict, Matrix strict, pmrvector > &collector, MR *mr=get_default_resource(), MR *mr2=get_default_resource()) { assert(nonstrict.getHeight()==strict.getHeight()); HalfOpenCone C(nonstrict,Matrix(strict.getHeight(),0,mr2),strict,mr2); // std::cerr<<"DUAL"<=0;i--) { // std::cerr<<"Iterated:"< K(mr);K=C; // std::cerr<<"DUAL"<0) { // std::cerr<<"C BEFORE"< choosable, Matrix nonstrict, Matrix strict, Matrix equations, std::vector > &collector, MR *mr=get_default_resource(), MR *mr2=get_default_resource()) { HalfOpenCone C(combineLeftRight(choosable,nonstrict),strict,equations); for(int i=0;i K=C; K.makeEquation(i); if(!K.isEmpty()) collector.emplace_back(std::move(K)); if(i+1 nonstrict, Matrix strict, std::vector > &collector, MR *mr=get_default_resource(), MR *mr2=get_default_resource()) { // ResourceInvariant a(mr2); // std::cerr<<"codim1"<0) { //only do the following if equation defines a facet? HalfOpenCone temp(//HERE nonstrict.submatrixColumns(0,nonstrict.getWidth()-1,mr), nonstrict.submatrixColumns(nonstrict.getWidth()-1,nonstrict.getWidth(),mr), strict,mr2);//TO HERE // std::cerr< > ret= codimension1Cones( nonstrict.submatrixColumns(0,nonstrict.getWidth()-1,mr2), combineLeftRight(strict,nonstrict.submatrixColumns(nonstrict.getWidth()-1,nonstrict.getWidth(),mr2),mr2), collector,mr,mr2 ); // std::cerr<<"NONSTRICT:"<< combineOnTop(nonstrict, // -Matrix::rowVectorMatrix(nonstrict[nonstrict.getHeight()-1]))<<"ADDING"< >(); } IntegerVectorList cast(Matrix const A) { IntegerVectorList ret; for(int i=0;i bool compare(Vector const &order, Vector const &v) { auto p=dot(order,v); if(p.isNegative())return 1; if(p.isPositive())return 0; for(int i=0;i bool compare(Matrix const &order, Vector const &a, MR *mr=get_default_resource()) { for(int j=0;j0)return false; } return false; } template bool vertexCompare(Vector const &a, Vector const &b, Matrix const &order) { for(int j=0;j0)return false; } return false; } template bool isPerpendicular(Vector const &a, Matrix const &generators) { for(int j=0;j int vertexIndex(Matrix const &exponents, Matrix const &order, int &numberOfTimesAttained, MR *mr=get_default_resource()) { assert(exponents.getHeight()); int best=0; // std::cerr<<"newBest:"<<0; numberOfTimesAttained=1; for(int i=1;i && T(HalfOpenCone && a){stackResource.dump();return std::move(a);} // --------------------- // VertexPairToEdgeTable // --------------------- VertexPairToEdgeTable::VertexPairToEdgeTable(int numberOfVertices): table(numberOfVertices,numberOfVertices), nextFree(0) { for(int i=0;i const &used)const { int best;int bestIndex=-1; assert(used.size()==layout.startOffsets.size()); for(int i=0;i Matrix normalConeInequalities(Matrix const &vertices, int i) { Matrix ret(0,vertices.getWidth()); ret.reserveRows(vertices.getHeight()-1); for(int j=0;j HalfOpenCone relativeInterior(Cone C) { return HalfOpenCone( Matrix(C.getAmbientDimension(),0), C.getOrthogonalComplement(), C.getFacetNormals()); } class ThreadSafePairIterator { std::mutex m; int n; std::vector> v; int64_t a; public: ThreadSafePairIterator(int n_): n(n_), a(0) { v.reserve((int64_t(n)*(int64_t(n)-1))/2); for(int i=0;i> getNextPair() { std::scoped_lock l(m); if(a==v.size()) return {}; else return v[a++]; } }; // ------------ // PolytopeData // ------------ template PolytopeData::PolytopeData(Matrix const &generators_, HalfOpenCone const &restriction): // restriction(restriction_), edgeTable(0), generators(generators_) { // Cone restriction=Cone::halfSpace(Vector::standardVector(generators.getWidth(),0)); // Find vertices Matrix verticesMatrix(0,generators.getWidth()); for(int i=0;i C(normalConeInequalities(generators,i)); HalfOpenCone C(normalConeInequalities(generators,i),Matrix(restriction.getAmbientDimension(),0),Matrix(restriction.getAmbientDimension(),0)); C=intersection2(C,restriction); // std::cerr<<"Ambient dimension"< temp(C.getFacetNormals()); // vertexNormalCones.push_back(temp); } } std::cerr<<"NumberOfVertices"< C=intersection(vertexNormalCones[i],vertexNormalCones[j]); // Cone C(combineLeftRight(vertexNormalCones[i].getFacetNormals(),vertexNormalCones[j].getFacetNormals())); // Cone C(combineLeftRight(normalConeInequalities(generators,i),normalConeInequalities(generators,j))); // Cone C(combineLeftRight(normalConeInequalities(verticesMatrix,i),normalConeInequalities(verticesMatrix,j))); HalfOpenCone C(combineLeftRight(normalConeInequalities(verticesMatrix,i),normalConeInequalities(verticesMatrix,j)),Matrix(restriction.getAmbientDimension(),0),Matrix(restriction.getAmbientDimension(),0)); { C=intersection2(C,restriction); if(C.getDimension()==C.getAmbientDimension()-1) { edgeNormalCones.push_back(relativeInterior(C.closure())); edgeTable.allocate(i,j); edges.push_back(pair(i,j)); } } } cerr<<"Number of edges in polytope:"< void PolytopeData::initializeRelationTables(RelationTableLayout const &layout) { for(auto &e:edges)relationTables.emplace_back(layout); } template string PolytopeData::toString(RelationTableLayout const &layout)const { stringstream s; for(auto &r:relationTables) { int I=0; for(int i=0;i std::string PolytopeIntersectionData::toString() { stringstream s; for(auto &p:polytopes) s< PolytopeIntersectionData::PolytopeIntersectionData(bool dummy, vector> const &polytopes_, HalfOpenCone const &restriction) { cerr<<"Constructing PolytopeIntersectionData\n"; polytopes.reserve(polytopes_.size()); cerr<<"Number of polytopes:"<(p,restriction)); layout.allocate(polytopes.back().edges.size()); } cerr<<"Initialising relation tables\n"; for(auto &p:polytopes) p.initializeRelationTables(layout); } template PolytopeIntersectionData::PolytopeIntersectionData(vector> const &polytopes_, HalfOpenCone const &restriction): PolytopeIntersectionData::PolytopeIntersectionData(false,polytopes_,restriction) { #if 0 for(int P=0;P temp=intersection2(polytopes[P].edgeNormalCones[E],polytopes[Q].edgeNormalCones[F],&globalStackResource1,&globalStackResource2); if(temp.isEmpty(&globalStackResource1)) { polytopes[P].relationTables[E].mark(Q,F,false); polytopes[Q].relationTables[F].mark(P,E,false); } } } } #else ThreadSafePairIterator pairIterator(polytopes.size()); vector dummy(100); mutex mtx; std::for_each(std::execution::par, dummy.begin(),dummy.end(),[&](size_t t) { StackResource localStackResource1(20160000); StackResource localStackResource2(20160000); while(auto p=pairIterator.getNextPair()) { auto P=p.value().first; auto Q=p.value().second; cerr<<"("< temp=intersection2(polytopes[P].edgeNormalCones[E],polytopes[Q].edgeNormalCones[F],&localStackResource1,&localStackResource2); if(temp.isEmpty(&localStackResource1)) { scoped_lock l(mtx); polytopes[P].relationTables[E].mark(Q,F,false); polytopes[Q].relationTables[F].mark(P,E,false); } } } }); #endif } template PolytopeIntersectionData::PolytopeIntersectionData(vector> const &polytopes_, HalfOpenCone const &restriction, istream &intersectionDataFile): PolytopeIntersectionData::PolytopeIntersectionData(false,polytopes_,restriction) { auto L=parseSequence(intersectionDataFile); assert(L.size()==polytopes.size()); for(int P=0;P>b; polytopes[P].relationTables[E].mark(Q,F,b); polytopes[Q].relationTables[F].mark(P,E,b); } } } } } template void PolytopeIntersectionData::dumpToStream(std::ostream &f)const { f<<"{\n"; for(int P=0;P RelationTable PolytopeIntersectionData::getTableOfEdge(int polytopeIndex, int u, int v)const { return polytopes.at(polytopeIndex).relationTables[polytopes.at(polytopeIndex).edgeTable.lookup(u,v)]; } template int PolytopeIntersectionData::bestPolytopeIndex(vector const &used, HalfOpenCone C)const//using current cone { assert(0); int bestIndex=-1; int lowestNumber=0; for(int i=0;i T(E.getInequalities(),E.getEquations(),Matrix(E.getAmbientDimension(),0)); auto I=intersection2(T,C); if(!I.isEmpty())number++; } else*/ if(1) for(auto & D:polytopes[i].edgeNormalCones) { // auto DD=D; auto E=D;//D.closure(); if(0){//takes span of closure which might be easier to intersect with C. However, this gives a very bad heuristic. auto F=E.closure(); E=HalfOpenCone(F.getOrthogonalComplement(),Matrix(F.getAmbientDimension(),0),Matrix(F.getAmbientDimension(),0)); } // HalfOpenCone T(E.getInequalities(),E.getEquations(),Matrix(E.getAmbientDimension(),0)); auto I=intersection2(E,C); if(!I.isEmpty())number++; } else for(auto & D:polytopes[i].edgeNormalCones) { auto DD=D; auto E=DD.closure(); HalfOpenCone T(E.getInequalities(),E.getEquations(),Matrix(E.getAmbientDimension(),0)); auto I=intersection2(T,C); if(!I.isEmpty())number+=I.getDimension();//*I.getDimension()*I.getDimension()*I.getDimension(); } if(bestIndex==-1 || number int PolytopeIntersectionData::bestPolytopeIndex2(vector const &used, RelationTable const &RT)const //Experiment 3 { assert(0); int best;int bestIndex=-1; assert(used.size()==layout.startOffsets.size()); for(int i=0;i void print(vector > &f, bool enableAssert=true) { int numberContainingOrigin=0; std::cout<<"************************************** start\n"; int I=0; for(vector >::iterator i=f.begin();i!=f.end();i++,I++) { if(i->containsOrigin())numberContainingOrigin++; bool b=i->isEmpty(); std::cout<<"-=-=-=-=-==-=-=-=-=-=-=-=- cone number "<toString()<<((b)?"EMPTY":"NOT EMPTY") <lifted.dualCone.toString() <<"-=-=-=-=-==-=-=-=-=-=-=-=-\n"; } std::cout<<"************************************** end\n"; if(enableAssert)assert(numberContainingOrigin<=1); } template vector> restrictedTropicalHypersurface(HalfOpenCone &cone, Matrix const &exponents, MR *mr=get_default_resource(), MR *mr2=get_default_resource()) { // ResourceInvariant a(mr); MR *mr3=get_default_resource(); // Problems to fix: // We dont just need to compute a spanning tree, but an entire orientation of the graph // For every vertex we should be able to find the outgoing edges and corresponding inequalities int cdim=cone.getDimension(mr); // std::cerr< > ret; vector > refinement;refinement.reserve(exponents.getHeight()); pmrvector isFullDim(mr2);isFullDim.reserve(exponents.getHeight()); pmrvector comesFromVertexNumber(mr2);comesFromVertexNumber.reserve(exponents.getHeight()); int numberOfFullDim=0; assert(!cone.isEmpty(mr)); // std::cerr<<"TAKING CLOSURE\n"; auto C=cone.closure(mr2,mr); // std::cerr<<"DONE TAKING CLOSURE\n"; // std::cerr< adjacencyMatrix2(exponents.getHeight(),exponents.getHeight(),mr2); { pmrvector toExplore(mr2);toExplore.reserve(exponents.getHeight()); pmrvector markedNumber(exponents.getHeight(),mr2); auto firstRelativeInteriorPoint=C.getRelativeInteriorPoint(mr2); auto firstOrder=combineOnTop(Matrix::rowVectorMatrix(firstRelativeInteriorPoint,mr),generatorsOfSpanOfC,mr2); { int number; int optimalVertexIndex=vertexIndex(exponents,firstOrder,number,mr); toExplore.push_back(optimalVertexIndex); markedNumber[optimalVertexIndex]=number; } while(!toExplore.empty()) { int current=toExplore.back(); toExplore.pop_back(); Matrix empty(exponents.getWidth(),0,mr2);//HERE Matrix eq=C.getEquations(mr2,mr); Matrix ineq=C.getInequalities(mr2,mr); #if 0 Matrix ineqAdditional(exponents.getHeight()-1,exponents.getWidth(),mr); for(int j=0;jcurrent)]=operatorMinus(exponents[current].toVector(mr),exponents[j].toVector(mr),mr2); { Matrix ineqAdditional2(0,exponents.getWidth(),mr);ineqAdditional2.reserveRows(exponents.getHeight()-1); for(int i=0;i ineqAdditional(0,exponents.getWidth(),mr);ineqAdditional.reserveRows(exponents.getHeight()-1); for(int j=0;j(1,mr),mr))) ineqAdditional.appendRow(temp); } #endif ineq=combineLeftRight(ineq,ineqAdditional.transposed(mr),mr2); Cone C2(ineq,eq,mr2,mr); auto te=HalfOpenCone(ineq/*ineq*/,empty,empty,mr2,mr); // A possible optimisation is to replace the line above with the line below. // auto te=HalfOpenCone(ineqAdditional.transposed(mr/*2*/),empty,empty,mr2,mr); auto C3=intersection2(te,cone,mr2,mr); auto facetNormals=C2.getFacetNormals(mr2,mr); for(int j=0;j theEquation=facetNormals.submatrixColumns(j,j+1,mr2); Cone facet(ineq,combineLeftRight(eq,theEquation,mr),mr2);//TO HERE auto relintF=facet.getRelativeInteriorPoint(mr2); if(C.containsInRelativeInterior(relintF)) { // if(rigtigretning) { auto relativeInteriorPoint=C2.getRelativeInteriorPoint(mr2);//sometimes this can be reused auto generatorsOfSpanOfFacet=facet.getSpan(mr2,mr); auto order=combineOnTop( combineOnTop(Matrix::rowVectorMatrix(relintF,mr), Matrix::rowVectorMatrix(-relativeInteriorPoint,mr),mr),generatorsOfSpanOfFacet,mr2); int number; int optimalVertexIndex=vertexIndex(exponents,order,number,mr); adjacencyMatrix2[current][optimalVertexIndex]=1; adjacencyMatrix2[optimalVertexIndex][current]=1; if(!markedNumber[optimalVertexIndex]) { toExplore.push_back(optimalVertexIndex); markedNumber[optimalVertexIndex]=number; } } } } refinement.push_back(C3); comesFromVertexNumber.push_back(current); isFullDim.push_back(markedNumber[current]>=2); numberOfFullDim++; } } assert(refinement.size()); int ncones=refinement.size(); Matrix adjacencyMatrix(ncones,ncones,mr2); for(int i=0;ibestScore) { root=i; bestScore=score; } } auto w=refinement[root].getRelativeInteriorPoint(mr2); auto orderW=combineOnTop(Matrix::rowVectorMatrix(w,mr),generatorsOfSpanOfC,mr2); // The following seems to be dead data/codes #if 0 pmrvector order(ncones,mr2); for(int i=0;i(exponents.getWidth(),mr2); for(int i=0;i strict(0,exponents.getWidth(),mr2);strict.reserveRows(refinement.size()-1); Matrix nonstrict(0,exponents.getWidth(),mr2);nonstrict.reserveRows(exponents.getHeight()-1+refinement.size()); // {// auto mrTemp=ResourceWrapper(mr); for(int j=0;j(nonstrict.transposed(mr),Matrix(0,exponents.getWidth(),mr).transposed(mr),strict.transposed(mr),mr2,mr);//HERE TO HERE A=intersection2(A,cone,mr2,mr); Matrix HiPri(0,exponents.getWidth(),mr2);HiPri.reserveRows(nonstrict.getHeight()); Matrix LoPri(0,exponents.getWidth(),mr2);LoPri.reserveRows(nonstrict.getHeight()); for(int j=0;j temp(nonstrict.transposed(mr),Matrix(0,exponents.getWidth(),mr).transposed(mr),strict.transposed(mr),mr2); auto temp2=temp.facetDefining();//HERE // int nfacets=0; // for(int i=0;i nonstrict2(0,exponents.getWidth(),mr2); for(int i=0;i(nonstrict.transposed(mr),Matrix(0,nonstrict.getWidth(),mr).transposed(mr),strict.transposed(mr),mr2,mr); ret.reserve(ret.size()+1); ret.emplace_back(std::move(intersection2(A,cone,mr,mr2)),mr);//FAILS IF ENABLED if(ret.back().isEmpty(mr))ret.pop_back(); } else { pmrvector > temp(mr2);temp.reserve(nonstrict.getHeight()); codimension1ConesB(nonstrict.transposed(mr),strict.transposed(mr),temp,mr2,mr);//This causes a a lot of memory ussage ret.reserve(ret.size()+temp.size()); for(int j=0;j!=temp.size();j++) { // ret.reserve(ret.size()+1); ret.emplace_back(std::move(intersection2(temp[j],cone,mr2,mr)),mr);//FAILS IF ENABLED if(ret.back().isEmpty(mr))ret.pop_back(); } } } return ret; } // --------------- // ProgressCounter // --------------- void ProgressCounter::newIterator(int c){bounds.push_back(c);counter.push_back(0);} void ProgressCounter::iterate() { counter.back()++; if(counter.back()==bounds.back()) { counter.pop_back(); bounds.pop_back(); } } string ProgressCounter::toString()const { stringstream s; s<<"Bounds:"; for(auto &b:bounds)s< class CommonRefinementTraverser: public Traverser { StackResource stackResource; StackResource stackResource2; vector> coneStack; vector> usedStack; vector relationTableStack; vector>> coneOptionsStack; vector chosenStack; vector> cones; RelationTable relationTable; vector used; vector > exponents; std::function&)> collector; std::function&)> filter; PolytopeIntersectionData &data; // vector const &edgeCounts; bool filterOK; int depth; CommonStatistics *statistics; public: void setupOptionStack() { //std::cerr<<"Setup\n"; if(depth==-1) { coneOptionsStack.push_back(cones);//In this case usedStack and chosenStack are not updated?? usedStack.push_back(used); chosenStack.push_back(-1); } else if(depth!=data.polytopes.size() && filterOK) { if(statistics)statistics->numberOfIntermediateVertices++; int chosen=relationTableStack.back().bestPolytopeIndex(usedStack.back()); chosenStack.push_back(chosen); usedStack.push_back(usedStack.back());usedStack.back()[chosen]=1; if(1) { auto temp=restrictedTropicalHypersurface((coneStack.back()),exponents[chosen],&stackResource,&stackResource2/*,mr,mr2 WHAT DO WE DO ABOUT ALLOCATORS?*/); vector> temp2(temp.size()); temp2.resize(distance(temp2.begin(),copy_if(temp.begin(),temp.end(),temp2.begin(),[](HalfOpenCone &c)->bool{return !c.isEmpty();}))); coneOptionsStack.push_back(temp2);//can one of these be empty? Should we filter? } else coneOptionsStack.push_back( restrictedTropicalHypersurface( coneStack.back(), exponents[chosen], &stackResource, &stackResource2 ) ); } else { coneOptionsStack.push_back(vector>()); usedStack.push_back(usedStack.back());// we need to push something, so that we have something to pop chosenStack.push_back(0); } // std::cerr<<"Done setup\n"; } CommonRefinementTraverser( vector> cones_, vector &used_, vector > const &exponents_, std::function&)> collector_, // vector const &edgeCounts_, PolytopeIntersectionData /*const*/ &data_, RelationTable const &relationTable_, std::function&)> filter_, CommonStatistics *statistics_): // coneStack{cone},//initialise as empty // usedStack{used},//--- // relationTableStack{relationTable},//--- relationTable(relationTable_), cones(cones_), used(used_), collector(collector_), exponents(exponents_), data(data_), // edgeCounts(edgeCounts_), filter(filter_), depth(0-1), stackResource(20160000), stackResource2(20160000), statistics(statistics_) { filterOK=filter(coneStack.back()); setupOptionStack(); } virtual int getEdgeCountNext( void ) { if(depth==-1)return cones.size(); return coneOptionsStack.back().size(); } virtual int moveToNext( int index, bool collect_info ) { // std::cerr<<"Next\n"; coneStack.push_back(coneOptionsStack.back()[index]); int chosen=chosenStack.back(); if(depth==-1) { relationTableStack.push_back(relationTable); } else { Vector v=coneStack.back().getRelativeInteriorPoint(&stackResource,&stackResource2); set indices; for(int i=0;i0); THIS CAN FAIL - what does that mean? if(indices.size()==1) relationTableStack.push_back(relationTableStack.back().intersection( data.polytopes[chosen].relationTables[*indices.begin()] )); else relationTableStack.push_back(relationTableStack.back()); } depth++; filterOK=filter(coneStack.back()); setupOptionStack(); return 0; } virtual void moveToPrev( int index ) { // std::cerr<<"Prev\n"; coneStack.pop_back(); usedStack.pop_back(); chosenStack.pop_back(); relationTableStack.pop_back(); coneOptionsStack.pop_back(); depth--; filterOK=true; } // This function will be called once for every state in a traversal. // int collectCounter = 0; virtual void collectInfo( void ){ // if (++collectCounter % 1000 == 0) // std::cout << "." << std::flush; if(depth==usedStack.back().size()) if(depth!=0 || !coneStack.back().isEmpty()) if(filterOK) collector(coneStack.back()); } // Function for printing the state to cout for debug purposes. virtual void printState( void ){} }; //Suggested lambda: [&collector](HalfOpenCone const& c)mutable->void{collector.push_back(c);} template void commonRefinement( vector> cones, vector &used, vector > const &exponents, std::function const&)> collector, // std::vector > &collector, int &nonEmptyIntersections, // vector const *edgeCounts, PolytopeIntersectionData /*const*/ &data, RelationTable const &relationTable, ProgressCounter &progress, CommonStatistics *commonStatistics, int j, std::function&)> filter) { // std::cerr<<"NumberOfPivotingStep at start:"<&)> collector_ vector> V; V.reserve(j); for(int i=0;i const& c)mutable->void{lock_guard lck{m};collector(c);} /*,*edgeCounts*/,data,relationTable,filter,commonStatistics); /* CommonRefinementTraverser T(cone,used,exponents, //collector_ [&collector,&m](HalfOpenCone const& c)mutable->void{lock_guard lck{m};collector.push_back(c);} ,*edgeCounts,data,relationTable,filter);*/ // traverse_simple(&T); cerr<<"Ready for traversal!!!\n"; if(j==1) traverse_simple(&V[0]); else { assert(j>0); vector V2; for(int i=0;i dontChoose=used; auto w=tem.getRelativeInteriorPoint(mr); #endif int chosen=0; #if 0 if(0) for(chosen=0;chosen empty(A.getWidth(),0); Matrix e=combineOnTop(A,B,mr).transposed(mr2);//TO HERE Cone s(empty,e,mr,mr2); int D=s.getDimension(); int d=D; if(1) { int max=-10000000; int min=10000000; int max2=max;//second largest int count=0; for(int j=0;jmax){max2=max;max=prod;count=1;} else if(prod==max){count++;max2=max;} else if(prod>max2){max2=prod;} if(prodmin) if(count<2) { d=100*count+100*(max2-min)/(max-min); } } if(d(*edgeCounts)[best]) { bestValue=d; best=i; dontChoose=used;for(int j=0;j>f=restrictedTropicalHypersurface((cone),exponents[chosen],mr,mr2); #define NUMBER_OF_ITERATIONS_TO_EXECUTE_BEFORE_PRINT 1000 {static int i; i++;if(i==NUMBER_OF_ITERATIONS_TO_EXECUTE_BEFORE_PRINT){std::cerr< v=f[i].getRelativeInteriorPoint(mr,mr2); set indices; for(int i=0;i0); THIS CAN FAIL - what does that mean? if(indices.size()==1) { commonRefinement(f[i],used,exponents,collector,nonEmptyIntersections,edgeCounts,data, relationTable.intersection( data.polytopes[chosen].relationTables[*indices.begin()] ),progress,filter ); } else commonRefinement(f[i],used,exponents,collector,nonEmptyIntersections,edgeCounts,data,relationTable,progress,filter); used[chosen]=0; } progress.iterate(); } } } #endif // std::cerr<<"NumberOfPivotingSteps at end:"< ZMatrix toZMatrix(Matrix const &m) { ZMatrix ret(m.getHeight(),m.getWidth()); for(int i=0;i string toString(std::vector > &collector, int ambientDimension) { ZFan F(ambientDimension); for(auto c:collector) { auto C=c.closure(); F.insert(ZCone(toZMatrix(C.getFacetNormals().transposed()),toZMatrix(C.getOrthogonalComplement().transposed()))); } return F.toString(); } }; #include "gfanlib_circuittableint.h" #include "gfanlib_circuittableinteger.h" template class gfan::PolytopeIntersectionData; template class gfan::PolytopeIntersectionData; template class gfan::PolytopeIntersectionData; template void gfan::commonRefinement(vector> cone, vector &used, vector > const &exponents, std::function const&)> collector,int &nonEmptyIntersections/*,vector const *edgeCounts*/, PolytopeIntersectionData /*const*/ &data, RelationTable const &relationTable, ProgressCounter &progress, CommonStatistics *statistics, int j, std::function&)> filter); template void gfan::commonRefinement(vector> cone, vector &used, vector > const &exponents, std::function const&)> collector,int &nonEmptyIntersections/*,vector const *edgeCounts*/, PolytopeIntersectionData /*const*/ &data, RelationTable const &relationTable, ProgressCounter &progress, CommonStatistics *statistics, int j, std::function&)> filter); template void gfan::commonRefinement(vector> cone, vector &used, vector > const &exponents, std::function const&)> collector,int &nonEmptyIntersections/*,vector const *edgeCounts*/, PolytopeIntersectionData /*const*/ &data, RelationTable const &relationTable, ProgressCounter &progress, CommonStatistics *statistics, int j, std::function&)> filter); namespace gfan{ int64 numberOfPivotingSteps; }; //--------------------------------------------------------------- remove after more lambda expression experience #include void testabc(std::function func) { for(int i=0;i<10;i++)std::cerr<bool{return a[z]%3;}); } gfan0.8beta/src/traverser_tropical.h0000664000175000017500000000124715177170257017261 0ustar andersanders#ifndef TRAVERSER_TROPICAL_H_INCLUDED #define TRAVERSER_TROPICAL_H_INCLUDED #include "symmetrictraversal.h" #include "polynomial.h" class TropicalTraverser: public ConeTraverser { PolynomialSet coneGroebnerBasis; PolynomialSet idealGroebnerBasis; PolyhedralCone theCone; IntegerVector positiveGrading; int n,d; void updatePolyhedralCone(); public: TropicalTraverser(PolynomialSet const &coneGroebnerBasis_, PolynomialSet const &idealGroebnerBasis_); virtual void changeCone(IntegerVector const &ridgeVector, IntegerVector const &rayVector); virtual IntegerVectorList link(IntegerVector const &ridgeVector); virtual PolyhedralCone & refToPolyhedralCone(); }; #endif gfan0.8beta/src/versioninfo.h0000664000175000017500000000015615177170257015706 0ustar andersandersconst char *GFAN_RELEASEDIR="gfan0.8beta"; const char *GFAN_FORKTIME= "1778184367 Thu May 07 22:06:07 2026" ; gfan0.8beta/src/xfig.h0000664000175000017500000000524715177170257014310 0ustar andersanders#ifndef XFIG_H_INCLUDED #define XFIG_H_INCLUDED #include #include "vektor.h" #include // In time this class should also be used in renderer.cpp and in ep_xfig.cpp class XFig { FILE *f; IntegerVectorList p; bool arrowOrigin; bool arrowTarget; int offsetX,offsetY; public: XFig(FILE *f_): f(f_), offsetX(0), offsetY(0) { fprintf(f,"#FIG 3.2\n" "Landscape\n" "Center\n" "Inches\n" "Letter\n" "100.00\n" "Single\n" "-2\n" "1200 2\n"); } void setOffset(int x, int y) { offsetX=x; offsetY=y; } void beginDrawLine(bool arrowOrigin_=false, bool arrowTarget_=false, int thickness=1) { arrowOrigin=arrowOrigin_; arrowTarget=arrowTarget_; fprintf(f,"2 1 0 %i 0 7 50 -1 -1 0.000 0 0 -1 %i %i",thickness,int(arrowTarget),int(arrowOrigin)); } void addPoint(int x, int y) { IntegerVector v(2); v[0]=x+offsetX; v[1]=y+offsetY; p.push_back(v); } void endDrawLine() { assert(p.size()>0); fprintf(f," %i\n",(int)p.size()); if(arrowOrigin) fprintf(f,"\t 2 1 1.00 60.00 120.00\n"); if(arrowTarget) fprintf(f,"\t 2 1 1.00 60.00 120.00\n"); for(IntegerVectorList::const_iterator i=p.begin();i!=p.end();i++) { fprintf(f," %i %i",(*i)[0]+offsetX,(*i)[1]+offsetY); } p=IntegerVectorList(); fprintf(f,"\n"); } void drawString(int x, int y, string const &s, int size=12) { fprintf(f,"4 0 0 48 -1 0 %i 0.0000 4 135 270 %i %i ",size,x+offsetX,y+offsetY); fprintf(f,"%s",s.c_str()); fprintf(f,"\\001\n"); } void drawDot(int x, int y, int color=0, int radius=75) { fprintf(f,"1 3 0 1 %i %i 49 -1 20 0.000 1 0.0000 %i %i %i %i %i %i %i %i\n",0,color,x+offsetX,y+offsetY,radius,radius,x+offsetX,y+offsetY,x+offsetX+radius,y+offsetY); } // code for drawing intersection of halfspaces struct Point { float x,y,z; float dot(const Point &p)const{return x*p.x+y*p.y+z*p.z;} bool isInside(const Point &p)const{return dot(p)>-0.05;} // bool isInside(const Point &p)const{return dot(p)>0;} Point(float x_, float y_, float z_):x(x_),y(y_),z(z_){} void print()const; Point intersect(Point a, Point b)const { float A=dot(a); float B=dot(b); float cA=B/(B-A); float cB=-A/(B-A); return Point(a.x*cA+b.x*cB,a.y*cA+b.y*cB,a.z*cA+b.z*cB); } }; typedef list Polygon; void kickPoint(const Point &p, int mode); void printPolygon(const Polygon &p); void drawPolygon(const Polygon &vertices,int mode); Polygon intersect(const Polygon &polygon, const Point &normal); }; #endif gfan0.8beta/src/app_tropicalintersection.cpp0000664000175000017500000003223015177170257021002 0ustar andersanders#include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "termorder.h" #include "ep_standard.h" #include "ep_xfig.h" #include "gfanapplication.h" #include "polyhedralcone.h" #include "polyhedralfan.h" #include "tropical.h" #include "tropical2.h" #include "symmetry.h" #include "halfopencone.h" #include "symmetrictraversal.h" #include "traverser_groebnerfan.h" #include "tropical_weildivisor.h" #include "field_rationalfunctions2.h" #include "log.h" class SymmetricTargetTropicalBasisTester : public SymmetricTarget { public: IntegerVector violatingVector; bool violationFound; PolynomialSet g; SymmetricTargetTropicalBasisTester(PolynomialSet const &g_): g(g_), violationFound(false) { } bool process(ConeTraverser &traverser) { IntegerVector w=traverser.refToPolyhedralCone().getRelativeInteriorPoint(); log2 AsciiPrinter(Stderr) << "Testing weight vector:\n"< #include #include #include #include #include #include #include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "termorder.h" #include "ep_standard.h" #include "ep_xfig.h" #include "polyhedralcone.h" #include "gfanapplication.h" #include "saturation.h" #include "field_rationals.h" #include "field_zmodpz.h" #include "field_rationalfunctions.h" #include "symmetry.h" #include "linalg.h" #include "fieldlp.h" #include "integer.h" #include "polynomialgcd.h" #include "packedmonomial.h" #include "gfanlib_zcone.h" #include "gfanlib_tableau.h" #include "gfanlib_hypersurfaceintersection.h" #include "gfanlib_circuittableint.h" #include "gfanlib_mixedvolume.h" #include "lll.h" #include "gfanlib_circuittableinteger.h" #include "tropical2.h" #include "app_anton.h" using namespace gfan; class ProcessComplexApplication : public GFanApplication { InputFileOption inputFileOption; SimpleOption nConesInInputOption; SimpleOption fvectorOption; SimpleOption postComplexOption; SimpleOption optionLinealitySpace; SimpleOption optionUnboundedDirections; SimpleOption optionDebug; SimpleOption optionRecessionCone; IntegerOption optionSelectUnboundedBounded; public: bool includeInDefaultInstallation() { return false; } const char *helpText() { return "This program is used for processing a set of half-open cones - for example produced by the _tropicalprevariety command with option --matrixoutput.\n"; } ProcessComplexApplication(): fvectorOption("--fvector","Compute and output f-vector"), nConesInInputOption("--inputsize","Output the number of cones in input"), postComplexOption("--postcomplex","Output complex"), optionLinealitySpace("--linealityspace","Output generators of lineality space"), optionUnboundedDirections("--rays","Output --rays--??"), optionRecessionCone("--recessioncone","Output closure of the recession cone (given by generators)."), optionSelectUnboundedBounded("--unboundedbouded","Output a set of halfopen cones covering the bounded/unbounded relatively open faces of the input. 1 chooses unbounded, 2 chooses bounded."), optionDebug("--debug","Enable debug.") { registerOptions(); } const char *name() { return "_processcomplex"; } template gfan::Matrix convertMatrix(IntMatrix const &m) { gfan::Matrix ret(m.getHeight(),m.getWidth()); for(int i=0;i(cin); #if 0 std::vector> f; for(auto &c:f2) if(c.isEmpty()) debug<<"HalfOpenCone is empty!\n"; else { f.push_back(HalfOpenCone()); swap(c,f.back()); } if(nConesInInputOption.getValue()) std::cout<> theSet; for(auto &K:f) { // cerr<<"HALFOPENCONE:";K.save(cerr); // auto KK=K.closure(); // cerr<<"CLOSURE:";KK.save(cerr); gfan::Matrix linealitySpace=K.closure().getLinealitySpace(); // std::cerr<<"LinealitySpace:\n"< linealitySpace; { ThreadSafeSequenceStreamIterator i(inputFileOption.getFreshStreamReference(),true); if(auto s1=i.getNextString()) { auto s=std::stringstream(s1.value().second); auto c=HalfOpenCone::load(s); ambientDimension=c.getAmbientDimension()+1; linealitySpace=c.closure().getLinealitySpace(); } else { std::cerr<<"Error: The set contains no polyhedra."; assert(0); } } if(optionSelectUnboundedBounded.getValue()) { std::cout<<"(\n"; ThreadSafeSequenceStreamIterator i(inputFileOption.getFreshStreamReference()); while(auto s1=i.getNextString()) { bool first=true; auto s=std::stringstream(s1.value().second); auto c=HalfOpenCone::load(s); vector> temp; if(optionSelectUnboundedBounded.getValue()==2) { c.iterateOverBoundedPart(0,[&temp](HalfOpenCone const& c)mutable->void{temp.push_back(c);}); } else temp.push_back(c.unionOfUnboundedFacesOfRepresentedConjectured()); for(auto &c:temp) { if(!first) { std::cout<<","; } first=false; c.save(std::cout); } } std::cout<<")\n"; } if(fvectorOption.getValue()) { Vector fv(ambientDimension); ThreadSafeSequenceStreamIterator i(inputFileOption.getFreshStreamReference()); while(auto s1=i.getNextString()) { auto s=std::stringstream(s1.value().second); auto c=HalfOpenCone::load(s); fv=fv+c.fVector(); } std::cout< collector(linealitySpace); { int count = 0; ThreadSafeSequenceStreamIterator i(inputFileOption.getFreshStreamReference(),true); std::mutex mtx; vector dummy(100); std::for_each(std::execution::par, dummy.begin(),dummy.end(),[&](size_t t) { while(auto s1=i.getNextString()) { auto s=std::stringstream(s1.value().second); auto c=HalfOpenCone::load(s); if (count++ % 5000 == 0) std::cerr << "ray collector: " << /*f.size()*/-count << " cones remaining\n"; if(!c.isEmpty()) { auto rays=c.closure().getRays(); { scoped_lock l(mtx); for(int i=0;i> f; ThreadSafeSequenceStreamIterator i(inputFileOption.getFreshStreamReference(),true); while(auto s1=i.getNextString()) { auto s=std::stringstream(s1.value().second); auto c=HalfOpenCone::load(s); if(c.isEmpty()) debug<<"HalfOpenCone is empty!\n"; else { f.push_back(HalfOpenCone()); swap(c,f.back()); } } //std::cerr< postcomplex(fc,true); PostComplex postcomplex(f,collector); //std::cerr << postcomplex; if(optionUnboundedDirections.getValue()) std::cout< > f2; vector > f2Rays; f2.reserve(f.size()); f2Rays.reserve(f.size()); for(auto &a:f) if(!a.isEmpty()) { auto temp=HalfOpenCone(a); auto tempRays=temp.closure().getRays(); gfan::Matrix actualUnbounedDirections(0,ambientDimension); debug<closure().getLinealitySpace(); RayCollector collector(linealitySpace); int numberOfNonEmptyHalfOpenCones=0; /* EquivalenceRelation rel; for(int i=0;i toBeMadeEquivalent; if(!(numberOfNonEmptyHalfOpenCones&255))std::cerr< chosenVariables; for(int j=0;jterms.begin();j!=i2->terms.end();j++) p+=Term(Q.zHomomorphism(1),Monomial(r,j->first.exponent[i]*IntegerVector::standardVector(2,0)+dot(j->first.exponent,concatenation(IntegerVector(1),*k))*IntegerVector::standardVector(2,1))); newI.push_back(p); } debug << "NEW" << newI << "\n"; assert(0); PolyhedralFan::fullSpace(2) Fnew=PolyhedralFan::fullSpace(2); for(PolynomialSet::const_iterator i=newI.begin();i!=newI.end();i++) { Fnew=refinement(PolyhedralFan::normalFanOfNewtonPolytope(*i),F); } if(Fnew.conesBegin()->linealitySpace().dimension()==1) { IntegerVectorList toCheckNew=Fnew.getRays(); for(PolyhedralFan::coneIterator i=Fnew.begin();i!=Fnew.end();i++) if(i->dimension()==2) toCheckNew.push_back(i->getRelativeInteriorPoint()); IntegerVectorList toCheck; for(IntegerVector::const_iterator i=toCheckNew.begin();i!=toCheckNew.end();i++) toCheck.push_back(); } else { assert(0); } PolyhedralFan F(n); #endif // debug<<"COOONE"<<*k<exponents()<<"\n"; F.printWithIndices(&debug,FPF_default); PolyhedralFan t=PolyhedralFan::bergmanOfPrincipalIdeal(*i); t.printWithIndices(&debug,FPF_default); F=refinement(t,F); F.printWithIndices(&debug,FPF_default); } }*/ log2 debug<<"Done with polyhedral computations\n"; log2 debug<<"Intersection fan dim "<subvector(1,n).isZero()) candidates.push_back(*j); log2 debug<<"Number of candidates "<<(int)candidates.size()<<"\n"; if(candidates.size()==1) { ret.push_back(candidates.front()); if(earlyExit)return ret; } else { toCheck.splice(toCheck.end(),candidates); } assert(i==0); } else { stat_finiteLiftHard++; complicatedList.push_back(*k); } } log2 debug<<"Checking complicated list:\n"; log2 debug<supportAsZeroOneVector(); log2 debug<<"Support sum:"<=i)j2++; list chosenVariables; chosenVariables.push_back(i); chosenVariables.push_back(j2); IntegerVectorList A; #if 0 A.push_back(IntegerVector::allOnes(n)-IntegerVector::standardVector(n,i)-IntegerVector::standardVector(n,j2)); A.push_back(IntegerVector::allOnes(n)); MatrixTermOrder T(A); PolynomialSet J=I; debug<<"Doing elimination\n"; buchberger(&J,T,true); PolynomialRing newRing2(newRing.getField(),2); PolynomialSet P=J.polynomialRingIntersection(newRing2,&chosenVariables); #else A.push_back(IntegerVector::allOnes(n+1)-IntegerVector::standardVector(n+1,i)-IntegerVector::standardVector(n+1,j2)-IntegerVector::standardVector(n+1,n)); A.push_back(IntegerVector::allOnes(n+1)); MatrixTermOrder T(A); PolynomialRing newRing3=I.getRing().withVariablesAppended("H"); PolynomialSet J=I.homogenization(newRing3); log2 debug<<"Doing elimination\n"; buchberger(&J,T,true); J.changeNumberOfVariables(I.getRing()); PolynomialRing newRing2(newRing.getField(),2); PolynomialSet P=J.polynomialRingIntersection(newRing2,&chosenVariables); #endif additionalPolys.splice(additionalPolys.end(),J); log2 debug<<"Done eliminating\n"; log2 debug<generatorsOfLinealitySpace(); assert(l.size()==1); F.push_back(l.front()); F.push_back(-l.front()); // debug<<"LINgen"<0) { // debug<<"YES\n"; int LCM=(*k)[j]*(*l)[1]/gcdGFAN((*k)[j],(*l)[1]); int s1=LCM/(*k)[j]; int s2=LCM/(*l)[1]; if(s1<0)s1=-s1; if(s2<0)s2=-s2; // debug<<"YES\n"; IntegerVector v=s1*concatenation(concatenation(k->subvector(0,i),IntegerVector(1)),k->subvector(i,n-1))+s2*(*l)[0]*IntegerVector::standardVector(n,i); preCheck.push_back(v); } log2 debug<<"Combined:\n"<=i)j2++; list chosenVariables; chosenVariables.push_back(i); chosenVariables.push_back(j2); IntegerVectorList A; A.push_back(IntegerVector::allOnes(n)-IntegerVector::standardVector(n,i)-IntegerVector::standardVector(n,j2)); A.push_back(IntegerVector::allOnes(n)); MatrixTermOrder T(A); PolynomialSet J=I; debug<<"Doing elimination\n"; buchberger(&J,T,true); PolynomialRing newRing2(newRing.getField(),2); PolynomialSet P=J.polynomialRingIntersection(newRing2,&chosenVariables); debug<<"Done eliminating\n"; assert(P.size()==1); debug<<"Doing polyhedral computation\n"; // debug<<"PFRONT:"<generatorsOfLinealitySpace(); assert(l.size()==1); F.push_back(l.front()); F.push_back(-l.front()); // debug<<"LINgen"<0) { // debug<<"YES\n"; int LCM=(*k)[j]*(*l)[1]/gcdGFAN((*k)[j],(*l)[1]); int s1=LCM/(*k)[j]; int s2=LCM/(*l)[1]; if(s1<0)s1=-s1; if(s2<0)s2=-s2; // debug<<"YES\n"; IntegerVector v=s1*concatenation(concatenation(k->subvector(0,i),IntegerVector(1)),k->subvector(i,n-1))+s2*(*l)[0]*IntegerVector::standardVector(n,i); preCheck.push_back(v); } debug<<"Combined:\n"< using namespace std; static int lookup(vector const &v, int i) { for(int j=0;j const &v) { int ret=1; for(int i=0;iv[j])ret=-ret; return ret; } PolynomialSet minors(PolynomialRing const &R, int r, int d, int n, bool withNames, bool M2Convention) { int namesOffset=d*n; int entriesOffset=0; PolynomialSet ret(R); vector I; if(M2Convention) { for(int i=0;i J; if(M2Convention) { for(int i=0;i K; for(int i=0;i::const_iterator s=K.begin(); for(int i=0;i #include "parser.h" #include "printer.h" #include "field_rationals.h" #include "polynomial.h" #include "matrix.h" #include "gfanlib_matrix.h" //#include "mixedvolume.h" #include "gfanlib_paralleltraverser.h" #include "gfanapplication.h" #include "gfanlib_mixedvolume.h" #include "log.h" using namespace gfan; using namespace gfan::MixedVolumeExamples; class MixedVolumeApplication : public GFanApplication { SimpleOption optionVectorInput; IntegerOption optionCyclic; IntegerOption optionNoon; IntegerOption optionChandra; IntegerOption optionKatsura; IntegerOption optionGaukwa; IntegerOption optionEco; IntegerOption optionNThreads; IntegerOption optionSteps; IntegerOption optionJustGeneratorsOfCyclic; SimpleOption optionResume; public: const char *helpText() { return "This program computes the mixed volume of the Newton polytopes of a list of polynomials. The ring is specified on the input. After this follows the list of polynomials.\n"; } MixedVolumeApplication(): optionVectorInput("--vectorinput","Read in a list of point configurations instead of a polynomial ring and a list of polynomials."), optionCyclic("--cyclic","Use cyclic-n example instead of reading input."), optionNoon("--noon","Use Noonburg-n example instead of reading input."), optionChandra("--chandra","Use Chandrasekhar-n example instead of reading input."), optionKatsura("--katsura","Use Katsura-n example instead of reading input."),/* Note that Verschelde's mixed volumes for the Katsura examples do not match those produced by gfan. The configurations do not seem to be identical for all n. */ optionGaukwa("--gaukwa","Use Gaukwa-n example instead of reading input."), optionEco("--eco","Use Eco-n example instead of reading input."), optionNThreads("-j","Number of threads"), optionJustGeneratorsOfCyclic("--cyclikpolynomialgenerators","Just print the generators of the cyclic example and abort."), optionSteps("-s","Number of steps", 500), optionResume("--resume","Continue enumeration from saved state...") { optionJustGeneratorsOfCyclic.hide(); optionSteps.hide(); registerOptions(); } const char *name() { return "_mixedvolume"; } IntMatrix rowsToIntegerMatrix(IntegerVectorList const &l) { assert(l.size()); IntMatrix ret(l.size(),l.front().size()); IntegerVectorList::const_iterator I=l.begin(); for(int i=0;isecond*=R.getField().zHomomorphism(-1); AsciiPrinter(stdout)< tuple; if(optionCyclic.getValue()) tuple=cyclic(optionCyclic.getValue()); else if(optionNoon.getValue()) tuple=noon(optionNoon.getValue()); else if(optionChandra.getValue()) tuple=chandra(optionChandra.getValue()); else if(optionKatsura.getValue()) tuple=katsura(optionKatsura.getValue()); else if(optionGaukwa.getValue()) tuple=gaukwa(optionGaukwa.getValue()); else if(optionEco.getValue()) tuple=eco(optionEco.getValue()); else { IntegerVectorListList tuple1; if(optionVectorInput.getValue()) { tuple1=FileParser(Stdin).parseIntegerVectorListList(); } else { PolynomialSet g=FileParser(Stdin).parsePolynomialSetWithRing(); tuple1=g.exponents(); } for(IntegerVectorListList::const_iterator i=tuple1.begin();i!=tuple1.end();i++) tuple.push_back(rowsToIntegerMatrix(*i).transposed()); } log1 for(auto i=tuple.begin();i!=tuple.end();i++)std::cerr<<*i; if(optionResume.getValue()) { std::cerr<<"LOAD!\n"; ProgressPointer progressPointer=loadProgress(); cout< #include #include #include "gfanlib_symmetry.h" #include "gfanlib_matrix.h" #include "gfanlib_zcone.h" namespace gfan{ enum FanPrintingFlags{ FPF_conesCompressed=1, FPF_conesExpanded=2, FPF_cones=4, FPF_maximalCones=8, FPF_boundedInfo=16, FPF_values=32, FPF_group=64, FPF_multiplicities=128, FPF_xml=256, FPF_tPlaneSort=512, FPF_primitiveRays=1024, FPF_rays=2048, FPF_default=2+4+8+2048 }; class SymmetricComplex{ int n; ZMatrix linealitySpace; // Has full row rank. ZMatrix vertices; std::map indexMap; SymmetryGroup sym; IntVector dimensionsAtInfinity()const; public: int getAmbientDimension()const{return n;} class Cone { bool isKnownToBeNonMaximalFlag; public: IntVector indices;//always sorted Cone(std::set const &indices_, int dimension_, Integer multiplicity_, bool sortWithSymmetry, SymmetricComplex const &complex); std::set indexSet()const; int dimension; Integer multiplicity; bool isKnownToBeNonMaximal()const{return isKnownToBeNonMaximalFlag;} void setKnownToBeNonMaximal(){isKnownToBeNonMaximalFlag=true;} bool isSubsetOf(Cone const &c)const; SymmetricComplex::Cone permuted(Permutation const &permutation, SymmetricComplex const &complex, bool withSymmetry)const; ZVector sortKey; Permutation sortKeyPermutation; bool operator<(const Cone & b)const; bool isSimplicial(int linealityDim)const; void remap(SymmetricComplex &complex); /** * This routine computes a basis for the orthogonal complement of the cone. * Notice that the lineality space, which is unknown at the time, is ignored. * This routine is deterministic and used for orienting the faces when computing homology. */ ZMatrix orthogonalComplement(SymmetricComplex &complex)const; }; typedef std::set ConeContainer; ConeContainer cones; int dimension; SymmetricComplex(ZMatrix const &rays, ZMatrix const &linealitySpace_, SymmetryGroup const &sym_); /** * Returns a reference to the matrix of vertices on which the complex is build. * The reference is valid as the Symmetric complex object exists. */ ZMatrix const &getVertices()const{return vertices;} bool contains(Cone const &c)const; void insert(Cone const &c); int getMaxDim()const; int getMinDim()const; int getLinDim()const; bool isMaximal(Cone const &c)const; bool isPure()const; ZVector fvector(bool boundedPart=false, bool infinityPart=false)const; void buildConeLists(bool onlyMaximal, bool compressed, std::vector >*conelist, std::vector > *multiplicities=0)const; std::string toStringJustCones(int dimLow, int dimHigh, bool onlyMaximal, bool group, std::ostream *multiplicities=0, bool compressed=false, bool tPlaneSort=false)const; std::string toString(int flags=0)const; bool isSimplicial()const; /** Calling this function will change the representative of each cone orbit by "applying" the permutation which will give the sortkey to the set of indices of the cone. */ void remap(); /** * Looks up the index of the vector among the vertices. */ int indexOfVertex(ZVector const &v)const; int numberOfConesOfDimension(int d)const; /** * Given a cone this returns its index among all cones of that dimension. * Used for assigning "names" to cones. */ int dimensionIndex(Cone const &c); #if 0 /** * This routine is used for constructing the boundary map for homology computations. */ void boundary(Cone const &c, IntVector &indices, IntVector &signs); /** * This routine computes the ith boundary map for homology as a matrix. */ ZMatrix boundaryMap(int i); #endif ZCone makeZCone(IntVector const &indices)const; }; } #endif gfan0.8beta/src/gfanlib_traversal.h0000664000175000017500000000267315177170257017040 0ustar andersanders#ifndef GFANLIB_TRAVERSAL_H_INCLUDED #define GFANLIB_TRAVERSAL_H_INCLUDED #include "gfanlib_zfan.h" namespace gfan{ /* This file contains the generic algorithm for traversing a connected component of a pure fan up to symmetry. */ class FanTraverser { public: /** * Go to the cone which is connected to the current facet through the ridge in direction ray. * The "ridge" is a relative interior point of the ridge. */ virtual void changeCone(ZVector const &ridgeVector, ZVector const &rayVector)=0; /** * Compute the link of the fan in the ridge given by the vector ridge IS THIS A FACET NORMAL OR AN INTERIOR POINT? * This gives a list of symmetry invariant points under the actions keeping the link fixed. */ virtual std::list link(ZVector const &ridgeVector)=0; virtual ZCone & refToPolyhedralCone()=0; /** * If there is no cone state data for the traverser, half of the changeCone() calls can be avoided. * That this is a valid of optimization for the ConeTraverser is indicated returning true in the following function. */ virtual bool hasNoState()const; }; class Target { public: virtual bool process(FanTraverser &traverser)=0; }; class FanBuilder : public Target { ZFan coneCollection; public: ZFan const &getFanRef(){return coneCollection;} FanBuilder(int n, SymmetryGroup const &sym); bool process(FanTraverser &Traverser); }; void traverse(FanTraverser &traverser, Target &target, SymmetryGroup const *sym=0); }; #endif gfan0.8beta/src/app_replace.cpp0000664000175000017500000000532315177170257016154 0ustar andersanders/* * app_cone.cpp * * Created on: Aug 14, 2025 * Author: anders */ #include #include #include #include "parser.h" #include "printer.h" #include "gfanapplication.h" #include "gfanlib_tableau.h" #include "gfanlib_circuittableinteger.h" #include "log.h" using namespace gfan; class ReplaceApplication : public GFanApplication { StringOption optionPattern; StringOption optionReplacement; public: bool includeInDefaultInstallation() { return true; } const char *helpText() { return "This program can replace multi-line strings in a stdin stream and write the new stream to stdout. The way to pass line breaks in arguments in bash is to do $'\\n' as an escape sequence for a newline.\n"; } ReplaceApplication(): optionPattern("-p","Specify pattern.",""), optionReplacement("-r","Specify replacement.","") { registerOptions(); } const char *name() { return "_replace"; } void inc(int &a, int bound) { a++; if(a>=bound)a-=bound; } int main() { // string pattern="{\n{"; // string replacement="{"; string pattern=optionPattern.getValue(); string replacement=optionReplacement.getValue(); log1 debug<<"Pattern length:"<<(int)pattern.size()<<" Replacement length:"<<(int)replacement.size()<<"\n"; assert(pattern.size()); int n=pattern.size()+4096; { char buffer[n]; int bufferstart=0; int bufferend=0; int bufferused=0; do { while(!cin.eof() && bufferusedn)toRead=n-bufferend; cin.read(&(buffer[bufferend]),toRead); int r=cin.gcount(); bufferend+=r; if(bufferend>=n)bufferend-=n; bufferused+=r; } else { cin.get(buffer[bufferend]); inc(bufferend,n); bufferused++; } } } while(pattern.size()<=bufferused) { bool match=true; int i=bufferstart; for(auto c:pattern) { if(buffer[i]!=c) { match=false; break; } inc(i,n); } if(!match) { cout.put(buffer[bufferstart]); inc(bufferstart,n); bufferused--; } else { cout<=pattern.size()); while(bufferused) { cout.put(buffer[bufferstart]); inc(bufferstart,n); bufferused--; } } /* while(!cin.eof()) { char c; cin.get(c); cout.put(c); }*/ return 0; } }; static ReplaceApplication theApplication; gfan0.8beta/src/gfanlib_circuittableinteger.h0000664000175000017500000002323315177170257021060 0ustar andersanders/* * gfanlib_circuittableinteger.h * * Created on: 25 Feb 2020 * Author: anders */ /* * This is an implementation of an integer that can replace CircuitTableInt32 for * debugging purposes. */ #ifndef SRC_GFANLIB_CIRCUITTABLEINTEGER_H_ #define SRC_GFANLIB_CIRCUITTABLEINTEGER_H_ #include #include #include #include #include #include "gfanlib_z.h" namespace gfan{ class CircuitTableInteger{ Integer v; public: CircuitTableInteger(Integer const &v_): //protect v(v_) { } CircuitTableInteger() //protect { } CircuitTableInteger(int32_t val): v(val) { } CircuitTableInteger(std::string const&s): v(s) { } // Explicit casting between CircuitTableInts // Inspired by https://stackoverflow.com/questions/714213/c-template-casting explicit CircuitTableInteger(CircuitTableInt32 const &a): v(a.v) { } operator gfan::CircuitTableInt32()const { if(!v.fitsInInt())throw IntegerConversionException; return v.toInt(); } explicit CircuitTableInteger(CircuitTableInt64 const &a): v(a.v) { } /* operator gfan::CircuitTableInt64()const //Currently functions are missing for implementing this. { if(!v.fitsInInt())throw IntegerConversionException; return v.toInt(); }*/ class Divisor{ public: Integer v; Divisor(CircuitTableInteger const &a): v(a.v) { assert(!v.isZero()); } }; class Double{ public: Integer v; Double(){}; Double(Integer a):v(a){}; Double &operator+=(Double a){v+=a.v;return *this;} Double &operator-=(Double a){v-=a.v;return *this;} CircuitTableInteger castToSingle()const; bool isZero()const{return v.sign()==0;} bool isNegative()const{return v.sign()<0;} Double operator-()const{Double ret;ret.v=-v;return ret;} friend Double operator-(Double const &a, Double const &b){return Double(a.v-b.v);} friend Double operator+(Double const &a, Double const &b){return Double(a.v+b.v);} Double &addWithOverflowCheck(Double const &a) { return *this+=a;; } std::string toString()const{std::stringstream s;s<0;} int sign()const{return isNegative()?-1:isPositive();} friend int determinantSign1(CircuitTableInteger const &a, CircuitTableInteger const &c, CircuitTableInteger const &b, CircuitTableInteger const &d)//NOTICE MIXED ORDER. MUST WORK BY EXTENDING { Integer r=(a.v)*(c.v)-(b.v)*(d.v); return r.sign(); } friend int determinantSign3(CircuitTableInteger const &a, CircuitTableInteger const &c, CircuitTableInteger const &b, CircuitTableInteger const &d)//NOTICE MIXED ORDER. MUST WORK BY EXTENDING { Integer r=(a.v)*(c.v)-(b.v)*(d.v); return r.sign(); } friend int determinantSign2(CircuitTableInteger const &a, CircuitTableInteger const &c, CircuitTableInteger const &b, CircuitTableInteger const &d)//NOTICE MIXED ORDER. MUST WORK BY EXTENDING { Integer r=(a.v)*(c.v)-(b.v)*(d.v); return r.sign(); } std::string toString()const{std::stringstream s;s<extend();t-=a.extend();*this=t.castToSingle();return *this;} CircuitTableInteger &addWithOverflowChecking(CircuitTableInteger const &a){Double t=this->extend();t+=a.extend();*this=t.castToSingle();return *this;} CircuitTableInteger negatedWithOverflowChecking()const{return (-extend()).castToSingle();} friend Double extendedMultiplication(CircuitTableInteger const &a, CircuitTableInteger const &b){return Double(a.v*b.v);} friend Double extendedMultiplication(CircuitTableInteger const &a, int32_t b){return Double(a.v*Integer(b));}//to be removed? friend CircuitTableInteger min(CircuitTableInteger const &a, CircuitTableInteger const &b){return (b.vb)?a:b; } static CircuitTableInteger computeNegativeBound(CircuitTableInteger * __restrict__ Ai, int w) { CircuitTableInteger M;assert(M.v.isZero()); CircuitTableInteger m;assert(m.v.isZero()); for(int j=0;jv); } } #endif /* SRC_GFANLIB_CIRCUITTABLEINTEGER_H_ */ gfan0.8beta/src/gfanlibglue.h0000664000175000017500000000137215177170257015625 0ustar andersanders/* * gfanlibglue.h * * Created on: Jun 27, 2023 * Author: anders */ #ifndef SRC_GFANLIBGLUE_H_ #define SRC_GFANLIBGLUE_H_ #include #include "gfanlib.h" #include "vektor.h" namespace gfan{ template gfan::Matrix convertMatrix(IntMatrix const &m) { gfan::Matrix ret(m.getHeight(),m.getWidth()); for(int i=0;i IntegerVector toIntegerVector(gfan::Vector const &w) { IntegerVector W(w.size()); for(int i=0;i #include using namespace std; class Graph{ int n; bool isDirected; class Edge{ public: int a,b; Edge(int a_, int b_): a(a_), b(b_) { } bool operator<(const Edge &e)const { return (a edges; public: Graph(int numberOfVertices, bool isDirected_=false): n(numberOfVertices), isDirected(isDirected_) { } void addEdge(int a, int b) { edges.insert(Edge(a,b)); } int diameter(int *timesAttained=0)const; string toString()const; }; #endif gfan0.8beta/src/app_tropicalcurve.cpp0000664000175000017500000001001515177170257017415 0ustar andersanders/* * app_tropicalcurve.cpp * * Created on: Apr 23, 2014 * Author: anders */ #include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "termorder.h" #include "ep_standard.h" #include "ep_xfig.h" #include "gfanapplication.h" #include "polyhedralcone.h" #include "polyhedralfan.h" #include "tropical.h" #include "tropical2.h" #include "tropicalbasis.h" #include "tropicalcurve.h" #include "dimension.h" #include "field_rationalfunctions2.h" #include "log.h" class TropicalCurveApplication : public GFanApplication { // SimpleOption optionHomogenize; SimpleOption optionSingleRay; IntegerOption optionParameters; public: const char *helpText() { return "This program computes a tropical basis for an ideal defining a tropical curve. Defining a tropical curve means that the Krull dimension of R/I is at most 1 + the dimension of the homogeneity space of I where R is the polynomial ring. The input is a generating set for the ideal. If the input is not homogeneous option -h must be used.\n"; } TropicalCurveApplication(): // optionHomogenize("-h","Homogenise the input before computing a tropical basis and dehomogenise the output. This is needed if the input generators are not already homogeneous.") optionParameters("--parameters","With this option you can specify how many variables to treat as parameters instead of variables. This makes it possible to do computations where the coefficient field is the field of rational functions in the parameters.",0), optionSingleRay("--singleray","Only compute a single ray of the curve.") { registerOptions(); } const char *name() { return "_tropicalcurve"; } IntegerVectorList tropicalCurveWithPreprocessing(PolynomialSet const &theInput) { { list temp=theInput.multiDeHomogenizationToKeep(); for(list::const_iterator i=temp.begin();i!=temp.end();i++)debug<<*i<<"\n"; } debug< toKeep=groebnerBasis.multiDeHomogenizationToKeep(); PolynomialSet g1=groebnerBasis.multiDeHomogenization(); PolynomialSet g=g1.homogenization(g1.getRing().withVariablesAppended("H")); // saturatedIdeal(g); buchberger(&g,WeightReverseLexicographicTermOrder(IntegerVector::allOnes(g.getRing().getNumberOfVariables()))); int d=krullDimension(g); debug<<"d="<subvector(0,i->size()-1)-(*i)[i->size()-1]*IntegerVector::allOnes(i->size()-1)); } debug<< "Dehomogenized"<::const_iterator j=toKeep.begin();j!=toKeep.end();j++,J++) v[*j]=(*i)[J]; rays2.push_back(v); } return rays2; } int main() { FileParser P(Stdin); PolynomialSet theInput=P.parsePolynomialSetWithRing(); if(optionParameters.getValue()) theInput=makeVariablesParameters( makeVariablesParameters(theInput.getRing(),optionParameters.getValue()) ,theInput); AsciiPrinter(Stdout).printVectorList(tropicalCurveWithPreprocessing(theInput)); return 0; } }; static TropicalCurveApplication theApplication; gfan0.8beta/src/app_walk.cpp0000664000175000017500000000342215177170257015475 0ustar andersanders#include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "termorder.h" #include "ep_standard.h" #include "ep_xfig.h" #include "genericwalk.h" #include "gfanapplication.h" #include "timer.h" class WalkApplication : public GFanApplication { FieldOption theFieldOption; public: bool includeInDefaultInstallation() { return false; } WalkApplication() { registerOptions(); } const char *name() { return "_walk"; } int main() { lpSetSolver("cddgmp"); FileParser p(Stdin); PolynomialSet g=p.parsePolynomialSetWithRing(); // StandardGradedLexicographicTermOrder t1; WeightReverseLexicographicTermOrder t1(StringParser("(1,1,1,1,1,1)").parseIntegerVector()); AsciiPrinter P(Stderr); assert(g.checkMarkings(t1)); // g.mark(t1); // AsciiPrinter(Stdout).printPolynomialSet(g); t1.printMatrix(P,6); LexicographicTermOrder t2; // LexicographicTermOrder t1(1); // LexicographicTermOrder t2; fprintf(Stderr,"Computing starting Groebner basis\n"); autoReduce(&g,t1); // buchberger(&g,t1); AsciiPrinter(Stdout).printPolynomialSet(g); fprintf(Stderr,"Walking with perturbation\n"); // int n=g.numberOfVariablesInRing(); // for(int i=n;i>=0;i--) // for(int i=n-4;i>=0;i--) { PolynomialSet g2(g.getRing()); // g2=genericWalkPerturbation(g,t1,t2,i,i); g2=genericWalkPerturbation(g,t1,t2,6,6); AsciiPrinter(Stdout).printPolynomialSet(g2); } return 0; } const char *helpText() { return "This program walks. THIS PROGRAM NEEDS TO BE FIXED.\n"; } }; static WalkApplication theApplication; gfan0.8beta/src/field.h0000664000175000017500000002261615177170257014435 0ustar andersanders#ifndef FIELD_H_INCLUDED #define FIELD_H_INCLUDED #define USESHAREDPTR 0 #include #include #include #include #if USESHAREDPTR #include #endif #include /* Always include cstdio before gmp.h.*/ #include //SHOULD BE REMOVED /** A FieldElement is an element of a Field in the algebraic sense. A FieldElement always knows its associated Field to which it belongs. We may perform arithmetic operations on a FieldElement and a FieldElement is passed around by value. Thus in C++ it makes no sense to derive classes from the FieldElement class. The actual data is contained in an object of the class FieldElementImplementation and the FieldElement serves as a smart pointer with reference counting to this implementation. */ class FieldElement { public: #if USESHAREDPTR std::shared_ptr implementingObject; #else class FieldElementImplementation *implementingObject; #endif FieldElement(class FieldElementImplementation *implementingObject_); void makeUnique(); public: class FieldImplementation *getField()const; /* Returns a pointer to the FieldImplementation which does NOT get its refCount increased. The pointer should immediately be cast to a Field object, there by incresing the refCount. This allows code like this void test(FieldElement a){Field b=a.getField();...}. Would it also work for this (a+a).getField(); or could the ref count get 0 before it is increased? */ /* * The following is only supported for Z/pZ */ int getIntegerRepresentation()const; /* * The following two are only supported for rationals. */ mpq_t const *getGmpRationalTemporaryPointer()const; double floatingPointApproximation()const; bool isInteger()const; virtual FieldElement multiplierGivingInteger()const; #if !USESHAREDPTR void setImplementingObject(FieldElementImplementation *implementingObject_){implementingObject=implementingObject_;assert(0);} #endif FieldElement one() const; bool isZero()const; virtual bool isOne()const; friend FieldElement operator+(const FieldElement &a,const FieldElement &b); friend FieldElement operator-(const FieldElement &a,const FieldElement &b); friend FieldElement operator-(const FieldElement &b); FieldElement inverse()const; int valuation(bool maxt=true)const; // Return type might change in the future. In partucular because taking valuation of zero is a mistake at the moment. int sign()const; // Only allowed for ordered field. Asserts otherwise. int pAdicValuation(int p)const; // Only allowed for the field Q. FieldElement pAdicRemainder(class Field const &ZModPZ)const; // Only allowed for the field Q. FieldElement modularRepresentative(class Field const &ZModPZ)const; // Only allowed for the field Q and only for integers in that field. int integerRepresentative()const; // Only allowed for Z/pZ std::string toString(bool writeIfOne=true, bool alwaysWriteSign=false ,bool latexMode=false) const; void operator*=(const FieldElement &a); void operator+=(const FieldElement &a); /** Adds a*b to the value of the object. */ void madd(const FieldElement &a, const FieldElement &b); friend FieldElement operator*(const FieldElement &a,const FieldElement &b); // Constructors: FieldElement(class Field const &f);//Initializes to zero FieldElement() // This constructor causes a lot of trouble { // Having a legal FieldElement without an implementing object #if USESHAREDPTR fprintf(stderr,"TROUBLE\n"); #else implementingObject=0; // we must check for each assignment (copy constructor/assignment operator) #endif } // if the pointer is zero. - And some operation will be illegal on // on this element ( one(),..... ) FieldElement(const FieldElement &a); FieldElement& operator=(const FieldElement& a); virtual ~FieldElement(); }; /** The Field class describes an object which has as its value a field (in the algebraic sense). The value/object can be copied around as a value. The Field object serves as a smart pointer with reference counting to a FieldImplementation which is hidden for the user of the Field class. In C++ it makes no sense to derive classes from this class because the object must be passable by value. */ class Field { friend class FieldElement; // protected: public: #if USESHAREDPTR std::shared_ptr implementingObject; #else class FieldImplementation *implementingObject; #endif public: FieldElementImplementation *zHomomorphismImplementation(int n)const; /** @return The image of the integer n under the unique ring homomorphism from the integers Z to the Field taking 1 to the multiplicative neutral element. */ FieldElement zHomomorphism(int n)const; FieldElement random()const; int getCharacteristic()const; bool isRationals()const; const char *name(); std::string toString()const; Field(Field const &a);//copy constructor //explicit Field(FieldImplementation *implObj);//constructor Field& operator=(const Field& a);//assignment ~Field();//destructor }; class FieldElementImplementation { static int numberOfLivingFieldElementImplementations; class FieldImplementation &theFieldImplementation; /* Ideally FieldElement would contain a Field object. However, since methods of a Field should be able to return FieldElements this seems impossible because of the stupid one-pass convention of C++. Instead FieldElement contains a FieldImplementation pointer and FieldElement must thus do the reference counting for this pointer on its own ???*/ public: class FieldImplementation *getField()const; // class Field getField2()const; // class FieldImplementation *getFieldImplementation()const; // class Field getField()const; static int getNumberOfLivingFieldElementImplementations(){return numberOfLivingFieldElementImplementations;}; #if !USESHAREDPTR int refCount; #endif FieldElementImplementation(FieldImplementation &a);//ref count = 1?? virtual ~FieldElementImplementation(); virtual FieldElementImplementation *one() const=0; virtual FieldElementImplementation *copy()const=0; virtual bool isZero()const=0; virtual FieldElementImplementation *sum(const FieldElementImplementation &b)const=0; virtual FieldElementImplementation *difference(const FieldElementImplementation &b)const=0; virtual FieldElementImplementation *negation()const=0; virtual FieldElementImplementation *inverse()const=0; virtual std::string toString(bool writeIfOne=true, bool alwaysWriteSign=false, bool latexMode=false) const=0; virtual void operator*=(const FieldElementImplementation &a)=0; virtual void operator+=(const FieldElementImplementation &a)=0; virtual void madd(const FieldElementImplementation &a,const FieldElementImplementation &b)=0; virtual int valuation(bool maxt=true)const { return 0; } virtual int sign()const { assert(0); return 0; } virtual int pAdicValuation(int p)const { assert(0); return 0; } virtual FieldElement pAdicRemainder(Field const &ZModPZ)const { assert(0); return pAdicRemainder(ZModPZ); } virtual FieldElement modularRepresentative(Field const &ZModPZ)const { assert(0); return modularRepresentative(ZModPZ); } /* virtual int integerRepresentative()const { assert(0); return 0; }*/ virtual mpq_t const *getGmpRationalTemporaryPointer()const { fprintf(stderr,"*this object is not implemented using GMP\n"); assert(0); return 0; } virtual int getIntegerRepresentation()const { fprintf(stderr,"*this is not in Z/pZ.\n"); assert(0); } virtual bool isInteger()const { assert(0); return false; } virtual FieldElementImplementation *multiplierGivingInteger()const { assert(0); return multiplierGivingInteger(); } Field& operator=(const Field& a) { assert(0); }//assignment }; extern int FieldElementRationalsLiving; class FieldImplementation { public: #if !USESHAREDPTR int refCount; #endif // static class Field *currentField; // ?? // static void checkInitialized(); // ?? protected: // class Field *next; // static class Field *list; static int numberOfLivingFieldImplementations; public: virtual FieldElementImplementation *zHomomorphismImplementation(int n)=0;/* Creates FieldElementImplementation object with refcount1 */ public: static int getNumberOfLivingFieldImplementations(){return numberOfLivingFieldImplementations;}; #if USESHAREDPTR FieldImplementation()//:refCount(0) #else FieldImplementation():refCount(0) #endif { // fprintf(stderr,"FieldImplementationCreation\n"); numberOfLivingFieldImplementations++; } virtual ~FieldImplementation() { // fprintf(stderr,"FieldImplementationDestruction\n"); numberOfLivingFieldImplementations--; } virtual bool isRationals()const { return false; } // static Field *find(const char *name); // static void printList(FILE *f); virtual FieldElement zHomomorphism(int n)=0; virtual FieldElement random() { assert(0); } virtual int getCharacteristic()const=0; virtual const char *name()=0; virtual std::string toString()const=0; // static void setField(Field *f); // Do we really want these // static FieldElement staticZHomomorphism(int n); // two procedures? }; #endif gfan0.8beta/src/mixedvolume.cpp0000664000175000017500000000141115177170257016231 0ustar andersanders#include "mixedvolume.h" #include "tropical_weildivisor.h" #include "multiplicity.h" int64 mixedVolume(PolynomialSet const &g_) { PolynomialSet g=idealWithSameMultiplicity(g_); g.simplestPolynomialsFirst(); int n=g.getRing().getNumberOfVariables(); // debug << (int) g.size()<<" "<getMultiplicity(); } #include "halfopencone.h" bool mixedVolumePositive(PolynomialSet const &g) { return nonEmptyStableIntersection(g); } gfan0.8beta/src/traverser_bsptree.h0000664000175000017500000000321315177170257017103 0ustar andersanders/* * traverser_bsptree.h * * Created on: Aug 23, 2011 * Author: anders */ #ifndef TRAVERSER_BSPTREE_H_INCLUDED #define TRAVERSER_BSPTREE_H_INCLUDED #include "symmetrictraversal.h" #include "bsptree.h" /** * This class finds the closures of the connected components of the complement of the union of the cones stored in the BSPTree. * TODO: remove this class and replace it by BSPTreeTraverser. */ class BSPTreeTraverser: public ConeTraverser { BSPTree const&tree; PolyhedralCone theCone; public: BSPTreeTraverser(int n_, BSPTree const & tree_); virtual void changeCone(IntegerVector const &ridgeVector, IntegerVector const &rayVector); virtual IntegerVectorList link(IntegerVector const &ridgeVector); PolyhedralCone & refToPolyhedralCone(); virtual bool hasNoState()const; }; /** * This class has the same functionality as BSPTreeTraverser, but with the advantage that the BSP tree need not have been build. * TODO: rename this class and header and source file. */ class BSPTreeTraverser2: public ConeTraverser { BSPTree const&tree; PolyhedralCone theCone; public: /** * Set reconstructable to true if the BSPTree stores multiplicities allowing polytope reconstruction. */ BSPTreeTraverser2(int n_, BSPTree const & tree_, bool vertexReconstructing_); virtual void changeCone(IntegerVector const &ridgeVector, IntegerVector const &rayVector); virtual IntegerVectorList link(IntegerVector const &ridgeVector); PolyhedralCone & refToPolyhedralCone(); virtual bool hasNoState()const; void calibrate(){orthantCalibrate();} }; #endif gfan0.8beta/src/app_homogenize.cpp0000664000175000017500000000466515177170257016715 0ustar andersanders/* TO DO: Find a good way to input the name of the new variable and adjust this to helpText. */ #include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "termorder.h" #include "gfanapplication.h" #include "wallideal.h" class HomogenizeApplication : public GFanApplication { SimpleOption optionIdeal; SimpleOption optionHomogenizationVector; SimpleOption optionH; public: const char *helpText() { return "This program homogenises a list of polynomials by introducing an extra variable. The name of the variable to be introduced is read from the input after the list of polynomials. Without the -w option the homogenisation is done with respect to total degree.\n" "Example:\n" "Input:\n" "Q[x,y]{y-1}\n" "z\n" "Output:\n" "Q[x,y,z]{y-z}\n"; ; } HomogenizeApplication(): optionIdeal("-i","Treat input as an ideal. This will make the program compute the homogenisation of the input ideal. This is done by computing a degree Groebner basis and homogenising it."), optionHomogenizationVector("-w","Specify a homogenisation vector. The length of the vector must be the same as the number of variables in the ring. The vector is read from the input after the list of polynomials.\n"), optionH("-H","Let the name of the new variable be H rather than reading in a name from the input.") { registerOptions(); } const char *name() { return "_homogenize"; } int main() { FileParser P(Stdin); PolynomialSet g=P.parsePolynomialSetWithRing(); string homogenizingVariableName=(optionH.getValue())?"H":P.parseVariableName(); IntegerVector grading; if(optionHomogenizationVector.getValue()) grading=P.parseIntegerVector(); else grading=IntegerVector::allOnes(g.numberOfVariablesInRing()); if(optionIdeal.getValue()) { WeightReverseLexicographicTermOrder t(grading); buchberger(&g,t); } PolynomialSet h(g.getRing().withVariablesAppended(homogenizingVariableName)); AsciiPrinter(Stdout).printPolynomialRing(h.getRing()); AsciiPrinter(Stdout).printNewLine(); for(PolynomialSet::const_iterator i=g.begin();i!=g.end();i++) { h.push_back(i->homogenization(h.getRing(),&grading)); } AsciiPrinter(Stdout).printPolynomialSet(h); return 0; } }; static HomogenizeApplication theApplication; gfan0.8beta/src/app_genericlinearchange.cpp0000664000175000017500000000514515177170257020520 0ustar andersanders#include "parser.h" #include "printer.h" #include "polynomial.h" #include "buchberger.h" #include "wallideal.h" #include "termorder.h" #include "gfanapplication.h" #include "tropical2.h" class GenericLinearChangeApplication : public GFanApplication { public: const char *helpText() { return "This program takes a list of polynomials and performs a generic linear change of coordinates by introducing nxn new variables.\n"; } GenericLinearChangeApplication() { registerOptions(); } const char *name() { return "_genericlinearchange"; } Polynomial substitueMonomial(Monomial const &m, vector const &substitutionTable, PolynomialRing const &R2) { IntegerVector v=m.exponent; Polynomial ret=R2.one(); for(int i=0;i const &substitutionTable, PolynomialRing const &R2) { Polynomial ret(R2); for(TermMap::const_iterator i=f.terms.begin();i!=f.terms.end();i++) { ret+=R2.polynomialFromField(i->second)*substitueMonomial(i->first,substitutionTable,R2); } return ret; } int main() { FileParser P(Stdin); PolynomialSet g=P.parsePolynomialSetWithRing(); PolynomialRing R1=g.getRing(); int n=g.getRing().getNumberOfVariables(); vector names=matrixVariableNames("g",n,n); for(int i=0;i substitutionTable; for(int i=0;i=0 && i<26)sprintf(s,"%c",i+'a'); else if(i>=26 && i<52)sprintf(s,"%c",i+'A'-26); else assert(0); return string(s); */ } void Printer::printVariable(PolynomialRing const &r, int i) { printCheck(); printString(variableIndexToString(r,i)); } void Printer::printPolyhedralCone(class PolyhedralCone const &c, bool xml) { printCheck(); PolyhedralCone C=c; C.print(this,xml); } void Printer::printPolyhedralConeAsFan(class PolyhedralCone const &c) { printCheck(); PolyhedralCone C=c; C.printAsFan(this); } void Printer::printPolyhedralFan(class PolyhedralFan const &c) { printCheck(); c.print(this); } void Printer::printField(class Field const &f) { printCheck(); printString(f.toString().c_str()); } void Printer::printPolynomialRing(class PolynomialRing const &r) { printCheck(); printField(r.getField()); printString("["); printString(r.toStringVariableNames()); printString("]"); } Printer& Printer::operator<<(class FieldElement const &v) { *this< &l) { printString("{"); for(list::const_iterator i=l.begin();i!=l.end();i++) { if(i!=l.begin())printString(","); printInteger(*i); } printString("}"); return *this; } Printer& Printer::operator<<(PolyhedralCone const &c) { printPolyhedralCone(c); return *this; } Printer& Printer::operator>>(PolyhedralCone const &c) { printPolyhedralConeAsFan(c); return *this; } Printer& Printer::operator<<(PolyhedralFan const &f) { printPolyhedralFan(f); return *this; } Printer& Printer::operator<<(TermOrder const &t) { t.print(*this); return *this; } Printer& Printer::operator<<(int a) { printInteger(a); return *this; } Printer& Printer::operator<<(char a) { printChar(a); return *this; } Printer& Printer::operator<<(double a) { printFloat(a); return *this; } //-------------------------------------------------- // LatexPrinter //-------------------------------------------------- void LatexPrinter::pushMathMode() { printCheck(); if(mathModeLevel==0)fprintf(f," $ "); mathModeLevel++; } void LatexPrinter::popMathMode() { printCheck(); mathModeLevel--; if(mathModeLevel==0)fprintf(f," $ "); } void LatexPrinter::printMonomial(const Monomial &m, bool alwaysWriteSign, bool writeIfOne) { printCheck(); const IntegerVector &exponent=m.exponent; const int sign=1; pushMathMode(); bool variablePrinted=false; for(int i=0;i0) { fprintf(f,"%s",variableIndexToString(m.getRing(),i).c_str()); if(int(exponent[i]*sign)!=1) { fprintf(f,"^{%i}",int(exponent[i]*sign)); } variablePrinted=true; } if(!variablePrinted && writeIfOne)fprintf(f,"1"); popMathMode(); } void LatexPrinter::printInteger(int i, int minimalFieldWidth) { printCheck(); fprintf(f,"%i",i); } void LatexPrinter::printFloat(double i, int minimalFieldWidth) { printCheck(); assert(0); } void LatexPrinter::printComplexNumber(ComplexNumber const &i, int minimalFieldWidth) { printCheck(); assert(0); } void LatexPrinter::printFieldElement(const FieldElement &e, bool writeIfOne, bool alwaysWriteSign) { printCheck(); printString(e.toString(writeIfOne,alwaysWriteSign,true)); } void LatexPrinter::printTerm(const Term &t) { printCheck(); } void LatexPrinter::printPolynomial(const Polynomial &p) { printCheck(); pushMathMode(); bool first=true; // If the polynomial has a marked term it is written first IntegerVector e=p.getMarked().m.exponent; for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) if(e==i->first.exponent) { printFieldElement(i->second,i->first.exponent.isZero(),!first); printMonomial(i->first,false,false); first=false; } for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) if(e!=i->first.exponent) { printFieldElement(i->second,i->first.exponent.isZero(),!first); printMonomial(i->first,false,false); first=false; } popMathMode(); } void LatexPrinter::printPolynomialSet(const PolynomialSet &s, bool newLine) { printCheck(); pushMathMode(); printString("\\{"); if(newLine) { popMathMode(); printNewLine(); pushMathMode(); } for(PolynomialSet::const_iterator i=s.begin();i!=s.end();i++) { if(i!=s.begin()) { printString(",\n"); if(newLine) { popMathMode(); printNewLine(); pushMathMode(); } } printPolynomial(*i); } printString("\\}\n"); popMathMode(); } void LatexPrinter::printPolynomialSetList(const PolynomialSetList &s) { printCheck(); pushMathMode(); printString("\\{"); for(PolynomialSetList::const_iterator i=s.begin();i!=s.end();i++) { if(i!=s.begin())printString(",\n"); printPolynomialSet(*i); } printString("\\}\n"); popMathMode(); } void LatexPrinter::printVectorList(const IntegerVectorList &s, bool indexed) { printCheck(); int index=0; pushMathMode(); printString("\\{"); for(IntegerVectorList::const_iterator i=s.begin();i!=s.end();i++) { if(i!=s.begin())printString(",\n"); if(indexed) { printInteger(index++); printString(": "); } printVector(*i); } printString("\\}\n"); popMathMode(); } void LatexPrinter::printVectorListList(const IntegerVectorListList &s) { printCheck(); pushMathMode(); bool useColorVector=false; IntegerVector colors=StringParser("(1,0,0,1,0,0,1,0,0,1,0,0)").parseIntegerVector(); int colorIndex=0; fprintf(f,"\\left("); for(IntegerVectorListList::const_iterator i=s.begin();i!=s.end();i++) if(i->size()) { int H=i->front().size(); if(i!=s.begin())fprintf(f,","); fprintf(f,"\\bgroup\\begin{pmatrix}"); for(int t=0;tbegin();k!=i->end();k++,K++) { bool color=false; if(useColorVector)color=colors[K+colorIndex]; if(k!=i->begin())fprintf(f,"&"); if(color) fprintf(f,"{\\grey %i}",(*k)[t]); else fprintf(f,"%i",(*k)[t]); } fprintf(f,"\\\\"); } fprintf(f,"\\end{pmatrix}\\egroup"); colorIndex+=i->size(); } fprintf(f,"\\right)"); popMathMode(); } void LatexPrinter::printVector(const IntegerVector &v, bool curly, int minimalFieldWidth) { printCheck(); int s=v.size(); int i=0; fprintf(f,"$("); if(i0) fprintf(f,"^%i",int(exponent[i])); if(int(exponent[i])<0) fprintf(f,"^(%i)",int(exponent[i])); } variablePrinted=true; } if(!variablePrinted && writeIfOne)fprintf(f,"1"); // fprintf(stderr,"(%i)",exponent.size()); } void AsciiPrinter::printFieldElement(const FieldElement &e, bool writeIfOne, bool alwaysWriteSign) { printCheck(); printString(e.toString(writeIfOne,alwaysWriteSign)); } void AsciiPrinter::printTerm(const Term &t) { printCheck(); } void AsciiPrinter::printPolynomial(const Polynomial &p) { printCheck(); bool first=true; if(p.terms.empty()) { printString("0"); return; } // If the polynomial has a marked term it is written first // printString("_"); IntegerVector e=p.getMarked().m.exponent; for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) if(e==i->first.exponent) { printFieldElement(i->second,i->first.exponent.isZero(),!first); if((!i->first.exponent.isZero())&&(!i->second.isOne())&&(!(-(i->second)).isOne()))printString("*"); printMonomial(i->first,false,false); first=false; } // printString("_"); for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) if(e!=i->first.exponent) { printFieldElement(i->second,i->first.exponent.isZero(),!first); if((!i->first.exponent.isZero())&&(!i->second.isOne())&&(!(-(i->second)).isOne()))printString("*"); printMonomial(i->first,false,false); first=false; } } void AsciiPrinter::printPolynomialSet(const PolynomialSet &s, bool newLine) { printCheck(); printString("{"); printNewLine(); for(PolynomialSet::const_iterator i=s.begin();i!=s.end();i++) { if(i!=s.begin())printString(",\n"); printPolynomial(*i); } printString("}\n"); } void AsciiPrinter::printPolynomialSetList(const PolynomialSetList &s) { printCheck(); printString("{"); printNewLine(); for(PolynomialSetList::const_iterator i=s.begin();i!=s.end();i++) { if(i!=s.begin())printString(",\n"); printPolynomialSet(*i); } printString("}\n"); } void AsciiPrinter::printVectorList(const IntegerVectorList &s, bool indexed) { printCheck(); int index=0; printChar(vectorListLeftBrackets()); printNewLine(); for(IntegerVectorList::const_iterator i=s.begin();i!=s.end();i++) { if(i!=s.begin())printString(",\n"); if(indexed) { printInteger(index++); printString(": "); } printVector(*i); // printNewLine(); } printChar(vectorListRightBrackets()); printNewLine(); } void AsciiPrinter::printVectorListList(const IntegerVectorListList &s) { printCheck(); printChar(vectorListLeftBrackets()); printNewLine(); for(IntegerVectorListList::const_iterator i=s.begin();i!=s.end();i++) { if(i!=s.begin())printString(",\n"); printVectorList(*i); } printChar(vectorListRightBrackets()); printNewLine(); } void AsciiPrinter::printVector(const IntegerVector &v, bool curly, int minimalFieldWidth) { printCheck(); fprintf(f,"%c",curly?'{':vectorLeftBrackets()); for(int i=0;i"); if(i\n"); } void XmlPrinter::printFloatVector(const FloatVector &v, bool curly, int minimalFieldWidth) { printCheck(); assert(0); } void XmlPrinter::printComplexVector(ComplexVector const &v, bool curly, int minimalFieldWidth) { printCheck(); assert(0); } void XmlPrinter::printVectorList(const IntegerVectorList &s, bool indexed) { printCheck(); fprintf(f,""); for(IntegerVectorList::const_iterator i=s.begin();i!=s.end();i++) printVector(*i); fprintf(f,"\n"); } void XmlPrinter::printVectorListList(const IntegerVectorListList &s) { printCheck(); assert(0); } void XmlPrinter::printInteger(int i, int minimalFieldWidth) { printCheck(); assert(0); } void XmlPrinter::printFloat(double i, int minimalFieldWidth) { printCheck(); assert(0); } void XmlPrinter::printComplexNumber(ComplexNumber const &i, int minimalFieldWidth) { printCheck(); assert(0); } void XmlPrinter::printMonomial(const Monomial &m, bool alwaysWriteSign, bool writeIfOne) { printCheck(); assert(0); } void XmlPrinter::printFieldElement(const FieldElement &e, bool writeIfOne, bool alwaysWriteSign) { printCheck(); assert(0); } void XmlPrinter::printTerm(const Term &t) { printCheck(); assert(0); } void XmlPrinter::printPolynomial(const Polynomial &p) { printCheck(); assert(0); } void XmlPrinter::printPolynomialSet(const PolynomialSet &s, bool newLine) { printCheck(); assert(0); } void XmlPrinter::printPolynomialSetList(const PolynomialSetList &s) { printCheck(); assert(0); } void XmlPrinter::printString(const string &s) { printCheck(); assert(0); } void XmlPrinter::printNewLine() { printCheck(); assert(0); } /* void XmlPrinter::printVector(const IntegerVector &v) { } void XmlPrinter::printString(const string &s) { } */ AsciiPrinter debug(Stderr); AsciiPrinter pout(Stdout); gfan0.8beta/src/wallideal.cpp0000664000175000017500000007654215177170257015652 0ustar andersanders#include "wallideal.h" #include "division.h" #include "buchberger.h" #include "timer.h" #include "printer.h" #include "lp.h" #include "polyhedralcone.h" #include "tropical2.h" #include "linalg.h" #include "log.h" #include #include static Timer flipTimer("Flip",10); static Timer flipTimer1("Flip1",10); static Timer flipTimer2("Flip2",10); static Timer flipTimer3("Flip3",10); static Timer flipTimer4("Flip4",10); static Timer flipTimer5("Flip5",10); static Timer coneTimer("fajskfda",10); Polynomial wallPolynomial(Polynomial const &p, IntegerVector const &wallNormal) { Polynomial r(p.getRing()); IntegerVector markedExponent=p.getMarked().m.exponent; for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) { IntegerVector dif=markedExponent-i->first.exponent; if(dependent(dif,wallNormal)) r+=Polynomial(Term(i->second,i->first)); } r.mark(Monomial(r.getRing(),markedExponent)); return r; } static Polynomial wallPolynomial(Polynomial const &p, IntegerVectorList const &wallEqualities) { Polynomial r(p.getRing()); IntegerVector markedExponent=p.getMarked().m.exponent; for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) { IntegerVector dif=markedExponent-i->first.exponent; bool dep=false; for(IntegerVectorList::const_iterator j=wallEqualities.begin();j!=wallEqualities.end();j++) { if(dependent(dif,*j)) { dep=true; break; } } if(dep || dif.isZero()) r+=Polynomial(Term(i->second,i->first)); } r.mark(Monomial(p.getRing(),markedExponent)); return r; } PolynomialSet wallIdeal(PolynomialSet const &groebnerBasis, IntegerVector const &wallNormal) { PolynomialRing theRing=groebnerBasis.getRing(); PolynomialSet r(theRing); for(PolynomialSet::const_iterator i=groebnerBasis.begin();i!=groebnerBasis.end();i++) { r.push_back(wallPolynomial(*i,wallNormal)); } return r; } PolynomialSet lowerDimensionalWallIdeal(PolynomialSet const &groebnerBasis, IntegerVectorList const &wallEqualities) { PolynomialRing theRing=groebnerBasis.getRing(); PolynomialSet r(theRing); for(PolynomialSet::const_iterator i=groebnerBasis.begin();i!=groebnerBasis.end();i++) { r.push_back(wallPolynomial(*i,wallEqualities)); } return r; } IntegerVectorList wallRemoveScaledInequalities(IntegerVectorList const &l) { IntegerVectorList ret; /*for(IntegerVectorList::const_iterator i=l.begin();i!=l.end();i++) { bool found=false; assert(!i->isZero()); for(IntegerVectorList::const_iterator k=ret.begin();k!=ret.end();k++) if(dependent(*i,*k)&&dotLong(*i,*k)>0)found=true; if(!found)ret.push_back(*i); } */ set temp; // log0 fprintf(Stderr,"C\n"); for(IntegerVectorList::const_iterator i=l.begin();i!=l.end();i++)temp.insert(normalized(*i)); // log0 fprintf(Stderr,"D\n"); for(set::const_iterator i=temp.begin();i!=temp.end();i++)ret.push_back(*i); return ret; } IntegerVectorList algebraicTest(IntegerVectorList const &l, PolynomialSet const &groebnerBasis) // TO DO: FIGURE OUT IF THIS TEST WORKS IN THE NON-HOMOGENEOUS CASE { PolynomialRing theRing=groebnerBasis.getRing(); LexicographicTermOrder T; PolynomialSet LT(theRing); for(PolynomialSet::const_iterator i=groebnerBasis.begin();i!=groebnerBasis.end();i++) { LT.push_back(Polynomial(i->getMarked())); } //fprintf(Stderr,"In Size:%i\n",l.size()); IntegerVectorList ret; for(IntegerVectorList::const_iterator i=l.begin();i!=l.end();i++) { bool accept=true; PolynomialSet g2=wallIdeal(groebnerBasis,*i); for(PolynomialSet::const_iterator j=g2.begin();j!=g2.end() && accept;j++) for(PolynomialSet::const_iterator k=j;k!=g2.end();k++) { // fprintf(Stderr,"test\n"); if((!j->isMonomial()) || (!k->isMonomial())) if(!relativelyPrime(j->getMarked().m.exponent,k->getMarked().m.exponent)) { Polynomial s=sPolynomial(*j, *k); if(!s.isZero()) { bool witness=true; for(TermMap::const_iterator i=s.terms.begin();i!=s.terms.end();i++)//TODO: prove that it suffices to check just the leading term of the S-polynomial and adjust the code accordingly. { bool inideal=false; for(PolynomialSet::const_iterator j=LT.begin();j!=LT.end();j++) if(j->getMarked().m.exponent.divides(i->first.exponent)) { inideal=true; break; } if(inideal) { witness=false; break; } } if(witness) { accept=false; break; } /* s.mark(T); // with respect to some termorder s.scaleMarkedCoefficientToOne(); if(1) { Polynomial t=division(s,LT,T); if((t-s).isZero()) { accept=false; break; } } else { s=division(s,g2,T); if(!s.isZero()) { accept=false; break; } }*/ } } } if(accept)ret.push_back(*i); } // fprintf(Stderr,"Out Size:%i\n",ret.size()); return ret; } IntegerVectorList exponentDifferences(PolynomialSet const &groebnerBasis) { IntegerVectorList ret; set temp; for(PolynomialSet::const_iterator i=groebnerBasis.begin();i!=groebnerBasis.end();i++) { IntegerVector markedExponent=i->getMarked().m.exponent; for(TermMap::const_iterator j=i->terms.begin();j!=i->terms.end();j++) { IntegerVector dif=markedExponent-j->first.exponent; if(!dif.isZero()) { /* bool found=false; //These four lines are now done in wallRemoveScaledInequalities() for(IntegerVectorList::const_iterator k=ret.begin();k!=ret.end();k++) if(dependent(dif,*k))found=true; if(!found) */ temp.insert(dif); } } } for(set::const_iterator i=temp.begin();i!=temp.end();i++)ret.push_back(*i); return ret; } IntegerVectorList wallInequalities(PolynomialSet const &groebnerBasis) { return wallRemoveScaledInequalities(exponentDifferences(groebnerBasis)); // return algebraicTest(wallRemoveScaledInequalities(ret),groebnerBasis); } PolynomialSet flip(PolynomialSet const &groebnerBasis, IntegerVector const &wallNormal, TermOrder *autoReduceHint) { PolynomialRing theRing=groebnerBasis.getRing(); // fprintf(Stderr,"ENTERING flip\n"); // fprintf(Stderr,"flip - start\n"); // AsciiPrinter(Stderr).printPolynomialSet(groebnerBasis); // AsciiPrinter(Stderr).printVector(wallNormal); TimerScope ts(&flipTimer); //Subroutine 3.7 in [Sturmfels] // Step 1 // fprintf(Stderr,"flip - step1\n"); flipTimer1.on(); PolynomialSet wall=wallIdeal(groebnerBasis,wallNormal); wall.markAndScale(WeightTermOrder(wallNormal));// This marking will be used later on when we lift // fprintf(Stderr,"Changed order:\n"); // AsciiPrinter(Stderr).printPolynomialSet(wall); flipTimer1.off(); // Step 2 // fprintf(Stderr,"flip - step2\n"); // AsciiPrinter(Stderr).printPolynomialSet(wall); flipTimer2.on(); PolynomialSet oldWall=wall; WeightTermOrder flipOrder(-wallNormal); buchberger(&wall,flipOrder); flipTimer2.off(); // Step 3 // fprintf(Stderr,"flip - step3\n"); flipTimer3.on(); PolynomialSet newBasis(theRing); flipTimer3.off(); // Step 4 Lift // fprintf(Stderr,"flip - lifting\n"); // fprintf(Stderr,"flip - step4\n"); { // liftBasis() could be used for this!!!! TimerScope ts(&flipTimer4); for(PolynomialSet::const_iterator j=wall.begin();j!=wall.end();j++) { newBasis.push_back(divisionLift(*j, oldWall, groebnerBasis, LexicographicTermOrder())); /*{ // The following should also work: Polynomial q=*j-division(*j,groebnerBasis,LexicographicTermOrder()); assert(!q.isZero()); newBasis.push_back(q); }*/ } } // Step 5 Autoreduce // fprintf(Stderr,"flip - autoreduce\n"); // AsciiPrinter(Stderr).printPolynomialSet(wall); // AsciiPrinter(Stderr).printPolynomialSet(newBasis); // fprintf(Stderr,"flip - step5\n"); { TimerScope ts(&flipTimer5); PolynomialSet::const_iterator k=wall.begin(); for(PolynomialSet::iterator j=newBasis.begin();j!=newBasis.end();j++) { j->mark(k->getMarked().m); k++; } // fprintf(Stderr,"Marked order:\n"); // AsciiPrinter(Stderr).printPolynomialSet(wall); // AsciiPrinter(Stderr).printPolynomialSet(newBasis); // fprintf(Stderr,"Not reduced lifted basis:\n"); // AsciiPrinter(Stderr).printPolynomialSet(newBasis); static int t; t++; t&=0; if(t==0) { // fprintf(Stderr,"autoreducing .."); if(autoReduceHint) autoReduce(&newBasis,*autoReduceHint); else autoReduce(&newBasis,LexicographicTermOrder()); // fprintf(Stderr,".. done\n"); } //autoReduce(&newBasis,StandardGradedLexicographicTermOrder()); } // fprintf(Stderr,"flip - done\n"); // fprintf(Stderr,"LEAVING flip\n"); //fprintf(Stderr,"%i",newBasis.size()); return newBasis; } bool wallContainsPositiveVector(IntegerVector const &wallNormal) { //This is not right I think int n=wallNormal.size(); for(int i=0;isize(); for(int i=0;i 80 IntegerVectorList normalizedWithSumsAndDuplicatesRemoved2(IntegerVectorList const &a) { IntegerVectorList ret; set b; for(IntegerVectorList::const_iterator i=a.begin();i!=a.end();i++) { assert(!(i->isZero())); b.insert(normalized(*i)); } for(set::const_iterator i=b.begin();i!=b.end();i++) for(set::const_iterator j=i;j!=b.end();j++) if(i!=j)b.erase(normalized(*i+*j));//this can never remove *i or *j for(set::const_iterator i=b.begin();i!=b.end();i++) ret.push_back(*i); return ret; } class MyHashMap { typedef vector > Container; Container container; int tableSize; public: class iterator { class MyHashMap &hashMap; int index; // having index==-1 means that we are before/after the elements. set::iterator i; public: bool operator++() { if(index==-1)goto search; i++; while(i==hashMap.container[index].end()) { search: index++; if(index>=hashMap.tableSize){ index=-1; return false; } i=hashMap.container[index].begin(); } return true; } IntegerVector const & operator*()const { return *i; } IntegerVector operator*() { return *i; } /* bool operator()() { return index!=-1; }*/ iterator(MyHashMap &hashMap_): hashMap(hashMap_) { index=-1; } }; unsigned int function(const IntegerVector &v) { unsigned int ret=0; int n=v.size(); for(int i=0;i>29)+v.UNCHECKEDACCESS(i); return ret%tableSize; } MyHashMap(int tableSize_): container(tableSize_), tableSize(tableSize_) { assert(tableSize_>0); } void insert(const IntegerVector &v) { container[function(v)].insert(v); } void erase(IntegerVector const &v) { container[function(v)].erase(v); } iterator begin() { iterator ret(*this); ++ret; return ret; } int size() { iterator i=begin(); int ret=0; do{ret++;}while(++i); return ret; } void print() { for(int i=0;i::const_iterator j=container[i].begin();j!=container[i].end();j++)debug<<*j; } } }; IntegerVectorList normalizedWithSumsAndDuplicatesRemoved(IntegerVectorList const &a) { if(a.empty())return a; int n=a.front().size(); IntegerVector temp1(n); IntegerVector temp2(n); IntegerVectorList ret; MyHashMap b(a.size()); // log0 debug<<"a.size"<<(int)a.size()<<"\n"; // log0 debug<<"b.size"<<(int)b.size()<<"\n"; // log0 cerr << "N:"<isZero())); b.insert(normalized(*i)); } // b.print(); //debug<<"TEST"; // log0 cerr << "N:"< original; { MyHashMap::iterator i=b.begin(); do { original.push_back(*i); } while(++i); } for(vector::const_iterator i=original.begin();i!=original.end();i++) for(list::const_iterator j=a.begin();j!=a.end();j++) /* for(set::const_iterator i=b.begin();i!=b.end();i++) for(set::const_iterator j=i;j!=b.end();j++)*/ // if(*i!=*j)b.erase(normalized(*i+*j));//this can never remove *i or *j if(!dependent(*i,*j)) { // b.erase(normalized(*i+*j));//this can never remove *i or *j IntegerVector const &I=*i; IntegerVector const &J=*j; for(int k=0;k 20 IntegerVectorList normalizedWithSumsAndDuplicatesRemovedNOHASH(IntegerVectorList const &a) { /* IntegerVectorList a; { set b; for(IntegerVectorList::const_iterator i=A.begin();i!=A.end();i++)b.insert(*i); for(set::const_iterator i=b.begin();i!=b.end();i++)a.push_back(*i); }*/ IntegerVectorList ret; set b; log0 cerr << "N:"<isZero())); b.insert(normalized(*i)); } log0 cerr << "N:"<::const_iterator i=b.begin();i!=b.end();i++) for(set::const_iterator j=i;j!=b.end();j++) if(i!=j)b.erase(normalized(*i+*j));//this can never remove *i or *j log0 cerr << "N:"< original; for(set::const_iterator i=b.begin();i!=b.end();i++) original.push_back(*i); for(vector::const_iterator i=original.begin();i!=original.end();i++) for(list::const_iterator j=a.begin();j!=a.end();j++) /* for(set::const_iterator i=b.begin();i!=b.end();i++) for(set::const_iterator j=i;j!=b.end();j++)*/ // if(*i!=*j)b.erase(normalized(*i+*j));//this can never remove *i or *j if(!dependent(*i,*j))b.erase(normalized(*i+*j));//this can never remove *i or *j log0 cerr << "N:"<::const_iterator i=b.begin();i!=b.end();i++) ret.push_back(*i); return ret; } //400 -> 16 IntegerVectorList normalizedWithSumsAndDuplicatesRemoved3(IntegerVectorList const &a) { IntegerVectorList ret; set b; for(IntegerVectorList::const_iterator i=a.begin();i!=a.end();i++) { assert(!(i->isZero())); b.insert(normalized(*i)); } vector original; for(set::const_iterator i=b.begin();i!=b.end();i++) original.push_back(*i); for(vector::const_iterator i=original.begin();i!=original.end();i++) for(vector::const_iterator j=i;j!=original.end();j++) /* for(set::const_iterator i=b.begin();i!=b.end();i++) for(set::const_iterator j=i;j!=b.end();j++)*/ if(i!=j)b.erase(normalized(*i+*j));//this can never remove *i or *j for(set::const_iterator i=b.begin();i!=b.end();i++) ret.push_back(*i); return ret; } IntegerVectorList wallFlipableNormals(PolynomialSet const &groebnerBasis, bool isKnownToBeHomogeneous) { // New optimised version using PolyhedralCone int n=groebnerBasis.numberOfVariablesInRing(); IntegerVectorList a; //AsciiPrinter(Stderr).printVectorList(wallInequalities(groebnerBasis)); //PolyhedralCone p=intersection(PolyhedralCone(wallInequalities(groebnerBasis),a),PolyhedralCone::positiveOrthant(n)); IntegerVectorList normals=algebraicTest(wallInequalities(groebnerBasis),groebnerBasis); coneTimer.on(); // PolyhedralCone p=PolyhedralCone(wallInequalities(groebnerBasis),a); /* AsciiPrinter(Stderr).printVectorList(normals); AsciiPrinter(Stderr).printInteger(normals.size()); */ normals=normalizedWithSumsAndDuplicatesRemoved(normals); // AsciiPrinter(Stderr).printVectorList(normals); // AsciiPrinter(Stderr).printInteger(normals.size()); PolyhedralCone p=PolyhedralCone(normals,a,n); // fprintf(Stderr,"Finding facets\n"); p.findFacets(); // fprintf(Stderr,"Done Finding facets\n"); coneTimer.off(); IntegerVectorList ilist=p.getHalfSpaces(); IntegerVectorList ret; for(IntegerVectorList::iterator i=ilist.begin();i!=ilist.end();i++) { bool facetOK=true; if(!isKnownToBeHomogeneous) { *i=-1 * (*i); PolyhedralCone temp=intersection(PolyhedralCone(ilist,a),PolyhedralCone::positiveOrthant(n)); facetOK=(temp.dimension()==n); *i=-1 * (*i); } if(facetOK) ret.push_back(*i); } // New version using PolyhedralCone /* int n=groebnerBasis.numberOfVariablesInRing(); IntegerVectorList a; // AsciiPrinter(Stderr).printVectorList(wallInequalities(groebnerBasis)); PolyhedralCone p=intersection(PolyhedralCone(wallInequalities(groebnerBasis),a),PolyhedralCone::positiveOrthant(n)); // PolyhedralCone p=PolyhedralCone(wallInequalities(groebnerBasis),a); p.findFacets(); IntegerVectorList ilist=p.getHalfSpaces(); IntegerVectorList ret; for(IntegerVectorList::const_iterator i=ilist.begin();i!=ilist.end();i++) if(wallContainsPositiveVector(*i))ret.push_back(*i); */ /* Old code not using PolyhedralCone IntegerVectorList ilist=wallInequalities(groebnerBasis); wallAddCoordinateWalls(ilist); IntegerVectorList ret; for(IntegerVectorList::const_iterator i=ilist.begin();i!=ilist.end();i++) if(isFacet(ilist,i)&&wallContainsPositiveVector(*i)) ret.push_back(*i); */ return ret; } Polynomial flipMinkowski(Polynomial p, IntegerVector const &wallNormal) { IntegerVector best=p.getMarked().m.exponent; for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) { IntegerVector e=i->first.exponent; IntegerVector diff=e-best; if(dependent(diff,wallNormal)&&dot(diff,wallNormal)<0)best=e; } p.mark(Monomial(p.getRing(),best)); return p; } PolynomialSet flipMinkowski(PolynomialSet const &groebnerBasis, IntegerVector const &wallNormal) { PolynomialSet r(groebnerBasis.getRing()); for(PolynomialSet::const_iterator i=groebnerBasis.begin();i!=groebnerBasis.end();i++) r.push_back(flipMinkowski(*i,wallNormal)); return r; } PolyhedralCone homogeneitySpace(PolynomialSet const &reducedGroebnerBasis) { IntegerVectorList l=wallInequalities(reducedGroebnerBasis); IntegerVectorList a; PolyhedralCone c(a,l,reducedGroebnerBasis.getRing().getNumberOfVariables()); c.findImpliedEquations(); // c.canonicalize(); return c; } PolyhedralCone groebnerCone(PolynomialSet const &reducedGroebnerBasis, bool useAlgebraicTest) { int n=reducedGroebnerBasis.getRing().getNumberOfVariables(); IntegerVectorList l=wallInequalities(reducedGroebnerBasis); if(useAlgebraicTest)l=algebraicTest(l,reducedGroebnerBasis); l=normalizedWithSumsAndDuplicatesRemoved(l); IntegerVectorList a; PolyhedralCone c(l,a,n); c.canonicalize(); return c; } int dimensionOfHomogeneitySpace(PolynomialSet const &reducedGroebnerBasis) { return homogeneitySpace(reducedGroebnerBasis).dimension(); } PolynomialSet liftBasis(PolynomialSet const &toBeLifted, PolynomialSet const &originalBasisForFullIdeal) { PolynomialRing theRing=toBeLifted.getRing(); assert(toBeLifted.isValid()); assert(originalBasisForFullIdeal.isValid()); PolynomialSet newBasis(theRing); // fprintf(Stderr,"LIFTING:"); // AsciiPrinter(Stderr).printPolynomialSet(toBeLifted); for(PolynomialSet::const_iterator j=toBeLifted.begin();j!=toBeLifted.end();j++) { assert(!j->isZero()); //AsciiPrinter(Stderr).printVector(j->getMarked().m.exponent); Polynomial q=*j-division(*j,originalBasisForFullIdeal,LexicographicTermOrder()); assert(!q.isZero()); q.mark(j->getMarked().m); newBasis.push_back(q); } autoReduce(&newBasis,LexicographicTermOrder()); // fprintf(Stderr,"TO:"); // AsciiPrinter(Stderr).printPolynomialSet(newBasis); return newBasis; } bool isMarkingConsistent(PolynomialSet const &g) { IntegerVectorList empty; PolyhedralCone c(wallInequalities(g),empty,g.getRing().getNumberOfVariables()); c=intersection(c,PolyhedralCone::positiveOrthant(c.ambientDimension())); log1 AsciiPrinter(Stderr).printPolyhedralCone(c); return c.dimension()==c.ambientDimension(); } /* Heuristic for checking if inequality of full dimensional cone is a facet. If the routine returns true then the inequality is a facet. If it returns false it is unknown. */ static bool fastIsFacetCriterion(IntegerVectorList const &normals, IntegerVectorList::const_iterator i) { int n=i->size(); for(int j=0;j0 || (*i)[j]<0) { int sign=(*i)[j]>0?1:-1; bool isTheOnly=true; for(IntegerVectorList::const_iterator k=normals.begin();k!=normals.end();k++) if(k!=i) { if((*k)[j]*sign>0) { isTheOnly=false; break; } } if(isTheOnly)return true; } return false; } bool fastIsFacet(IntegerVectorList const &normals, IntegerVectorList::const_iterator i) { if(fastIsFacetCriterion(normals,i))return true; // log0 fprintf(Stderr,"LP\n"); return isFacet(normals,i); } /* ONLY WORKS AFFINELY AND NOT PROJECTIVELY!!! bool fastIsFacet(IntegerVectorList const &normals, IntegerVectorList::const_iterator i) { int n=i->size(); bool rightAnswer=isFacet(normals,i); IntegerVectorList tempNormals=normals; bool doLoop=true; log0 AsciiPrinter(Stderr).printVector(*i); do { log0 fprintf(Stderr,"TempNormal size:%i\n",tempNormals.size()); log0 AsciiPrinter(Stderr).printVectorList(tempNormals); IntegerVector maxVector=*i; IntegerVector minVector=*i; for(IntegerVectorList::const_iterator k=tempNormals.begin();k!=tempNormals.end();k++) { maxVector=max(maxVector,*k); minVector=min(minVector,*k); } IntegerVector maxAttained(n); IntegerVector minAttained(n); for(IntegerVectorList::const_iterator k=tempNormals.begin();k!=tempNormals.end();k++) { for(int j=0;jnewList.size(); tempNormals=newList; } while(doLoop); log0 fprintf(Stderr,"LP\n"); return isFacet(normals,i); } */ /* bool fastIsFacet(IntegerVectorList const &normals, IntegerVectorList::const_iterator i) { int n=i->size(); bool rightAnswer=isFacet(normals,i); IntegerVectorList tempNormals=normals; bool doLoop=true; //log0 AsciiPrinter(Stderr).printVector(*i); do { // log0 fprintf(Stderr,"TempNormal size:%i\n",tempNormals.size()); //log0 AsciiPrinter(Stderr).printVectorList(tempNormals); IntegerVector maxVector=*i; IntegerVector minVector=*i; for(IntegerVectorList::const_iterator k=tempNormals.begin();k!=tempNormals.end();k++) { maxVector=max(maxVector,*k); minVector=min(minVector,*k); } /* IntegerVector maxAttained(n); IntegerVector minAttained(n); for(IntegerVectorList::const_iterator k=tempNormals.begin();k!=tempNormals.end();k++) { for(int j=0;j0?1:-1; int numberOfVectorsWithSameSign=0; for(IntegerVectorList::const_iterator k=normals.begin();k!=normals.end();k++) { if((*k)[j]*sign>0) { numberOfVectorsWithSameSign++; } } if(numberOfVectorsWithSameSign==1) return true; } if((*i)[j]==maxVector[j]) { if(maxAttained[j]newList.size(); tempNormals=newList; } while(doLoop); // log0 fprintf(Stderr,"LP\n"); return isFacet(normals,i); } */ IntegerVectorList fastNormals(IntegerVectorList const &inequalities) { // log0 cerr << "Fast normals begin" << endl; // log0 fprintf(Stderr,"E"); //log0 fprintf(Stderr,"Number of inequalities:%i\n",inequalities.size()); IntegerVectorList normals=normalizedWithSumsAndDuplicatesRemoved(inequalities); // log0 fprintf(Stderr,"Number of inequalities:%i\n",normals.size()); // log0 fprintf(Stderr,"F"); // log0 AsciiPrinter(Stderr).printVectorList(normals); for(IntegerVectorList::iterator i=normals.begin();i!=normals.end();) //if(!isFacet(normals,i)) if(!fastIsFacet(normals,i)) { IntegerVectorList::iterator temp=i; i++; normals.erase(temp); } else i++; // log0 fprintf(Stderr,"Number of inequalities:%i\n",normals.size()); // log0 fprintf(Stderr,"G"); //log2 cerr << "Fast normals end" << endl; return normals; } /* Virker ikke: IntegerVectorList fastNormals(IntegerVectorList const &inequalities) { log0 fprintf(Stderr,"E"); log0 fprintf(Stderr,"Number of inequalities:%i\n",inequalities.size()); IntegerVectorList normals=normalizedWithSumsAndDuplicatesRemoved(inequalities); log0 fprintf(Stderr,"Number of inequalities:%i\n",normals.size()); log0 fprintf(Stderr,"F"); // log0 AsciiPrinter(Stderr).printVectorList(normals); bool didRemoveSomething; do { didRemoveSomething=false; for(IntegerVectorList::iterator i=normals.begin();i!=normals.end();i++) //if(!isFacet(normals,i)) if(!fastIsFacetCriterion(normals,i)) { IntegerVectorList::iterator temp=i; temp++; normals.erase(i); temp--; i=temp; didRemoveSomething=true; } } while(didRemoveSomething); for(IntegerVectorList::iterator i=normals.begin();i!=normals.end();i++) { if(!fastIsFacet(normals,i)) { IntegerVectorList::iterator temp=i; temp++; normals.erase(i); temp--; i=temp; didRemoveSomething=true; } } log0 fprintf(Stderr,"Number of inequalities:%i\n",normals.size()); log0 fprintf(Stderr,"G"); return normals; } */ PolyhedralCone normalConeOfMinkowskiSum(PolynomialSet const &polynomials, IntegerVector const &w) { // log0 cerr << "A"; WeightReverseLexicographicTermOrder T(w); PolynomialSet g=polynomials; //log0 cerr << "I"; g.markAndScale(T); //log0 cerr << "I"; IntegerVectorList inequalities=fastNormals(wallInequalities(g)); g=initialFormsAssumeMarked(g,w); IntegerVectorList equations=wallInequalities(g); //log0 cerr << "B"; PolyhedralCone ret(inequalities,equations,g.getRing().getNumberOfVariables()); //log0 cerr << "C"; ret.canonicalize(); //log0 cerr << "D"; return ret; } IntegerVectorList commonHomogeneitySpaceEquations(PolynomialSet const &polynomials) { LexicographicTermOrder T; PolynomialSet g=polynomials; g.markAndScale(T); IntegerVectorList l=wallInequalities(g); FieldMatrix A=integerMatrixToFieldMatrix(rowsToIntegerMatrix(l,g.getRing().getNumberOfVariables()),Q); A.reduce(); A.removeZeroRows(); return fieldMatrixToIntegerMatrixPrimitive(A).getRows(); } IntegerVectorList commonHomogeneitySpaceGenerators(PolynomialSet const &polynomials) { LexicographicTermOrder T; PolynomialSet g=polynomials; g.markAndScale(T); IntegerVectorList l=wallInequalities(g); FieldMatrix A=integerMatrixToFieldMatrix(rowsToIntegerMatrix(l,g.getRing().getNumberOfVariables()),Q); A=A.reduceAndComputeKernel(); return fieldMatrixToIntegerMatrixPrimitive(A).getRows(); } FieldMatrix homogeneitySpaceEquations(Polynomial const &f) { assert(!f.isZero()); IntegerVectorList l; TermMap::const_iterator j=f.terms.begin(); IntegerVector first=j->first.exponent; for(j++;j!=f.terms.end();j++) l.push_back(first-j->first.exponent); return integerMatrixToFieldMatrix(rowsToIntegerMatrix(l,f.getRing().getNumberOfVariables()),Q); } FieldMatrix homogeneitySpaceGenerators(Polynomial const &f) { FieldMatrix A=homogeneitySpaceEquations(f); return A.reduceAndComputeKernel(); } FieldMatrix spanOfHomogeneitySpaces(PolynomialSet const &polynomials) { FieldMatrix ret(Q,0,polynomials.getRing().getNumberOfVariables()); for(PolynomialSet::const_iterator i=polynomials.begin();i!=polynomials.end();i++) ret=combineOnTop(ret,homogeneitySpaceGenerators(*i)); ret.reduce(); ret.removeZeroRows(); return ret; } gfan0.8beta/src/transitiveclosure.h0000664000175000017500000000360315177170257017132 0ustar andersanders#pragma once #include #include template class TransitiveClosure{ /* * This class is based on the exposition [Schmidt,Schwartzbach] (DAIMI FN - 56, Januar 1996). * * To make assignment of class names work correctly, it is important that all * elements are "added to the base set" - either implicitly via makeEquivalent * or explicitly via addToBaseSet. */ std::map> parentList; //Each vertex has a parent and a weight, the number of descendants including itself std::map classNamesOfRoots;//only valid to look up with root indices public: void addToBaseSet(typ const &v) { if(parentList.count(v)==0) parentList[v]=make_pair(v,1); } private: bool isRoot(typ i) { return i==parentList[i].first; } typ const &getRootRef(typ const &i) //Danger: The returned reference is either to an internal value of the map structure. But it is important to pass references here because of the recursion. { if(isRoot(i))return parentList[i].first; return parentList[i].first=getRootRef(parentList[i].first); } public: bool areEquivalent(typ const &a, typ const &b) { return getRootRef(a)==getRootRef(b); } void makeEquivalent(typ i, typ j)//join { addToBaseSet(i); addToBaseSet(j); if(!areEquivalent(i,j)) { typ iRoot=getRootRef(i); typ jRoot=getRootRef(j); if(parentList[jRoot].second>1)&0x5555555555555555); int64 t2=(t1&0x3333333333333333)+((t1>>2)&0x3333333333333333); int64 t3=(t2&0x0f0f0f0f0f0f0f0f)+((t2>>4)&0x0f0f0f0f0f0f0f0f); int64 t4=(t3&0x00ff00ff00ff00ff)+((t3>>8)&0x00ff00ff00ff00ff); int64 t5=(t4&0x0000ffff0000ffff)+((t4>>16)&0x0000ffff0000ffff); int64 t6=(t5&0x00000000ffffffff)+((t5>>32)&0x00000000ffffffff); return t6; } static void rek64(ExponentType &ones, ExponentType &zeros, int nOnes, int nZeros, vector vectors, int &best, int n) { if(nOnes>best)best=nOnes; if(n-nZeros::const_iterator i=vectors.begin();i!=vectors.end();i++) if(((*i)&~ones)==0) { good=false; break; } if(good) { rek64(ones,zeros,nOnes+1,nZeros,vectors,best,n); } ones-=((int64)1)< vectorsSubset; vectorsSubset.reserve(vectors.size()); for(vector::const_iterator i=vectors.begin();i!=vectors.end();i++) { // if((*i)[index]==0)vectorsSubset.push_back(*i); if(((*i)&(((int64)1)< generators; for(PolynomialSet::const_iterator i=monomialGenerators.begin();i!=monomialGenerators.end();i++) { ExponentType v=0; for(int j=0;jgetMarked().m.exponent[j]; generators.push_back(v); } int best=0; ExponentType zeros=0; ExponentType ones=0; ExponentType possiblyOne=0; for(vector::const_iterator i=generators.begin();i!=generators.end();i++)possiblyOne=possiblyOne|*i; ones=allOnes(n)-possiblyOne; rek64(ones,zeros,sum(ones),sum(zeros),generators,best,n); return best; } PolynomialSet radicalOfMonomialIdeal(PolynomialSet const &monomialGenerators) { PolynomialRing theRing=monomialGenerators.getRing(); PolynomialSet temp=monomialGenerators; temp.markAndScale(LexicographicTermOrder()); //just to make sure that some term is marked PolynomialSet ret(theRing); for(PolynomialSet::const_iterator i=temp.begin();i!=temp.end();i++) { IntegerVector e=i->getMarked().m.exponent; e=e.supportVector(); ret.push_back(Polynomial(Term(i->getMarked().c,Monomial(theRing,e)))); } return ret; } static bool increase(IntegerVector &v, int &numberOfOnes) { int i=0; while(ibest)best=nOnes; if(ones.size()-nZerosdivides(ones)) { good=false; break; } if(good) { rek(ones,zeros,nOnes+1,nZeros,vectors,best); } ones[index]=0; IntegerVectorList vectorsSubset; for(IntegerVectorList::const_iterator i=vectors.begin();i!=vectors.end();i++) { if((*i)[index]==0)vectorsSubset.push_back(*i); } if(0) // It is not clear that this is an improvement, even with an better implementation { IntegerVector newOnes(ones.size()); IntegerVector possiblyOne(ones.size()); for(IntegerVectorList::const_iterator i=vectors.begin();i!=vectors.end();i++)possiblyOne=max(possiblyOne,*i); if((IntegerVector::allOnes(ones.size())-possiblyOne-ones-zeros).max()>0) { /* debug<getMarked().m.exponent); int best=0; int n=monomialGenerators.getRing().getNumberOfVariables(); IntegerVector zeros(n); IntegerVector ones(n); //Preprocessing step. This can be improved. IntegerVector possiblyOne(n); for(IntegerVectorList::const_iterator i=vectors.begin();i!=vectors.end();i++)possiblyOne=max(possiblyOne,*i); ones=IntegerVector::allOnes(n)-possiblyOne; rek(ones,zeros,ones.sum(),zeros.sum(),vectors,best); //debug<<"REKCALLS"< r(n); for(int i=0;ifirst.exponent==IntegerVector::standardVector(n,j)) { r[j]=i->second; } } return primitiveVector(r); } Subspace::Subspace(IntegerVectorList const &generators, int ambientDimension): basis2(integerMatrixToFieldMatrix(rowsToIntegerMatrix(generators,ambientDimension),Q)) // , basis(PolynomialRing(Q,ambientDimension)) { // n=ambientDimension; n=basis2.getWidth(); /* { PolynomialRing theRing=basis.getRing(); if(n==-1) { assert(!generators.empty()); n=generators.begin()->size(); } for(IntegerVectorList::const_iterator i=generators.begin();i!=generators.end();i++) { assert(i->size()==n); basis.push_back(vectorToPolynomial(theRing,*i)); } buchberger(&basis,LexicographicTermOrder()); }*/ basis2.reduce(); basis2.REformToRREform(); basis2.scaleFirstNonZeroEntryToOne(); basis2.removeZeroRows(); integerRep=getRepresentation(); integerRep.sort(); } bool Subspace::contains(IntegerVector const &v)const { if(v.size()!=n) { fprintf(Stderr,"v.size()=%i, n=%i",v.size(),n); } assert(v.size()==n); // bool oldRet=division(vectorToPolynomial(PolynomialRing(Q,v.size()),v),basis,LexicographicTermOrder()).isZero(); bool ret=basis2.canonicalize(integerVectorToFieldVector(v,Q)).isZero(); // assert(oldRet==ret); return ret; } int Subspace::dimension() { // assert(basis2.reduceAndComputeRank()==basis.size()); return basis2.reduceAndComputeRank(); // return basis.size(); } int Subspace::ambientDimension()const { return n; } Subspace sum(Subspace const &a, Subspace const &b) { /*Subspace ret=a; ret.basis.insert(ret.basis.end(),b.basis.begin(),b.basis.end()); buchberger(&ret.basis,LexicographicTermOrder()); return ret; */ Subspace ret=a; ret.basis2=combineOnTop(a.basis2,b.basis2); ret.basis2.reduce(); ret.basis2.REformToRREform(); ret.basis2.scaleFirstNonZeroEntryToOne(); ret.basis2.removeZeroRows(); ret.integerRep=ret.getRepresentation(); ret.integerRep.sort(); return ret; } IntegerVectorList Subspace::getRepresentation()const { /*IntegerVectorList ret; for(PolynomialSet::const_iterator i=basis.begin();i!=basis.end();i++) { ret.push_back(polynomialToVector(*i)); } */ IntegerVectorList ret2; for(int i=0;i0)*/ ret2.push_back(temp); /* else ret2.push_back(-temp); */ } } /* AsciiPrinter(Stderr).printVectorList(ret); AsciiPrinter(Stderr).printVectorList(ret2); fprintf(Stderr,"------------------\n"); */ return ret2; } IntegerVector Subspace::canonicalizeVector(IntegerVector const &v)const { /* Polynomial f=vectorToPolynomial(PolynomialRing(Q,v.size()),v); f=division(f,basis,LexicographicTermOrder()); IntegerVector ret=polynomialToVector(f); */ IntegerVector ret2=basis2.canonicalize(integerVectorToFieldVector(v,Q)).primitive(); // assert((ret-ret2).isZero()); return ret2; } bool Subspace::operator<(Subspace const &b)const { return integerRepsize()+1; NT=ddf_Rational; M=ddf_CreateMatrix(m_input, d_input); M->representation=rep; M->numbtype=NT; IntegerVectorList::const_iterator I=g.begin(); for (i = 0; i < m_input; i++) { ddf_set_si(M->matrix[i][0],0); for (j = 1; j < d_input; j++) { ddf_set_si(M->matrix[i][j],(*I)[j-1]); } I++; } successful=ddf_TRUE; return M; } static void cddinit() { static std::mutex M; std::scoped_lock L(M); static bool initialized; if(!initialized) { debug<<"Initialising cdd.\n"; ddf_set_global_constants(); /* First, this must be called. */ initialized=true; } } bool LpSolverCdd::isFacet(const IntegerVectorList &g, IntegerVectorList::const_iterator i) { bool ret; int index; ddf_MatrixPtr M=NULL,M2=NULL,M3=NULL; ddf_colrange d; ddf_ErrorType err=ddf_NoError; ddf_rowset redrows,linrows,ignoredrows, basisrows; ddf_colset ignoredcols, basiscols; // long rank; mytype val; ddf_DataFileType inputfile; FILE *reading=NULL; cddinit(); // ddf_init(val); M=vectorList2Matrix(i->size(), g, &err); if (err!=ddf_NoError) goto _L99; d=M->colsize; // redrows=ddf_RedundantRows(M, &err); // set_fwrite(Stderr, redrows); index=0; for(IntegerVectorList::const_iterator J=g.begin();J!=g.end()&&J!=i;J++){index++;} if(index==g.size())assert(0); ddf_Arow temp; ddf_InitializeArow(i->size()+1,&temp); ret= !ddf_Redundant(M,index+1,temp,&err); ddf_FreeMatrix(M); ddf_FreeArow(i->size()+1,temp); // ddf_FreeArow(i->size(),temp); if (err!=ddf_NoError) goto _L99; return ret; _L99: assert(0); return false; } static LpSolverCdd theLpSolverCdd; //-------------------------------------------------- // LpSolverCddGmp (exact arithmetics) //-------------------------------------------------- static void cddinitGmp() { static std::mutex M;//we assume that the two std::scoped_lock L(M); static bool initialized; if(!initialized) { dd_set_global_constants(); /* First, this must be called. */ initialized=true; } } static dd_MatrixPtr vectorList2MatrixGmp(int n, const IntegerVectorList &g, dd_ErrorType *Error) { dd_MatrixPtr M=NULL; dd_rowrange m_input,i; dd_colrange d_input,j; dd_RepresentationType rep=dd_Inequality; dd_boolean found=dd_FALSE, newformat=dd_FALSE, successful=dd_FALSE; char command[dd_linelenmax], comsave[dd_linelenmax]; dd_NumberType NT; (*Error)=dd_NoError; rep=dd_Inequality; newformat=dd_TRUE; if(n==-1) { assert(g.size()); n=g.begin()->size(); } m_input=g.size(); // d_input=g.begin()->size()+1; d_input=n+1; if(m_input) { if(g.begin()->size()!=n) { AsciiPrinter(Stderr).printVectorList(g); } assert(g.begin()->size()==n); } NT=dd_Rational; M=dd_CreateMatrix(m_input, d_input); M->representation=rep; M->numbtype=NT; IntegerVectorList::const_iterator I=g.begin(); for (i = 0; i < m_input; i++) { dd_set_si(M->matrix[i][0],0); for (j = 1; j < d_input; j++) { dd_set_si(M->matrix[i][j],(*I)[j-1]); } I++; } successful=dd_TRUE; return M; } static dd_MatrixPtr vectorList2MatrixIncludingFirstColumnGmp(int n, const IntegerVectorList &inequalities, const IntegerVectorList &equations, dd_ErrorType *Error) { dd_MatrixPtr M=NULL; dd_rowrange m_input,i; dd_colrange d_input,j; dd_RepresentationType rep=dd_Inequality; dd_boolean found=dd_FALSE, newformat=dd_FALSE, successful=dd_FALSE; // char command[dd_linelenmax], comsave[dd_linelenmax]; dd_NumberType NT; (*Error)=dd_NoError; int numberOfEquations=equations.size(); int numberOfInequalities=inequalities.size(); m_input=numberOfEquations+numberOfInequalities; assert(m_input>0); rep=dd_Inequality; newformat=dd_TRUE; d_input=n; assert(d_input>0); NT=dd_Rational; M=dd_CreateMatrix(m_input, d_input); M->representation=rep; M->numbtype=NT; IntegerVectorList::const_iterator I=inequalities.begin(); for (i = 0; i < numberOfInequalities; i++) { for (j = 0; j < d_input; j++)dd_set_si(M->matrix[i][j],(*I)[j]); I++; } I=equations.begin(); for (; i < m_input; i++) { set_addelem(M->linset, i+1); for (j = 0; j < d_input; j++)dd_set_si(M->matrix[i][j],(*I)[j]); I++; } successful=dd_TRUE; return M; } bool LpSolverCddGmp::hasHomogeneousSolution(int n, const IntegerVectorList &inequalities, const IntegerVectorList &equations) { if(n==0)return false; int nrows=inequalities.size()+equations.size(); if(nrows==0)return true; dd_LPSolverType solver=dd_DualSimplex; dd_MatrixPtr A=NULL; dd_LPSolutionPtr lps1; dd_ErrorType err=dd_NoError; int ret=0; cddinitGmp(); dd_LPPtr lp,lp1; A=vectorList2MatrixIncludingFirstColumnGmp(n, inequalities, equations, &err); if (err!=dd_NoError) goto _L99; A->objective=dd_LPmax; lp=dd_Matrix2LP(A, &err); if (err!=dd_NoError) goto _L99; // dd_WriteMatrix(Stderr,A); /* Find an interior point with cdd LP library. */ lp1=dd_MakeLPforInteriorFinding(lp); dd_LPSolve(lp1,solver,&err); if (err!=dd_NoError) goto _L99; // dd_WriteMatrix(Stderr,A); // dd_WriteLP(Stderr,lp); // dd_WriteLP(Stderr,lp1); /* Write an interior point. */ lps1=dd_CopyLPSolution(lp1); // dd_WriteLPSolution(Stderr,lps1); /* { fprintf(Stderr,"("); for (int j=1; j <(lps1->d); j++) { if(j!=1)fprintf(Stderr,", "); dd_WriteNumber(Stderr,lps1->sol[j]); } fprintf(Stderr,")\n"); }*/ // dd_WriteNumber(Stderr,lps1->optvalue); if(dd_Positive(lps1->optvalue))ret=1; if(dd_Negative(lps1->optvalue))ret=-1; // fprintf(Stderr,"ret=%i",ret); dd_FreeLPData(lp); dd_FreeLPSolution(lps1); dd_FreeLPData(lp1); dd_FreeMatrix(A); return ret>=0; _L99: assert(0); return 0; } bool LpSolverCddGmp::isFacet(const IntegerVectorList &g, IntegerVectorList::const_iterator i) { bool ret; int index; dd_MatrixPtr M=NULL,M2=NULL,M3=NULL; dd_colrange d; dd_ErrorType err=dd_NoError; dd_rowset redrows,linrows,ignoredrows, basisrows; dd_colset ignoredcols, basiscols; // long rank; mytype val; dd_DataFileType inputfile; FILE *reading=NULL; cddinitGmp(); // dd_init(val); M=vectorList2MatrixGmp(i->size(),g, &err); if (err!=dd_NoError) goto _L99; d=M->colsize; // redrows=dd_RedundantRows(M, &err); // set_fwrite(Stderr, redrows); index=0; for(IntegerVectorList::const_iterator J=g.begin();J!=g.end()&&J!=i;J++){index++;} if(index==g.size())assert(0); dd_Arow temp; dd_InitializeArow(i->size()+1,&temp); ret= !dd_Redundant(M,index+1,temp,&err); dd_FreeMatrix(M); dd_FreeArow(i->size()+1,temp); if (err!=dd_NoError) goto _L99; return ret; _L99: assert(0); return false; } int staticInteriorPoint(int n, mpq_t *point, const IntegerVectorList &g, bool strictlyPositive, IntegerVector const *equalitySet=0) {// copy-paste from testshoot.c in cdd // AsciiPrinter(Stderr).printVectorList(g); // fprintf(Stderr,"strictlyPositive:%i\n",strictlyPositive); //if(equalitySet) AsciiPrinter(Stderr).printVector(*equalitySet); dd_LPSolverType solver=dd_DualSimplex; dd_MatrixPtr A=NULL; dd_LPSolutionPtr lps1; dd_ErrorType err=dd_NoError; int ret=0; cddinitGmp(); dd_LPPtr lp,lp1; assert(g.begin()!=g.end()); if(strictlyPositive) { int n=g.begin()->size(); IntegerVectorList G=g; for(int i=0;imatrix[i][0],-1); assert(g.size()>=equalitySet->size()); for(int i=0;isize();i++) if((*equalitySet)[i])set_addelem(A->linset, i+1); } A->objective=dd_LPmax; lp=dd_Matrix2LP(A, &err); if (err!=dd_NoError) goto _L99; // dd_WriteMatrix(Stderr,A); /* Find an interior point with cdd LP library. */ lp1=dd_MakeLPforInteriorFinding(lp); dd_LPSolve(lp1,solver,&err); if (err!=dd_NoError) goto _L99; // dd_WriteMatrix(Stderr,A); // dd_WriteLP(Stderr,lp1); /* Write an interior point. */ lps1=dd_CopyLPSolution(lp1); if(dd_Positive(lps1->optvalue))ret=1; if(dd_Negative(lps1->optvalue))ret=-1; // fprintf(Stderr,"ret=%i",ret); if (ret>=0) // if (ret>0) for (int j=1; j <(lps1->d)-1; j++) mpq_set(point[j-1],lps1->sol[j]); dd_FreeLPData(lp); dd_FreeLPSolution(lps1); dd_FreeLPData(lp1); dd_FreeMatrix(A); return ret; _L99: assert(0); return 0; } int staticRelativeInteriorPoint(int n, mpq_t *point, const IntegerVectorList &g, bool strictlyPositive, IntegerVector const *equalitySet=0) {// copy-paste from testshoot.c in cdd // AsciiPrinter(Stderr).printVectorList(g); // fprintf(Stderr,"strictlyPositive:%i\n",strictlyPositive); //if(equalitySet) AsciiPrinter(Stderr).printVector(*equalitySet); dd_LPSolverType solver=dd_DualSimplex; dd_MatrixPtr A=NULL; dd_LPSolutionPtr lps1; dd_ErrorType err=dd_NoError; int ret=0; cddinitGmp(); dd_LPPtr lp,lp1; // assert(g.begin()!=g.end()); if(strictlyPositive) { // int n=g.begin()->size(); IntegerVectorList G=g; for(int i=0;imatrix[i][0],-1); assert(g.size()>=equalitySet->size()); for(int i=0;isize();i++) if((*equalitySet)[i])set_addelem(A->linset, i+1); } A->objective=dd_LPmax; lp=dd_Matrix2LP(A, &err); if (err!=dd_NoError) goto _L99; // dd_WriteMatrix(Stderr,A); /* Find an interior point with cdd LP library. */ lp1=dd_MakeLPforInteriorFinding(lp); dd_LPSolve(lp1,solver,&err); if (err!=dd_NoError) goto _L99; // dd_WriteMatrix(Stderr,A); // dd_WriteLP(Stderr,lp1); /* Write an interior point. */ lps1=dd_CopyLPSolution(lp1); if(dd_Positive(lps1->optvalue))ret=1; if(dd_Negative(lps1->optvalue))ret=-1; // fprintf(Stderr,"ret=%i",ret); if (ret>=0) // if (ret>0) for (int j=1; j <(lps1->d)-1; j++) mpq_set(point[j-1],lps1->sol[j]); dd_FreeLPData(lp); dd_FreeLPSolution(lps1); dd_FreeLPData(lp1); dd_FreeMatrix(A); return ret; _L99: assert(0); return 0; } bool LpSolverCddGmp::hasInteriorPoint(const IntegerVectorList &g, bool strictlyPositive, IntegerVector const *equalitySet) { assert(!g.empty()); int n=g.begin()->size(); mpq_t *point = new mpq_t [n]; for(int i=0;i=0; //THIS NEEDS TO BE FIXED return ret>0; } IntegerVector arrayToIntegerVector(mpq_t *point, int n) { IntegerVector ret(n); for (int j=0; j 0); mpq_t scale; mpq_init(scale); mpq_set_den(scale,gcd); mpq_set_num(scale,lcm); mpq_canonicalize(scale); //according to the gmp manual this call is needed, although it slows things down a bit for(int j=0;jsize(); mpq_t *point = new mpq_t [n]; for(int i=0;i=0);//-- any cone has a relative interior point // if (ret>0){ if (ret>=0) { // fprintf(stderr,"TEST1\n"); scaleToIntegerVector(point,n); // fprintf(stderr,"TEST2\n"); } IntegerVector result=arrayToIntegerVector(point,n); for(int i=0;isize(); mpq_t *point = new mpq_t [n]; for(int i=0;i0){ if (ret>=0) { scaleToIntegerVector(point,n); } result=arrayToIntegerVector(point,n); // if (ret>0){ /* if (ret>=0){ fprintf(f,"("); for (int j=0; j =0); } // the following two routines are static to avoid including gmp.h in the header file. Maybe that should be changed... static bool lexicographicShootCompare(IntegerVector const &a, IntegerVector const &b, mpq_t const &aDot, mpq_t const &bDot, mpq_t &aTemp, mpq_t &bTemp) { int n=a.size(); assert(b.size()==n); for(int i=0;i0)return true; if(cmp<0)return false; } assert(0); return false; } static void computeDotProduct(mpq_t &ret, IntegerVector const &iv, mpq_t const *qv, mpq_t &temp) { mpq_set_si(ret,0,1); int n=iv.size(); for(int i=0;isize(); mpq_t *point = new mpq_t [n]; for(int i=0;i0); IntegerVectorList::const_iterator bestIterator=g.end(); mpq_t tempA; mpq_init(tempA); mpq_t tempB; mpq_init(tempB); mpq_t bestDotProduct; mpq_init(bestDotProduct); mpq_t currentDotProduct; mpq_init(currentDotProduct); IntegerVectorList::const_iterator i=g.begin(); for(;i!=g.end();i++) if(LexicographicTermOrder()(*i,*i-*i)) { computeDotProduct(bestDotProduct,*i,point,tempA); bestIterator=i; break; } // fprintf(Stderr,"A\n"); //if(bestIterator!=g.end()) // AsciiPrinter(Stderr).printVector(*bestIterator); if(i!=g.end()) for(i++;i!=g.end();i++) { computeDotProduct(currentDotProduct,*i,point,tempA); if(lexicographicShootCompare(*bestIterator,*i,bestDotProduct,currentDotProduct,tempA,tempB)) { bestIterator=i; mpq_set(bestDotProduct,currentDotProduct); } } mpq_clear(currentDotProduct); mpq_clear(bestDotProduct); mpq_clear(tempB); mpq_clear(tempA); for(int i=0;isize(); for(int i=0;ilinset, i+1);//??? // set objective function for (int i = 0; i < dimension; i++) dd_set_si(A->rowvec[i+1],-1); // set right hand side for (int i = 0; i < dimension; i++) dd_set_si(A->matrix[i+dim2][0],-1); if (err!=dd_NoError) goto _L99; A->objective=dd_LPmax; /* for(int i=0;iLPS==dd_Inconsistent) { dd_FreeLPData(lp); dd_FreeMatrix(A); return false; } // dd_WriteLPResult(stdout,lp,err); /* Write an interior point. */ lps1=dd_CopyLPSolution(lp); if (dd_Positive(lps1->optvalue)) { // fprintf(Stderr,"Returning false\n"); return false; } /* { fprintf(Stderr,"("); for (int j=1; j <(lps1->d); j++) { if(j!=1)fprintf(Stderr,", "); dd_WriteNumber(Stderr,lps1->sol[j]); } fprintf(Stderr,")\n"); } */ //transform into integer vectors { int n=dimension; dd_Arow point=lps1->sol+1; mpz_t lcm; mpz_t gcd; mpz_init_set_ui(lcm, 1); mpz_init_set_ui(gcd, 0); for(int j=0;jd); j++) { if(j!=1)fprintf(Stderr,", "); dd_WriteNumber(Stderr,lps1->sol[j]); } fprintf(Stderr,")\n"); } */ for (int j=1; j <(lps1->d); j++) { int den; int num; den=mpz_get_si(mpq_denref(lps1->sol[j])); num=mpz_get_si(mpq_numref(lps1->sol[j])); assert(den==1); if(result) { assert(j-1size()); (*result)[j-1]=num; } } // dd_WriteLPSolution(lps1); dd_FreeLPData(lp); dd_FreeLPSolution(lps1); dd_FreeMatrix(A); return true; _L99: assert(0); return 0; } //----------------------------------------- // Rank of matrix //----------------------------------------- #include "subspace.h" int LpSolverCddGmp::rankOfMatrix(const IntegerVectorList &g_) { if(g_.size()==0)return 0; FieldMatrix temp=integerMatrixToFieldMatrix(rowsToIntegerMatrix(g_),Q); return temp.reduceAndComputeRank(); return Subspace(g_).dimension(); dd_rowset r=NULL; int result; IntegerVectorList g=g_; int dim2=g.size(); assert(g.size()!=0); int dimension=g.begin()->size(); /* for(int i=0;ilinset,i+1); // for(int i=0;ilinset, i+1);//??? // set objective function for (int i = 0; i < dimension; i++) dd_set_si(A->rowvec[i+1],-1); // set right hand side /*for (int i = 0; i < dimension; i++) dd_set_si(A->matrix[i+dim2][0],-1); */ if (err!=dd_NoError) goto _L99; A->objective=dd_LPmax; //fprintf(Stderr,"rank of matrix matrix:\n"); // dd_WriteMatrix(Stderr,A); r=dd_RedundantRows(A,&err); if (err!=dd_NoError) goto _L99; result=dim2-set_card(r); // fprintf(Stderr,"dim2==%i set_card(r)==%i\n",dim2,set_card(r)); set_free(r); dd_FreeMatrix(A); return result; _L99: assert(0); return 0; } //----------------------------------------- // Extreme Rays' Inequality Indices //----------------------------------------- // this procedure is take from cddio.c. static void dd_ComputeAinc(dd_PolyhedraPtr poly) { /* This generates the input incidence array poly->Ainc, and two sets: poly->Ared, poly->Adom. */ dd_bigrange k; dd_rowrange i,m1; dd_colrange j; dd_boolean redundant; dd_MatrixPtr M=NULL; mytype sum,temp; dd_init(sum); dd_init(temp); if (poly->AincGenerated==dd_TRUE) goto _L99; M=dd_CopyOutput(poly); poly->n=M->rowsize; m1=poly->m1; /* fprintf(Stderr,"m1:%i\n",m1); fprintf(Stderr,"n:%i\n",poly->n); fprintf(Stderr,"m:%i\n",poly->m); */ /* this number is same as poly->m, except when poly is given by nonhomogeneous inequalty: !(poly->homogeneous) && poly->representation==Inequality, it is poly->m+1. See dd_ConeDataLoad. */ poly->Ainc=(set_type*)calloc(m1, sizeof(set_type)); for(i=1; i<=m1; i++) set_initialize(&(poly->Ainc[i-1]),poly->n); set_initialize(&(poly->Ared), m1); set_initialize(&(poly->Adom), m1); for (k=1; k<=poly->n; k++){ for (i=1; i<=poly->m; i++){ dd_set(sum,dd_purezero); for (j=1; j<=poly->d; j++){ dd_mul(temp,poly->A[i-1][j-1],M->matrix[k-1][j-1]); dd_add(sum,sum,temp); } if (dd_EqualToZero(sum)) { set_addelem(poly->Ainc[i-1], k); } } if (!(poly->homogeneous) && poly->representation==dd_Inequality){ if (dd_EqualToZero(M->matrix[k-1][0])) { set_addelem(poly->Ainc[m1-1], k); /* added infinity inequality (1,0,0,...,0) */ } } } for (i=1; i<=m1; i++){ if (set_card(poly->Ainc[i-1])==M->rowsize){ set_addelem(poly->Adom, i); } } for (i=m1; i>=1; i--){ if (set_card(poly->Ainc[i-1])==0){ redundant=dd_TRUE; set_addelem(poly->Ared, i); }else { redundant=dd_FALSE; for (k=1; k<=m1; k++) { if (k!=i && !set_member(k, poly->Ared) && !set_member(k, poly->Adom) && set_subset(poly->Ainc[i-1], poly->Ainc[k-1])){ if (!redundant){ redundant=dd_TRUE; } set_addelem(poly->Ared, i); } } } } dd_FreeMatrix(M); poly->AincGenerated=dd_TRUE; _L99:; dd_clear(sum); dd_clear(temp); } IntegerVectorList LpSolverCddGmp::extremeRaysInequalityIndices(const IntegerVectorList &inequalityList) { int result; IntegerVectorList g=inequalityList; int dim2=g.size(); // assert(g.size()!=0); if(g.size()==0)return IntegerVectorList(); int dimension=g.begin()->size(); dd_MatrixPtr A=NULL; dd_ErrorType err=dd_NoError; cddinitGmp(); A=vectorList2MatrixGmp(dimension, g, &err); // dd_WriteMatrix(Stderr,A); dd_PolyhedraPtr poly; poly=dd_DDMatrix2Poly2(A, dd_LexMin, &err); // dd_WritePolyFile(Stderr,poly); // dd_WriteIncidence(Stderr,poly); if (poly->child==NULL || poly->child->CompStatus!=dd_AllFound) assert(0); if (poly->AincGenerated==dd_FALSE) dd_ComputeAinc(poly); // dd_WriteIncidence(Stderr,poly); IntegerVectorList ret; // fprintf(Stderr,"%i %i\n",poly->n,poly->m1); /* How do we interpret the cddlib output? For a long ting gfan has been using poly->n as the number of rays of the cone and thus returned sets of indices that actually gave the lineality space. The mistake was then caught later in PolyhedralCone. On Feb 17 2009 gfan was changed to check the length of each set to make sure that it does not specify the lineality space and only return those sets giving rise to rays. This does not seem to be the best strategy and might even be wrong. */ for (int k=1; k<=poly->n; k++) //for (int k=1; k<=poly->m1; k++) { int length=0; for (int i=1; i<=poly->m1; i++) if(set_member(k,poly->Ainc[i-1]))length++; if(length!=dim2) { IntegerVector v(length); int j=0; for (int i=1; i<=poly->m1; i++) if(set_member(k,poly->Ainc[i-1]))v[j++]=i-1; ret.push_back(v); } } // AsciiPrinter(Stderr).printVectorList(ret); // dd_WriteIncidence(Stderr,poly); dd_FreeMatrix(A); dd_FreePolyhedra(poly); return ret; _L99: assert(0); return IntegerVectorList(); } //----------------------------------------- // Remove Redundant Rows //----------------------------------------- void LpSolverCddGmp::removeRedundantRows(IntegerVectorList *inequalities, IntegerVectorList *equalities, bool removeInequalityRedundancies) { int numberOfEqualities=equalities->size(); int numberOfInequalities=inequalities->size(); int numberOfRows=numberOfEqualities+numberOfInequalities; // AsciiPrinter(Stderr).printVectorList(*inequalities); // AsciiPrinter(Stderr).printVectorList(*equalities); dd_rowset r=NULL; IntegerVectorList g=*inequalities; for(IntegerVectorList::const_iterator i=equalities->begin();i!=equalities->end();i++) g.push_back(*i); if(numberOfRows==0)return;//the full space, so description is alredy irredundant assert(numberOfRows>0); dd_LPSolverType solver=dd_DualSimplex; dd_MatrixPtr A=NULL; dd_ErrorType err=dd_NoError; cddinitGmp(); A=vectorList2MatrixGmp(g.begin()->size(),g, &err); for(int i=numberOfInequalities;ilinset,i+1); // dd_WriteMatrix(Stderr,A); // for(int i=0;ilinset, i+1);//??? // set objective function // for (int i = 0; i < dimension; i++) // dd_set_si(A->rowvec[i+1],-1); // set right hand side /*for (int i = 0; i < dimension; i++) dd_set_si(A->matrix[i+dim2][0],-1); */ IntegerVectorList newLin; IntegerVectorList newIn; int index=0; if (err!=dd_NoError) goto _L99; A->objective=dd_LPmax; // dd_WriteMatrix(Stderr,A); // r=dd_RedundantRows(A,&err); dd_rowset impl_linset; dd_rowset redset; dd_rowindex newpos; if(removeInequalityRedundancies) dd_MatrixCanonicalize(&A, &impl_linset, &redset, &newpos, &err); else dd_MatrixCanonicalizeLinearity(&A, &impl_linset, &newpos, &err); if (err!=dd_NoError) goto _L99; // set_fwrite(stderr,redset); // set_fwrite(stderr,impl_linset); // Maybe the following should be changed... what if cononicalize generates new rows? if(1) { // dd_WriteMatrix(Stderr,A); int rowsize=A->rowsize; int n=A->colsize-1; // fprintf(Stderr,"rowsize: %i ColSize:%i\n",rowsize,n); for(int i=0;imatrix[i][j+1]); IntegerVector v=arrayToIntegerVector(point, n); // AsciiPrinter(Stderr).printVector(v); for(int j=0;jlinset)) newLin.push_back(v); else newIn.push_back(v); } } else { for(IntegerVectorList::iterator i=inequalities->begin();i!=inequalities->end();index++) { int i2=newpos[index+1]; if(i2) { if(set_member(i2,A->linset)) newLin.push_back(*i); else newIn.push_back(*i); } i++; } for(IntegerVectorList::iterator i=equalities->begin();i!=equalities->end();index++) { int i2=newpos[index+1]; if(i2) { if(set_member(i2,A->linset)) newLin.push_back(*i); else newIn.push_back(*i); } i++; } assert(index==numberOfRows); } assert(set_card(A->linset)==newLin.size()); if(A->rowsize!=newLin.size()+newIn.size()) { fprintf(stderr,"A->rowsize: %i\n",(int)A->rowsize); fprintf(stderr,"newLin.size(): %i\n",(int)newLin.size()); fprintf(stderr,"newIn.size(): %i\n",(int)newIn.size()); dd_WriteMatrix(Stderr,A); AsciiPrinter(Stderr).printVectorList(newLin); AsciiPrinter(Stderr).printVectorList(newIn); } assert(A->rowsize==newLin.size()+newIn.size()); set_free(impl_linset); if(removeInequalityRedundancies) set_free(redset); free(newpos); // set_free();//HOW DO WE FREE newpos? *equalities=newLin; *inequalities=newIn; dd_FreeMatrix(A); return; _L99: assert(0); } static dd_MatrixPtr vectorLists2MatrixGmp(int n, IntegerVectorList const &inequalities, IntegerVectorList const &equations, dd_ErrorType *err) { IntegerVectorList g=inequalities; int numberOfInequalities=inequalities.size(); for(IntegerVectorList::const_iterator i=equations.begin();i!=equations.end();i++) g.push_back(*i); // assert(g.size()); // If this restriction turns out to be a problem it should be fixed in vectorList2MatrixGmp() int numberOfRows=g.size(); dd_MatrixPtr A=NULL; cddinitGmp(); A=vectorList2MatrixGmp(n, g, err); for(int i=numberOfInequalities;ilinset,i+1); return A; } static IntegerVectorList getConstraints(dd_MatrixPtr A, bool returnEquations) { IntegerVectorList ret; int rowsize=A->rowsize; int n=A->colsize-1; // fprintf(Stderr,"rowsize: %i ColSize:%i\n",rowsize,n); mpq_t *point = new mpq_t [n]; for(int j=0;jlinset); if(isEquation==returnEquations) { for(int j=0;jmatrix[i][j+1]); scaleToIntegerVector(point,n); IntegerVector v=arrayToIntegerVector(point, n); // AsciiPrinter(Stderr).printVector(v); ret.push_back(v); } } for(int j=0;jchild==NULL || poly->child->CompStatus!=dd_AllFound) assert(0); // dd_WriteIncidence(Stderr,poly); // dd_WritePolyFile(Stderr,poly); // dd_WriteMatrix(Stderr,poly->child->A); dd_MatrixPtr A2=dd_CopyGenerators(poly); // dd_WriteMatrix(Stderr,A2); *dualInequalities=getConstraints(A2,false); *dualEquations=getConstraints(A2,true); dd_FreeMatrix(A2); // AsciiPrinter(Stderr).printVectorList(*dualInequalities); // AsciiPrinter(Stderr).printVectorList(*dualEquations); // assert(0); // AsciiPrinter(Stderr).printVectorList(ret); // dd_WriteIncidence(Stderr,poly); dd_FreeMatrix(A); dd_FreePolyhedra(poly); return; _L99: assert(0); } static LpSolverCddGmp theLpSolverCddGmp; gfan0.8beta/src/app_multiplymatrix.cpp0000664000175000017500000000143115177170257017641 0ustar andersanders#include "vektor.h" #include "printer.h" #include "parser.h" #include "gfanapplication.h" class MultiplyMatrixApplication : public GFanApplication { public: bool includeInDefaultInstallation() // Not included since the program has no relation to the main programs { return false; } MultiplyMatrixApplication() { registerOptions(); } const char *name() { return "_multiplymatrix"; } int main() { FileParser P(Stdin); IntegerVectorList a=P.parseIntegerVectorList(); IntegerVectorList b=P.parseIntegerVectorList(); AsciiPrinter(Stdout).printVectorList(multiplyIntegerVectorList(a,b)); return 0; } const char *helpText() { return "Takes two matrices and multiplies them.\n"; } }; static MultiplyMatrixApplication theApplication; gfan0.8beta/src/app_topolyhedralfan.cpp0000664000175000017500000000703015177170257017731 0ustar andersanders#include "parser.h" #include "printer.h" #include "polynomial.h" #include "wallideal.h" #include "lp.h" #include "polyhedralcone.h" #include "gfanapplication.h" #include "polyhedralfan.h" #include "halfopencone.h" #include "gfanlib_circuittableint.h" #include "gfanlib_circuittableinteger.h" #include "gfanlib_tableau.h" #include "matrix.h" #include "symmetry.h" class ToPolyhedralFanApplication : public GFanApplication { SimpleOption optionRestrict; SimpleOption optionGeneratedCones; SimpleOption optionSymmetry; public: const char *helpText() { return "This program takes a list of reduced Groebner bases and produces the fan of all faces of these. In this way by giving the complete list of reduced Groebner bases, the Groebner fan can be computed as a polyhedral complex. The option --restrict lets the user choose between computing the Groebner fan or the restricted Groebner fan.\n"; } ToPolyhedralFanApplication(): optionGeneratedCones("--generatedcones","Instead of a list of reduced Groebner bases, read in a list of closed generated cones given in modern format (like _cone). In this case --restrict is ignored."), optionSymmetry("--symmetry", "Tell the program to read in generators for a group of symmetries (subgroup of $S_n$) after having read in the ring. The output is grouped according to these symmetries. Only one representative for each orbit is needed on the input.\n"), optionRestrict("--restrict","Add an inequality for each coordinate, so that the the cones are restricted to the non-negative orthant.") // optionPair("--pair","The Groebner cone is given by a pair of compatible Groebner bases. The first basis is for the initial ideal and the second for the ideal itself. See the tropical section of the manual.") { registerOptions(); } const char *name() { return "_topolyhedralfan"; } template IntegerMatrix convertMatrix(gfan::Matrix const &m) { IntegerMatrix ret(m.getHeight(),m.getWidth()); for(int i=0;i::loadConeVector(cin); for(auto &C:vec) { PolyhedralCone c(convertMatrix(C.getRays()).getRows(),convertMatrix(C.getLinealitySpace()).getRows(),C.getAmbientDimension()); c.canonicalize(); F.insert(c); } } else { PolynomialSetList l=FileParser(Stdin).parsePolynomialSetList(r); for(PolynomialSetList::const_iterator i=l.begin();i!=l.end();i++) { PolynomialSet g=*i; PolynomialSet m=g.markedTermIdeal(); IntegerVectorList equalities=wallInequalities(m); IntegerVectorList normals=algebraicTest(wallInequalities(g),g); if(optionRestrict.getValue()) { for(int i=0;i #include "division.h" #include "wallideal.h" #include "groebnerengine.h" #include "tropical2.h" #include "log.h" #include "division.h" #include "buchberger.h" PolynomialSet groebnerBasisWithFullDimensionalIntersection(PolynomialSet g, PolyhedralCone const &c) { IntegerVector v=c.getRelativeInteriorPoint(); IntegerVectorList l=c.generatorsOfSpan(); l.push_front(v); MatrixTermOrder T(l); buchberger(&g,T); return g; } GroebnerFanTraverser::GroebnerFanTraverser(PolynomialSet const &groebnerBasis_): ConeTraverser(groebnerBasis_.getRing().getNumberOfVariables()), groebnerBasis(groebnerBasis_), theCone(groebnerBasis_.getRing().getNumberOfVariables()), theRestrictingCone(groebnerBasis_.getRing().getNumberOfVariables()), isHomogeneous(false), isKnownToBeComplete(false) { n=groebnerBasis_.getRing().getNumberOfVariables(); d=n; updatePolyhedralCone(); //cerr<<"DIMIMIMiM"<=0)return;//<<-------------------- testPerformed=true;break; } assert(testPerformed); } // groebnerBasis=flip(groebnerBasis,-rayVector); { IntegerVectorList m; m.push_back(ridgeVector); m.push_back(rayVector); MatrixTermOrder T(m); groebnerBasis=flip(groebnerBasis,-rayVector,&T); } } else { PolynomialSet ridgeIdealOld=initialFormsAssumeMarked(groebnerBasis,ridgeVector); WeightReverseLexicographicTermOrder T(rayVector); PolynomialSet ridgeIdeal=GE_groebnerBasis(ridgeIdealOld,T,true,false); PolynomialSet g2(groebnerBasis.getRing()); for(PolynomialSet::const_iterator j=ridgeIdeal.begin();j!=ridgeIdeal.end();j++) g2.push_back(divisionLift(*j, ridgeIdealOld, groebnerBasis, T)); groebnerBasis=GE_autoReduce(g2); } updatePolyhedralCone(); } IntegerVectorList GroebnerFanTraverser::link(IntegerVector const &ridgeVector) { IntegerVectorList ret; IntegerVector v=theCone.link(ridgeVector).getUniquePoint(); ret.push_back(v); if(isKnownToBeComplete) { ret.push_back(-v); return ret; } if(!theRestrictingCone.containsRelatively(ridgeVector))return ret; // If the ideal is known to be homogeneous in a positive grading then we don't have to make the following test // Furthermore, for restricted traversals the following test test the ridge for having a positive vector - another definitions of flipability would be to check the lifting of the ridge to the full space. if(isHomogeneous) { // debug<<"FDSFADFA-------------------------------\n"; ret.push_back(-v); return ret; } { PolyhedralCone temp=theCone.faceContaining(ridgeVector); if(temp.containsPositiveVector())ret.push_back(-v); //cerr<<"THIS NEEDS TO BE FIXED!!!\n"; // ret.push_back(-v); } return ret; } PolyhedralCone & GroebnerFanTraverser::refToPolyhedralCone() { return theCone; } PolynomialSet &GroebnerFanTraverser::refToGroebnerBasisRepresentation() { return groebnerBasis; } void GroebnerFanTraverser::setIsKnownToBeComplete(bool complete) { isKnownToBeComplete=complete; } gfan0.8beta/src/tropical.h0000664000175000017500000000100615177170257015155 0ustar andersanders#ifndef TROPICAL_H_INCLUDED #define TROPICAL_H_INCLUDED #include "polynomial.h" //bool isFullColored(IntegerVectorList const &inequalityColors, IntegerVector const &v) PolynomialSetList fullColoredIdeals(PolynomialSet const &g, bool skipColorTest=false); bool containsMonomial(PolynomialSet const &ideal);//ideal must be homogeneous Term computeTermInIdeal(PolynomialSet const &ideal, int m=0);//ideal must be homogeneous PolynomialSet saturatedIdeal(PolynomialSet const &ideal); //ideal must be homogeneous #endif gfan0.8beta/src/halfopencone.h0000664000175000017500000001146715177170257016015 0ustar andersanders#ifndef __halfopencone_h #define __halfopencone_h #include "polyhedralcone.h" #include "termorder.h" #include "polyhedralfan.h" class HalfOpenCone{ static void appendList(IntegerVectorList &to, IntegerVectorList const &from, int appendValue); int liftedDimension;//ambient public: PolyhedralCone lifted;//remove public static IntegerVectorList shrink(const IntegerVectorList &l); HalfOpenCone(int dimension_, PolyhedralCone const &lifted_); public: int dimension;//ambient HalfOpenCone(PolyhedralCone C, TermOrder const &t);//only for full dimensional cones! HalfOpenCone(int dimension_, IntegerVectorList const &equations, IntegerVectorList const &nonstrict, IntegerVectorList const &strict, bool findFacets=false, bool canonicalize=false); HalfOpenCone(int ambientDimension);//full space bool isEmpty(); friend HalfOpenCone intersection(const HalfOpenCone &a, const HalfOpenCone &b, bool findFacets); friend bool haveEmptyIntersection(const HalfOpenCone &a, const HalfOpenCone &b); PolyhedralCone closure(); void splitIntoRelativelyOpenCones(list &l); void print(class Printer &p)const; bool contains(IntegerVector const &v)const; friend bool operator<(HalfOpenCone const &a, HalfOpenCone const &b); void canonicalize(){lifted.canonicalize();} /** Remove all coordinates from the space except those listed in chosen. */ HalfOpenCone withChosenCoordinates(list chosen)const; HalfOpenCone rewrite(FieldMatrix const &A, list nonPivots)const; HalfOpenCone rewriteExpand(list pivots, IntegerVectorList const &newEquations)const; }; HalfOpenCone intersection(const HalfOpenCone &a, const HalfOpenCone &b, bool findFacets=false); typedef list HalfOpenConeList; HalfOpenConeList orientedBoundary(PolyhedralCone C, TermOrder const &t, HalfOpenCone *restrictingCone=0); HalfOpenConeList splitIntoRelativelyOpenCones(HalfOpenConeList const &l); class HalfOpenConeProcessor { public: bool savePartialResult; HalfOpenConeProcessor():savePartialResult(false) { } /** * The vectors allows to look up which fans and cones were chosen at each step. * Notice that chosenFan will be a permutation, and therefore * SymmetryGroup::compose?Inverse?(chosenFans,chosenCone) * will give the choice of cones in a non-permuted fashion. * * If the enumeration is restricted to a linear subspace, as it is the case in * tropicalHyperSurfaceIntersectionInSubspace(), then the chosenCone vector does * not make much sense.....but this is hidden anyway from the user of * tropicalHyperSurfaceIntersectionClosed(). */ virtual void process(HalfOpenCone const &c, IntegerVector const &chosenFans, IntegerVector const &chosenCone)=0; void setSave() { savePartialResult=true; } }; void tropicalHyperSurfaceIntersectionWithProcessor(int dimension, PolynomialSet const &g, HalfOpenConeProcessor &myProcessor, PolyhedralCone *restrictingCone=0, bool expand=false, int intervalLow=-1, int intervalHigh=-1); HalfOpenConeList tropicalHyperSurfaceIntersection(int dimension, PolynomialSet const &g, HalfOpenCone *restrictingCone=0); void tropicalHyperSurfaceIntersectionInSubspace(int dimension, PolynomialSet const &G, HalfOpenCone *restrictingCone, HalfOpenConeProcessor &processor, int intervalLow=-1, int intervalHigh=-1); //HalfOpenConeList tropicalHyperSurfaceIntersectionInSubspace(int dimension, PolynomialSet const &g, HalfOpenCone *restrictingCone=0); PolyhedralFan tropicalHyperSurfaceIntersectionClosed(int dimension, PolynomialSet const &g, PolyhedralCone *restrictingCone=0, bool expand=false, bool saveResult=false, int intervalLow=-1, int intervalHigh=-1); void printHalfOpenConeList(HalfOpenConeList const &l, class Printer & p);//Assuming that the union is closed and the cones have a common linearity space PolyhedralFan faceComplexOfCone(HalfOpenCone &c); /** * This routine tricks the tropical hypersurface intersection * cone into checking whether the tropical stable intersection * of the list of polynomials is non-empty. This can be used * to check if a weight vector is contained in the stable * intersection - simply call this routine on the initial * forms of the generators. */ bool nonEmptyStableIntersection(PolynomialSet const &g); /** * This routine tricks the tropical hypersurface intersection into * checking whether the is some mixed subdivision of g with dimension D. * If not, then the largest possible dimension of a mixed cell is stored in *maximalSeen. */ //bool hasMixedCellOfDimension(PolynomialSet const &g, int D, int *maximalSeen=0, IntegerVector *choice=0); /** * Computes the coDimension of the resultant variety of the Newton polytopes of the elements of g. */ int coDimensionOfResultantVariety(PolynomialSet const &g, IntegerVector *choice=0); int coDimensionOfResultantVariety(list > const &g, int d, IntegerVector *choice); #endif gfan0.8beta/src/primarydecomposition.cpp0000664000175000017500000000126315177170257020160 0ustar andersanders#include "primarydecomposition.h" PrimaryDecompositionEngine *PrimaryDecompositionEngine::list; static bool initialized; PrimaryDecompositionEngine::PrimaryDecompositionEngine() { next=list; list=this; } PrimaryDecompositionEngine *PrimaryDecompositionEngine::find(const char *name) { PrimaryDecompositionEngine *l=list; while(l) { if(std::string(l->name())==std::string(name))break; l=l->next; } return l; } PolynomialSetList minimalAssociatedPrimes(PolynomialSet const &idealGenerators) { PrimaryDecompositionEngine *p=PrimaryDecompositionEngine::find("sagesingular"); assert(p); return p->minimalAssociatedPrimes(idealGenerators); } gfan0.8beta/src/app_anton.h0000664000175000017500000002070515177170257015326 0ustar andersanders#ifndef GFANLIB_app_anton_H_ #define GFANLIB_app_anton_H_ #include #include #include #include #include #include #include "parser.h" #include "gfanapplication.h" #include "linalg.h" #include "gfanlib_tableau.h" #include "gfanlib_hypersurfaceintersection.h" #include "gfanlib_circuittableinteger.h" #include "gfanlib_q.h" #include "wallideal.h" //#include "rational.h" template Os& operator<<(Os& os, const std::set& v) { os << '[' << v.size() << "] {"; bool o{}; for (const auto& e : v) os << (o ? ", " : (o = 1, " ")) << e; return os << " }\n"; } namespace gfan{ using RayLabel = int; using ConeLabel = int; struct Component : set { int number; }; using PostCone = std::set; template class PostComplex{ Matrix selectRays(const PostCone& c) const { Matrix M(0,rays.getWidth()); for (auto r : c) M.appendRow(rays[r]); return M; } public: int dimension; Matrix rays; // rays are rows in this matrix std::vector cones; // maximal cones // CONTRUCTORS PostComplex(vector> remainingCones, RayCollector collector) : dimension(collector.getRays().getWidth()), rays(collector.getRays()) { for(auto& c : remainingCones) { //if(complex.isMaximal(c)) auto r = c.closure().getRays(); std::set cone; for(int i=0;i(0,d)) { } PostComplex(const Complex& complex) : dimension(complex.n), rays(complex.vertices) { for(auto& c : complex.cones) cones.push_back(std::set(c.indices.begin(),c.indices.end())); } bool includes(const PostCone& a, const PostCone& b) { return std::includes(a.begin(),a.end(),b.begin(),b.end()); } PostComplex(istream& is, bool filterMaximal = true) { std::string line; std::string lead; is >> lead; //"DIMENSION" is >> dimension; std::cerr << "dimension = " << dimension << std::endl; is >> lead; //"RAYS" rays = gfan::Matrix::readMatrix(is,dimension); std::cerr << "#rays = " << nRays() << std::endl; std::vector isConeMaximal; std::vector> maxConesContainingRay(nRays()); while(std::getline(is,line)) { // this assumes that the file ends with after "cones" std::istringstream iss(line); iss >> lead; //"CONE" if (lead != "CONE") { std::cerr << "--skipping line\n" << /*line << */ std::endl; continue; } PostCone c; RayLabel r; while(iss >> r) c.insert(r); cones.push_back(c); if (cones.size()%1000==0) std::cerr << cones.size() << " cones processed" << std::endl; bool isMaximal = true; if (filterMaximal) { set smallerCandidates; for(auto rL : c) smallerCandidates.merge(maxConesContainingRay[rL]); for(auto cL : smallerCandidates) if (includes(c,cones[cL])) { isConeMaximal[cL] = false; for(auto rL : cones[cL]) maxConesContainingRay[rL].erase(cL); } set largerCandidates(maxConesContainingRay[*c.begin()]); for (auto it = ++c.begin(); it != c.end(); ++it) { set intersection; set_intersection(largerCandidates.begin(), largerCandidates.end(), maxConesContainingRay[*it].begin(), maxConesContainingRay[*it].end(), std::inserter(intersection, intersection.begin())); largerCandidates = intersection; } isMaximal = largerCandidates.empty(); /*auto it = cones.begin(); while(isMaximal and it != cones.end()) { if (includes(c,*it)) { it = cones.erase(it); std::cerr << "erased non-maximal" << std::endl; } else if (includes(*it,c)) { isMaximal = false; std::cerr << "detected non-maximal" << std::endl; } else ++it; }*/ } isConeMaximal.push_back(isMaximal); if (isMaximal) for(auto rL : c) maxConesContainingRay[rL].insert(cones.size()-1); } std::vector maxCones; for(int i=0; i oldLabels(component.begin(),component.end()); std::vector newLabels(nRays(),-1); // -1 = has no new label for(int i=0; i=0;})) { PostCone newCone; for(auto r : c) newCone.insert(newLabels[r]); ret.cones.push_back(newCone); } } return ret; } std::set> connectedComponents() { using ComponentLabel = RayLabel; std::set> components; std::unordered_map> m; for(RayLabel r=0; r < nRays(); r++) if (isFinite(r)) { Component newComponent; newComponent.insert(r); newComponent.number = r; auto newComponentPtr = make_shared(newComponent); components.insert(newComponentPtr); m[r] = newComponentPtr; } for(const auto& c : cones) { auto firstFinite = std::find_if(std::begin(c), std::end(c), [&](RayLabel r){return isFinite(r);}); if (firstFinite == std::end(c)) std::cerr << "no finite ray!!!" << std::endl; else { auto componentPtr = m[*firstFinite]; for(auto r : c) { if(isFinite(r)) { auto rComponentPtr = m[r]; if(rComponentPtr != componentPtr) { // std::cerr<< "merging " << rComponentPtr->number << " and " << componentPtr->number << std::endl; for(auto s : *rComponentPtr) if(isFinite(s)) m[s] = componentPtr; componentPtr->merge(*rComponentPtr); /* for(auto comp: components) std::cerr << comp->number << " "; std::cerr << std::endl; */ components.erase(rComponentPtr); //std::cerr<< "#components = " << components.size() << std::endl; /* for(auto comp: components) std::cerr << comp->number << " "; std::cerr << std::endl; */ } } else componentPtr->insert(r); } } } return components; } void printComponents(std::set> components, bool saveNoncomets) { std::cerr << "-- Found " << components.size() << " component(s)\n"; bool greatSuccess = true; int failedCount = 0; for (auto component : components) { //std::cerr << *component; std::cout << "#rays = " << std::setfill('0') << std::setw(4) << component->size() << std::endl; gfan::Matrix unboundedDirections(0,dimension); for(RayLabel r : *component) if(rays[r][0].isZero()) unboundedDirections.appendRow(rays[r]); std::cout << "#unbounded = " << std::setfill('0') << std::setw(4) << unboundedDirections.getHeight() << std::endl; GeneratedCone recessionCone(unboundedDirections.transposed()); // global recession cone int dimLineality = recessionCone.getDimensionOfLinealitySpace(); std::cout << "Lineality dim: " << dimLineality << std::endl << "Cone dim: " << std::setfill('0') << std::setw(2) << recessionCone.getDimension() << std::endl; if (dimLineality == 0) std::cerr << "GREAT SUCCESS!!! :)\n"; else { std::cerr << "FAILED... :(\n"; if(saveNoncomets) { std::fstream f; f.open(std::to_string(component->number) + ".component.out",std::fstream::out); subcomplex(*component).serialize(f); f.close(); } } } } };//end class Postcomplex template ostream& operator<<(ostream& os, const PostComplex& pc) { //if (pc.C!=nullptr) os << pc.C->toString(FPF_cones|FPF_maximalCones); pc.serialize(os); return os; } } // namespace gfan #endif /* GFANLIB_app_anton_H_ */ gfan0.8beta/src/field_rationalfunctions2.cpp0000664000175000017500000004563215177170257020677 0ustar andersanders#include "field_rationalfunctions2.h" #define USEPOLYNOMIALGCD 1 /* For some reason, setting USEFACTORY to 1 breaks code. For example ./gfan _groebnerfan --stdin ~/gfan/current/examples/3x3of3x4 no longer works */ #include #include #include #include #include #include #include "termorder.h" #include "division.h" #include "buchberger.h" #include "saturation.h" #include "printer.h" #include "linalg.h" #if USEPOLYNOMIALGCD #include "polynomialgcd.h" #endif #include "log.h" int FieldElementRationalFunctions2Living; /** * This field is the field of _multivariate_ rational functions. */ class FieldElementRationalFunction2 : public FieldElementImplementation { Polynomial gcd(Polynomial a, Polynomial b) { if(a.degree(IntegerVector::standardVector(1,0)) l; l.push_back(p); l.push_back(q); int n=r.getNumberOfVariables(); for(int i=0;i l2; PolynomialRing r2(r.getField(),1); for(int I=0;I<2;I++) { Polynomial temp(r2); for(TermMap::const_iterator j=l[I].terms.begin();j!=l[I].terms.end();j++) { FieldElement mp=j->second; for(int k=0;kfirst.exponent[k+(k>=i)];l>0;l--)mp*=val[k]; IntegerVector expo(1);expo[0]=j->first.exponent[i]; temp+=Term(mp,Monomial(r2,expo)); } if(temp.isZero())goto retry; if(temp.degree(IntegerVector::standardVector(1,0)!=l[I].degree(IntegerVector::standardVector(n,i)))|| temp.degree(-IntegerVector::standardVector(1,0)!=l[I].degree(-IntegerVector::standardVector(n,i)))) goto retry; l2.push_back(temp); } //gcd if(gcd(l2[0],l2[1]).numberOfTerms()!=1) return false; } return true; } public: Polynomial p,q; FieldElementRationalFunction2(FieldImplementation &a): FieldElementImplementation(a), p(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing()), q(Term(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing().getField().zHomomorphism(1),Monomial(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing()))) { FieldElementRationalFunctions2Living++; } FieldElementRationalFunction2(FieldImplementation &a,int n_): FieldElementImplementation(a), p(Term(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing().getField().zHomomorphism(n_),Monomial(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing()))), q(Term(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing().getField().zHomomorphism(1),Monomial(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing()))) { if(n_==0)p=Polynomial(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing()); FieldElementRationalFunctions2Living++; } void normalize(bool doExpensiveGCD=true) { if(p.isZero()){q=p.getRing().one();return;} //STEP 1: Scale leading term of denominator to 1 LexicographicTermOrder T; q.mark(T); FieldElement s=q.getMarked().c; if(!s.isOne()) { s=s.inverse(); q*=s; p*=s; } //STEP 2: If denominator is monomial, then everything is easy if(q.isMonomial()) { if(q.totalDegree()==0)return; if(p.isMonomial()) { p.mark(T); Monomial s(p.getRing(),-min(p.getMarked().m.exponent,q.getMarked().m.exponent)); p*=s; q*=s; return; } } //STEP 3: We factor out monomial factors in both p and q and remember them for later Monomial qm(q.getRing(),q.greatestCommonMonomialDivisor()); q.saturate(); Monomial pm(p.getRing(),p.greatestCommonMonomialDivisor()); p.saturate(); IntegerVector A=min(qm.exponent,pm.exponent); qm.exponent-=A; pm.exponent-=A; //STEP 4: If one of our polynomials is a monomial, then we can find no more common factors if(q.isMonomial()||p.isMonomial()) { p*=pm; q*=qm; return; } // STEP 5: We check special cases where p divides q or q divides p. q.mark(T); p.mark(T); { //if q divides p then we don't need to compute gcd PolynomialSet R(q.getRing()); PolynomialSet Q(q.getRing()); Q.push_back(q); if(division(p,Q,T,&R).isZero()) { //pout<CLOCKS_PER_SEC) // { // debug<<"GCD TAKES TOO LONG:\n"<numberOfTerms()){FACTOR++;//pout<q<<"\n"; debug<p<<"\n"; debug<<(q*A->p)<<" - "<q<<"\n"; */ Polynomial fac1=polynomialGCD(p,A->q); Polynomial fac2=polynomialGCD(q,A->p); // Polynomial pTemp=p; // Polynomial qTemp=q; // p*=A->p; // q*=A->q; // normalize(); //#if 1 // int totalTerms=p.numberOfTerms()+q.numberOfTerms(); // p=pTemp; // q=qTemp; #if 0 p*=A->p; q*=A->q; // debug<<"A\n"; bool err=false; err|=!fac1.divides(p,&p); err|=!fac1.divides(q,&q); err|=!fac2.divides(p,&p); err|=!fac2.divides(q,&q); // debug<<"B\n"; assert(!err); #else Polynomial tp=p.exactlyDividedBy(fac1); Polynomial tAq=A->q.exactlyDividedBy(fac1); Polynomial tq=q.exactlyDividedBy(fac2); Polynomial tAp=A->p.exactlyDividedBy(fac2); p=tp*tAp; q=tq*tAq; #endif normalize(false); /* if(totalTerms!=p.numberOfTerms()+q.numberOfTerms()) { // debug<p<<"/"<q<<"\n"; p=pTemp; q=qTemp; p*=A->p; q*=A->q; normalize(); // debug<p<<"/"<q<<"\n"; // assert(0); }*/ //#endif #else p*=A->p; q*=A->q; normalize(); #endif } void operator+=(const FieldElementImplementation &a) { const FieldElementRationalFunction2 *A=(const FieldElementRationalFunction2*)&a; assert(A); p=p*A->q+A->p*q; q=A->q*q; normalize(); } void madd(const FieldElementImplementation &a,const FieldElementImplementation &b) { const FieldElementRationalFunction2 *A=(const FieldElementRationalFunction2*)&a; const FieldElementRationalFunction2 *B=(const FieldElementRationalFunction2*)&b; assert(A); assert(B); #if 0 p=p*(A->q*B->q)+(A->p*B->p)*q; q=A->q*B->q*q; normalize(); #else Polynomial fac1=polynomialGCD(B->p,A->q); Polynomial fac2=polynomialGCD(B->q,A->p); Polynomial tBp=B->p.exactlyDividedBy(fac1); Polynomial tAq=A->q.exactlyDividedBy(fac1); Polynomial tBq=B->q.exactlyDividedBy(fac2); Polynomial tAp=A->p.exactlyDividedBy(fac2); p=p*(tBq*tAq)+(tBp*tAp)*q; q=tBq*tAq*q; normalize(); #endif } FieldElementRationalFunction2 *one() const; bool isZero() const { return p.isZero(); } FieldElementRationalFunction2 *sum(const FieldElementImplementation &b)const { const FieldElementRationalFunction2 *B=(const FieldElementRationalFunction2*)&b; Polynomial fac1=polynomialGCD(q,B->q); Polynomial nq=B->q.exactlyDividedBy(fac1)*q; Polynomial np=p*B->q.exactlyDividedBy(fac1)+B->p*q.exactlyDividedBy(fac1); // It is still possible that more common factors exist. These must appear as factors of fac1 FieldElementRationalFunction2 *r= new FieldElementRationalFunction2(*getField(),np,nq); r->normalize(); // FieldElementRationalFunction2 *r= new FieldElementRationalFunction2(*getField(),p*B->q-B->p*q,B->q*q); return r; #if 0 const FieldElementRationalFunction2 *B=(const FieldElementRationalFunction2*)&b; // pout<q<<"------"<q.divides(q,"ient)) { // pout<q<<"+-----"<p*quotient,q); } else if(q.divides(B->q,"ient)) { return new FieldElementRationalFunction2(*getField(),B->p-p*quotient,B->q); } FieldElementRationalFunction2 *r= new FieldElementRationalFunction2(*getField(),p*B->q+B->p*q,B->q*q); return r; #endif } FieldElementRationalFunction2 *difference(const FieldElementImplementation &b)const { const FieldElementRationalFunction2 *B=(const FieldElementRationalFunction2*)&b; Polynomial fac1=polynomialGCD(q,B->q); Polynomial nq=B->q.exactlyDividedBy(fac1)*q; Polynomial np=p*B->q.exactlyDividedBy(fac1)-B->p*q.exactlyDividedBy(fac1); // It is still possible that more common factors exist. These must appear as factors of fac1 FieldElementRationalFunction2 *r= new FieldElementRationalFunction2(*getField(),np,nq); r->normalize(); // FieldElementRationalFunction2 *r= new FieldElementRationalFunction2(*getField(),p*B->q-B->p*q,B->q*q); return r; } FieldElementRationalFunction2 *negation()const { FieldElementRationalFunction2 *r= new FieldElementRationalFunction2(*getField(),p-p-p,q); return r; } FieldElementImplementation *inverse()const { if(isZero()) { AsciiPrinter P(Stderr); P.printString("Error inverting FieldElement: "); P.printPolynomial(p); P.printString(" "); P.printPolynomial(q); // P.printFieldElement(*this); P.printString("\n"); assert(0); } FieldElementRationalFunction2 *r= new FieldElementRationalFunction2(*getField(),q,p); return r; } int sign()const { assert(0);//not an ordered field (yet) if(isZero())return 0; return p.terms.rbegin()->second.sign(); } static string LaTeXTranslator(const string &s) { assert(0);//not supported yet /* int startIndex=0; string sign; if(s[0]=='-') { sign=string("-"); startIndex=1; } int slashIndex=-1; for(int i=startIndex;ip=p; r->q=q; return r; } }; PolynomialRing FieldRationalFunctions2Implementation::getPolynomialRing()const { return thePolynomialRing; } bool FieldRationalFunctions2Implementation::isRationals()const { return false; } int FieldRationalFunctions2Implementation::getCharacteristic()const { return this->getPolynomialRing().getField().getCharacteristic(); } FieldRationalFunctions2Implementation::FieldRationalFunctions2Implementation(PolynomialRing const &r): thePolynomialRing(r) { } std::string FieldRationalFunctions2Implementation::toString()const { stringstream s; s<< thePolynomialRing.getField().toString() << "("<(implementingObject.get()); #else FieldRationalFunctions2Implementation *imp=dynamic_cast(implementingObject); #endif Polynomial q=Term(imp->getPolynomialRing().getField().zHomomorphism(1),Monomial(imp->getPolynomialRing())); return new FieldElementRationalFunction2(*imp, p, q); } std::pair getNumeratorAndDenominatorOfRationalFunction2(FieldElement const &e) { // cerr<< typeid(e).name()<<"\n"; //why is this type not dynamic? auto E=dynamic_cast(e.implementingObject); // debug<p<<"\n"; return std::make_pair(E->p,E->q); } /***************************************************** * Conversion functions *****************************************************/ PolynomialRing makeVariablesParameters(PolynomialRing const &r, int numberOfParameters) { assert(numberOfParameters>=0); assert(numberOfParameters<=r.getNumberOfVariables()); vector names(numberOfParameters); for(int i=0;i names2(r.getNumberOfVariables()-numberOfParameters); for(int i=0;i(genericRing.getField().implementingObject.get()); #else FieldRationalFunctions2Implementation const *coefficientField=dynamic_cast(genericRing.getField().implementingObject); #endif FieldRationalFunctions2 &DANGER=(FieldRationalFunctions2&)genericRing.getField(); PolynomialRing coefRing=coefficientField->getPolynomialRing(); for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) { FieldElement c=i->second; IntegerVector v=i->first.exponent; IntegerVector coefficientExponent=v.subvector(0,p.getRing().getNumberOfVariables()-genericRing.getNumberOfVariables()); IntegerVector monomialExponent=v.subvector(p.getRing().getNumberOfVariables()-genericRing.getNumberOfVariables(),v.size()); FieldElement c2=DANGER.polynomialToFraction(Term( c,Monomial(coefRing, coefficientExponent)));//does the numerator not belong to a field? ret+=Polynomial(Term(c2,Monomial(genericRing,monomialExponent))); } return ret; } PolynomialSet makeVariablesParameters(PolynomialRing const &genericRing, PolynomialSet const &p) { PolynomialSet ret(genericRing); for(PolynomialSet::const_iterator i=p.begin();i!=p.end();i++) ret.push_back(makeVariablesParameters(genericRing,*i)); return ret; } gfan0.8beta/src/app_scarfisgeneric.cpp0000664000175000017500000000341315177170257017526 0ustar andersanders#include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "termorder.h" #include "ep_standard.h" #include "ep_xfig.h" #include "gfanapplication.h" #include "matrix.h" #include "latticeideal.h" #include "subspace.h" #include "scarf.h" class ScarfIsGenericApplication : public GFanApplication { public: bool includeInDefaultInstallation() { return false; } const char *helpText() { return "This program takes a matrix as input and checks if it satisfies Scarf's generality conditions. The rows of the matrix are listed on the input. The A1 condition is that there exists a strictly poistive vector in the co-kernel of the matrix. The A2 condition is that te maximal minors of the matrix are non-zero. A3\n"; } ScarfIsGenericApplication() { registerOptions(); } const char *name() { return "_scarf_isgeneric"; } int main() { LpSolver::printList(Stdout); lpSetSolver("cddgmp"); FileParser P(Stdin); IntegerVectorList ivl=P.parseIntegerVectorList(); IntegerMatrix A=rowsToIntegerMatrix(ivl); bool s1=satisfiesA1(A); fprintf(Stdout,"A1 satisfied:%i\n",s1); if(s1) { IntegerVectorList N=neighbours(A); AsciiPrinter Q(Stdout); N=orientedNeighbours(N,-A[0].toVector()); Q.printVectorList(N); fprintf(Stdout,"A2 satisfied:%i\n",satisfiesA2(A)); for(int i=0;in?n:d; for(int r=1;r<=min;r++) { PolynomialRing R(Q,matrixVariableNames("m",d,n)); PolynomialSet p=minors(R,r,d,n,false,false); if(optionKapranov.getValue()) { WeightReverseLexicographicTermOrder T(w); buchberger(&p,T); } PolynomialSet q=initialForms(p,w); bool containsMonomial=false; for(PolynomialSet::const_iterator i=q.begin();i!=q.end();i++) if(i->isMonomial()) { containsMonomial=true; break; } fprintf(Stderr,"%ix%i picks monomial: %s %i\n",r,r,containsMonomial?"true, meaning that rank is >":"false, meaning that rank is <=",r-1); if(!containsMonomial) { theRank=r-1; break; } } if(theRank==-1) theRank=min; AsciiPrinter(Stdout).printInteger(theRank); AsciiPrinter(Stdout).printNewLine(); return 0; } }; static TropicalRankApplication theApplication; gfan0.8beta/src/app_facets.cpp0000664000175000017500000000223615177170257016006 0ustar andersanders#include "parser.h" #include "printer.h" #include "wallideal.h" #include "lp.h" #include "gfanapplication.h" #include "log.h" class FacetsApplication : public GFanApplication { public: bool includeInDefaultInstallation() { return false; } const char *helpText() { return "This program computes the facet normals of a full-dimensional cone specified on the input. The input is a list of vectors each defining a half space. The cone is the intersection of these half spaces. The output is a minimal list of normals defining the cone.\n"; } FacetsApplication() { registerOptions(); } const char *name() { return "_facets"; } int main() { FileParser P(Stdin); IntegerVectorList normals=P.parseIntegerVectorList(); normals=wallRemoveScaledInequalities(normals); IntegerVectorList facets; for(IntegerVectorList::const_iterator i=normals.begin();i!=normals.end();i++) if(isFacet(normals,i)) { facets.push_back(*i); } AsciiPrinter(Stdout).printVectorList(facets); log1 fprintf(Stderr,"Rank:%i\n",rankOfMatrix(facets)); return 0; } }; static FacetsApplication theApplication; gfan0.8beta/src/determinantpoly.cpp0000664000175000017500000002575015177170257017125 0ustar andersanders#include "determinantpoly.h" #include #include "printer.h" #include "buchberger.h" #include "wallideal.h" #include "termorder.h" #include "tropical2.h" #include "tropicaldeterminant.h" #include "log.h" using namespace std; static list interval(int n, bool sqrt) { list ret; for(int i=0;((sqrt)?i*i:i) forms; PolyMatrixEntry(Polynomial const &p_, IntegerVector const &w): p(p_), isZero(p_.isZero()) { if(p.isZero()) { maxDegree=td_minusInfinity; mminDegree=td_minusInfinity; return; } maxDegree=p_.degree(w); mminDegree=p_.degree(-w); // debug<first.exponent,w)+mminDegree]+=Term(i->second,i->first); } } }; list::iterator indexOfSparsestRow(list &rows, list const &columns, int &chosenRowIteratorIndex) { list::iterator ret=rows.end(); int bestNumberOfZeros=-1; int I=0; for(list::iterator i=rows.begin();i!=rows.end();i++,I++) { int numberOfZeros=0; for(list::const_iterator j=columns.begin();j!=columns.end();j++)numberOfZeros+=data[*i][*j].isZero; if(numberOfZeros>bestNumberOfZeros) { bestNumberOfZeros=numberOfZeros; ret=i; chosenRowIteratorIndex=I; } } // cerr<<":"< > data; PolynomialRing theRing; //constructor for Jacobi matrix PolyMatrix(PolynomialSet const &generators, IntegerVector const &w, bool takeDerivatives, int numberOfDVariables=-1): theRing(generators.getRing()) { if(takeDerivatives) { int n=generators.size(); if(numberOfDVariables==-1)numberOfDVariables=n; PolynomialSet::const_iterator I=generators.begin(); for(int i=0;i row; for(int j=0;jderivative(j),w)); data.push_back(row); I++; } } else { int n=generators.size(); for(int i=0;i=n){n=i;break;}assert(n*n==generators.size()); PolynomialSet::const_iterator I=generators.begin(); for(int i=0;i row; for(int j=0;j l) { cerr<<"{"; for(list::const_iterator i=l.begin();i!=l.end();i++) cerr<<*i<<","; cerr<<"}\n"; } IntegerMatrix subTropicalMatrix(bool max, list const &rows, list const &columns) { IntegerMatrix ret(rows.size(),columns.size()); list::const_iterator I=rows.begin(); for(int i=0;i::const_iterator J=columns.begin(); for(int j=0;j rows, list columns, int degree, int level) { Polynomial ret(theRing); IntegerMatrix matMax=subTropicalMatrix(true,rows,columns); IntegerMatrix matMMin=subTropicalMatrix(false,rows,columns); /* if(level==0) { debug<maxDet)return Polynomial(theRing); if(-degree>mminDet)return Polynomial(theRing); if(rows.size()==1) { if(data[rows.front()][columns.front()].isZero)return Polynomial(theRing); // cerr<::iterator chosenRowIterator=indexOfSparsestRow(rows, columns, chosenRowIteratorIndex);//rows.begin(); int chosenrow=*chosenRowIterator; { list::iterator temp=chosenRowIterator;temp++; rows.erase(chosenRowIterator); //no need to update rows afterwards since it is stored on the stack } /* if(level==0)cerr<<"-"<::iterator i=columns.begin();i!=columns.end();i++) { int chosencol=*i; if(!data[chosenrow][chosencol].isZero) { list::iterator temp=i;temp++; columns.erase(i); i=temp; // int D=degree+1; // if(data[chosenrow][chosencol].forms.size() rows=interval(data.size(),0); list columns=interval(data.size(),0); IntegerMatrix matMax=subTropicalMatrix(true,rows,columns); IntegerMatrix matMMin=subTropicalMatrix(false,rows,columns); int maxDet=tropicalDeterminant(matMax); int mminDet=tropicalDeterminant(matMMin); cerr<<"Max"<=-mminDet;d--) { log1 debug<<"Computing degree "< toIndexed(list const &l) { list ret; int a=0; for(list::const_iterator i=l.begin();i!=l.end();i++,a++)if(*i)ret.push_back(a); return ret; } PolynomialSet jacobiMinors(PolynomialSet const &g, int codim) { IntegerVector w(g.getRing().getNumberOfVariables()); PolyMatrix m(g,w,true,w.size()); //log1 m.print(); PolynomialSet ret(g.getRing()); if(codim<=g.size())if(codim<=w.size()) { list rows; for(int i=0;i cols; for(int i=0;isize(); SymmetryGroup s(n); s.computeClosure(generators); s.print(Stderr); fprintf(Stderr,"\n"); IntegerVectorList vList=P.parseIntegerVectorList(); IntegerVectorList rep; for(IntegerVectorList::const_iterator i=vList.begin();i!=vList.end();i++) { bool found=false; for(IntegerVectorList::const_iterator j=rep.begin();j!=rep.end();j++) { if(i->sum()==j->sum()) { for(SymmetryGroup::ElementContainer::const_iterator k=s.elements.begin();k!=s.elements.end();k++) if(SymmetryGroup::compose(*k,*j)==*i) { found=true; break; } } if(found)break; } if(!found)rep.push_back(*i); } p.printVectorList(rep); return 0; } }; static RepresentativesApplication theApplication; gfan0.8beta/src/halfopencone.cpp0000664000175000017500000021165215177170257016346 0ustar andersanders#include "halfopencone.h" #include #include "buchberger.h" #include "enumeration.h" #include "reversesearch.h" #include "wallideal.h" #include "printer.h" #include "parser.h" #include "newtonpolytope.h" #include "subspace.h" #include "lp.h" #include "log.h" static void saveList(IntegerVectorList const &l, char const *name) { FILE *f=fopen(name,"w"); if(f) { AsciiPrinter P(f); P<=1000) saveList(interiorPoints,"partialresult"); counter=0; } } }; /* This Cone processor saves memory when doing up to symmetry computations where orbits can be repeated */ class HalfOpenConeProcessorConeCollector : public HalfOpenConeProcessor { public: HalfOpenConeList theList; void process(HalfOpenCone const &c, IntegerVector const &chosenFans, IntegerVector const &chosenCone) { theList.push_back(c); } }; static void printHalfOpenCone(Printer &P, HalfOpenCone c) { P.printPolyhedralCone(c.closure()); } static void printHalfOpenConeList(Printer &P, HalfOpenConeList const &l) { P.printString("Begin HalfOpenConeList\n"); for(HalfOpenConeList::const_iterator i=l.begin();i!=l.end();i++) printHalfOpenCone(P,*i); P.printString("End HalfOpenConeList\n"); } bool HalfOpenCone::contains(IntegerVector const &v)const { IntegerVectorList inequalityList=lifted.getHalfSpaces(); IntegerVectorList equationList=lifted.getEquations(); IntegerVectorList strict,nonstrict; for(IntegerVectorList::const_iterator i=inequalityList.begin();i!=inequalityList.end();i++) if((*i)[i->size()-1]<0) strict.push_back(*i); else if((*i)[i->size()-1]==0) nonstrict.push_back(*i); else {//CHANGED assert(i->subvector(0,i->size()-1).isZero()); strict.push_back(*i); } for(IntegerVectorList::const_iterator i=equationList.begin();i!=equationList.end();i++) if(dotLong(i->subvector(0,i->size()-1),v)!=0)return false; for(IntegerVectorList::const_iterator i=nonstrict.begin();i!=nonstrict.end();i++) if(dotLong(i->subvector(0,i->size()-1),v)<0)return false; for(IntegerVectorList::const_iterator i=strict.begin();i!=strict.end();i++) if(dotLong(i->subvector(0,i->size()-1),v)<=0)return false; return true; } void HalfOpenCone::appendList(IntegerVectorList &to, IntegerVectorList const &from, int appendValue) { for(IntegerVectorList::const_iterator i=from.begin();i!=from.end();i++) { IntegerVector v=*i; v.resize(v.size()+1); v[v.size()-1]=appendValue; to.push_back(v); } } HalfOpenCone::HalfOpenCone(int dimension_, PolyhedralCone const &lifted_): dimension(dimension_), liftedDimension(dimension_+1), lifted(lifted_) { // lifted.findFacets(); } HalfOpenCone::HalfOpenCone(int dimension_, IntegerVectorList const &equations, IntegerVectorList const &nonstrict, IntegerVectorList const &strict, bool findFacets, bool canonicalize): dimension(dimension_), liftedDimension(dimension_+1), lifted(dimension_+1) { IntegerVectorList equationList,inequalityList; appendList(equationList,equations,0); appendList(inequalityList,nonstrict,0); appendList(inequalityList,strict,-1); inequalityList.push_back(IntegerVector::standardVector(liftedDimension,dimension)); //CHANGED // AsciiPrinter(Stderr).printVectorList(inequalityList); // AsciiPrinter(Stderr).printVectorList(equationList); // AsciiPrinter(Stderr).printInteger(liftedDimension); lifted=PolyhedralCone(inequalityList,equationList,liftedDimension); if(findFacets)lifted.findFacets(); if(canonicalize)lifted.canonicalize(); } HalfOpenCone::HalfOpenCone(PolyhedralCone C, TermOrder const &t): dimension(C.ambientDimension()), liftedDimension(C.ambientDimension()+1), lifted(C.ambientDimension()+1) { HalfOpenConeList ret; C.findFacets(); assert(C.dimension()==C.ambientDimension()); IntegerVectorList facets=C.getHalfSpaces(); IntegerVectorList strictList,nonStrictList; for(IntegerVectorList::const_iterator i=facets.begin();i!=facets.end();i++) { if(t(*i,*i-*i)) strictList.push_back(*i); else nonStrictList.push_back(*i); } IntegerVectorList inequalityList; appendList(inequalityList,nonStrictList,0); appendList(inequalityList,strictList,-1); inequalityList.push_back(IntegerVector::standardVector(liftedDimension,dimension)); //CHANGED IntegerVectorList empty; lifted=PolyhedralCone(inequalityList,empty,liftedDimension); // if(findFacets)lifted.findFacets(); } HalfOpenCone::HalfOpenCone(int ambientDimension): dimension(ambientDimension), liftedDimension(ambientDimension+1), lifted(ambientDimension+1) { IntegerVectorList inequalityList; inequalityList.push_back(IntegerVector::standardVector(liftedDimension,dimension)); IntegerVectorList empty; lifted=PolyhedralCone(inequalityList,empty,liftedDimension); } static IntegerVectorList swapFirstLast(const IntegerVectorList &l) { IntegerVectorList ret; for(IntegerVectorList::const_iterator i=l.begin();i!=l.end();i++) { IntegerVector v=*i; int t=v[0]; v[0]=v[v.size()-1]; v[v.size()-1]=t; ret.push_back(v); } return ret; } bool HalfOpenCone::isEmpty() { bool ret1=!hasHomogeneousSolution(liftedDimension, swapFirstLast(lifted.getHalfSpaces()), swapFirstLast(lifted.getEquations()) ); /* IntegerVectorList inequalityList; inequalityList.push_back(IntegerVector::standardVector(liftedDimension,dimension)); PolyhedralCone temp=intersection(lifted,PolyhedralCone(inequalityList,IntegerVectorList(),liftedDimension)); IntegerVector v=temp.getRelativeInteriorPoint(); // AsciiPrinter(Stderr).printVector(v); bool ret2=(v[dimension]==0); */ /* fprintf(Stderr,"Inequalities:\n"); AsciiPrinter(Stderr).printVectorList(lifted.getHalfSpaces()); fprintf(Stderr,"Equations:\n"); AsciiPrinter(Stderr).printVectorList(lifted.getEquations()); fprintf(Stderr,"hasSolution=%i\n",ret1); */ // assert(ret1==ret2); return ret1; } bool haveEmptyIntersection(const HalfOpenCone &a, const HalfOpenCone &b) { // {static int i;cerr<<"emptyintersectiontest"<<++i<<"\n";} assert(a.dimension==b.dimension); IntegerVectorList inequalityList=a.lifted.getHalfSpaces(); IntegerVectorList equationList=a.lifted.getEquations(); IntegerVectorList inequalityList2=b.lifted.getHalfSpaces(); IntegerVectorList equationList2=b.lifted.getEquations(); inequalityList.splice(inequalityList.begin(),inequalityList2); equationList.splice(equationList.begin(),equationList2); bool ret1=!hasHomogeneousSolution(a.liftedDimension,swapFirstLast(inequalityList),swapFirstLast(equationList)); /* HalfOpenCone c=intersection(a,b); if(c.isEmpty()!=ret1) { AsciiPrinter(Stderr).printVectorList(inequalityList); AsciiPrinter(Stderr).printVectorList(equationList); AsciiPrinter(Stderr).printVectorList(c.lifted.getHalfSpaces()); AsciiPrinter(Stderr).printVectorList(c.lifted.getEquations()); fprintf(Stderr,"hasHomogeneousSolution siger %i\n",!ret1); assert(0); } */ return ret1; } /*bool HalfOpenCone::isEmpty() { IntegerVector v(liftedDimension); v[dimension]=-1; IntegerVectorList equationList,inequalityList; inequalityList.push_back(v); PolyhedralCone c(inequalityList,equationList,liftedDimension); PolyhedralCone c2=intersection(c,lifted); lifted.canonicalize(); c2.canonicalize(); return !(c2!=lifted); }*/ HalfOpenCone intersection(const HalfOpenCone &a, const HalfOpenCone &b, bool findFacets) { assert(a.dimension==b.dimension); /* fprintf(Stderr,"-----------------------------------------------------------\n"); fprintf(Stderr,"Intersecting:\n"); AsciiPrinter P(Stderr); printHalfOpenCone(P,a); printHalfOpenCone(P,b); */ // {static int i;cerr<<++i<<"\n";} HalfOpenCone ret=HalfOpenCone(a.dimension,intersection(a.lifted,b.lifted)); { static int t; t++; if((!(t&7))||findFacets)ret.lifted.findFacets(); //1 4:53 //3 3:38 //7 } /* fprintf(Stderr,"Result:\n"); printHalfOpenCone(P,ret); fprintf(Stderr,"Is empty:%i\n",ret.isEmpty()); fprintf(Stderr,"-----------------------------------------------------------\n"); fprintf(Stderr,"States: %i,%i,%i\n",a.lifted.getState(),b.lifted.getState(),ret.lifted.getState()); fprintf(Stderr,"-----------------------------------------------------------\n"); */ return ret; } IntegerVectorList HalfOpenCone::shrink(const IntegerVectorList &l) { IntegerVectorList ret; for(IntegerVectorList::const_iterator i=l.begin();i!=l.end();i++) ret.push_back(i->subvector(0,i->size()-1)); return ret; } PolyhedralCone HalfOpenCone::closure() { lifted.findFacets(); return PolyhedralCone(shrink(lifted.getHalfSpaces()),shrink(lifted.getEquations()),dimension); } /* */ HalfOpenConeList orientedBoundary(PolyhedralCone C, TermOrder const &t, HalfOpenCone *restrictingCone) { int dimension=C.ambientDimension(); HalfOpenConeList ret; C.findFacets(); assert(C.dimension()==C.ambientDimension()); IntegerVectorList facets=C.getHalfSpaces(); IntegerVectorList strictList,nonStrictList; for(IntegerVectorList::const_iterator i=facets.begin();i!=facets.end();i++) { if(t(*i,*i-*i)) strictList.push_back(*i); else nonStrictList.push_back(*i); } // log0 AsciiPrinter(Stderr).printVectorList(strictList); // log0 AsciiPrinter(Stderr).printVectorList(nonStrictList); // Let's make the non-strict inequalities strict one at a time and add a cone for each iteration while(!nonStrictList.empty()) { // fprintf(Stderr,"NEWWALL\n"); IntegerVector v=nonStrictList.front(); nonStrictList.pop_front(); IntegerVectorList equationList; equationList.push_back(v); { HalfOpenCone c(dimension,equationList,nonStrictList,strictList,true); if(restrictingCone) c=intersection(*restrictingCone,c,true); if(!c.isEmpty())ret.push_back(c); } strictList.push_back(v); } return ret; } HalfOpenConeList tropicalHyperSurface(Polynomial const &p1) { PolynomialRing theRing=p1.getRing(); PolynomialRing theSecondRing=theRing.withVariablesAppended("H"); Polynomial p=p1.homogenization(theSecondRing); HalfOpenConeList ret; PolynomialSet g(theRing); g.push_back(p); buchberger(&g,LexicographicTermOrder()); EnumerationTargetCollector gfan; LexicographicTermOrder myTermOrder; ReverseSearch rs(myTermOrder); rs.setEnumerationTarget(&gfan); fprintf(Stderr,"Starting enumeratioin\n"); rs.enumerate(g); fprintf(Stderr,"Done\n"); PolynomialSetList theList=gfan.getList(); for(PolynomialSetList::const_iterator i=theList.begin();i!=theList.end();i++) { HalfOpenConeList temp=orientedBoundary(groebnerCone(i->deHomogenization(),false),myTermOrder); ret.splice(ret.begin(),temp); } // AsciiPrinter P(Stderr); // printHalfOpenConeList(P,ret); return ret; } static void buildFanFromPolynomial(Polynomial const &p1, HalfOpenConeList *fullDimCones, HalfOpenConeList *coDimOneCones, IntegerVector *parentList, HalfOpenCone *restrictingCone=0) { int n(p1.getRing().getNumberOfVariables()); IntegerVectorList empty; HalfOpenCone dummy(n,empty,empty,empty,true); if(restrictingCone==0)restrictingCone=&dummy; if(p1.isZero()) //If the polynomial is zero it makes most sense to return a complete fan consisting of one cone in both cases { IntegerVectorList empty; if(fullDimCones)fullDimCones->push_back(intersection(HalfOpenCone(n,empty,empty,empty),*restrictingCone)); if(coDimOneCones)coDimOneCones->push_back(intersection(HalfOpenCone(n,empty,empty,empty),*restrictingCone)); return; } LexicographicTermOrder myTermOrder; IntegerVectorList l=newtonPolytope(p1); // log0 AsciiPrinter(Stderr).printVectorList(l); assert(!l.empty()); removeNonExtremeVerticesOfPolytope(l); // log0 AsciiPrinter(Stderr).printVectorList(l); IntegerVector parents; int numberOfCoDimOneCones=0; int numberOfFullDimCones=0; for(IntegerVectorList::const_iterator i=l.begin();i!=l.end();i++) { numberOfFullDimCones++; IntegerVectorList inequalities; for(IntegerVectorList::const_iterator j=l.begin();j!=l.end();j++) if(j!=i) inequalities.push_back(*i-*j); // log0 fprintf(Stderr,"ineq\n"); // log0 AsciiPrinter(Stderr).printVectorList(inequalities); inequalities=normalizedWithSumsAndDuplicatesRemoved(inequalities); //log0 fprintf(Stderr,"ineq\n"); //log0 AsciiPrinter(Stderr).printVectorList(inequalities); IntegerVectorList empty; PolyhedralCone C(inequalities,empty,n,PCP_impliedEquationsKnown); C.findFacets(); if(coDimOneCones || parentList) { HalfOpenConeList temp=orientedBoundary(C,myTermOrder,restrictingCone); // fprintf(Stderr,"TESTSET:%i\n",temp.size()); for(int i=0;iprint(P); } fprintf(Stderr,"-------------------------------------------------\n");*/ HalfOpenConeList::iterator k=coDimOneCones->end(); coDimOneCones->splice(k,temp); } } if(fullDimCones) { fullDimCones->push_back(intersection(HalfOpenCone(C,myTermOrder),*restrictingCone)); /* fprintf(Stderr,"Came from-------------------------------------------------\n"); AsciiPrinter P(Stderr); fullDimCones->back().print(P); fprintf(Stderr,"-------------------------------------------------\n"); */ } } if(parentList) *parentList=parents; } HalfOpenConeList tropicalHyperSurfaceFast(Polynomial const &p1) { HalfOpenConeList ret; buildFanFromPolynomial(p1,0,&ret,0); return ret; } HalfOpenConeList normalFanOfNewtonPolytope(Polynomial const &p1) { HalfOpenConeList ret; buildFanFromPolynomial(p1,&ret,0,0); return ret; } HalfOpenConeList refinement(HalfOpenConeList const &a, HalfOpenConeList const &b) { HalfOpenConeList ret; for(HalfOpenConeList::const_iterator i=a.begin();i!=a.end();i++) for(HalfOpenConeList::const_iterator j=b.begin();j!=b.end();j++) if(!haveEmptyIntersection(*i,*j)) { HalfOpenCone c=intersection(*i,*j); // c.isEmpty(); // c.isEmpty(); // if(!c.isEmpty()) ret.push_back(c); } return ret; } HalfOpenConeList tropicalHyperSurfaceIntersection2(int dimension, PolynomialSet const &g) { HalfOpenConeList intersection; IntegerVectorList empty; intersection.push_back(HalfOpenCone(dimension,empty,empty,empty)); for(PolynomialSet::const_iterator i=g.begin();i!=g.end();i++) { HalfOpenConeList surface=tropicalHyperSurface(*i); fprintf(Stderr,"Number of cones in current intersection:%i\n",(int)intersection.size()); fprintf(Stderr,"Number of cones in next surface:%i\n",(int)surface.size()); fprintf(Stderr,"A\n"); intersection=refinement(intersection,surface); fprintf(Stderr,"B\n"); } fprintf(Stderr,"%i",(int)intersection.size()); return intersection; } void tropicalHyperSurfaceIntersectionWithProcessor(int dimension, PolynomialSet const &g, HalfOpenConeProcessor &myProcessor, PolyhedralCone *restrictingCone, bool expand, int intervalLow, int intervalHigh) { assert(expand || !restrictingCone);//Need to fix this if we don't want to expand. Add in a different HalfOpenConeProcessor. // HalfOpenConeList intersection; if(restrictingCone) { IntegerVectorList equations=restrictingCone->getEquations(); IntegerVectorList nonStrict=restrictingCone->getHalfSpaces(); IntegerVectorList strict; /**************************************************************** * REMOVE THE LINE BELOW!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ // strict.push_back(IntegerVector::standardVector(g.getRing().getNumberOfVariables(),0));cerr<<"REMOVE THIS LINE\n"; HalfOpenCone restrictingCone2(dimension,equations,nonStrict,strict,true); //intersection= tropicalHyperSurfaceIntersectionInSubspace(dimension,g,&restrictingCone2,myProcessor,intervalLow,intervalHigh);//<<---here //intersection=tropicalHyperSurfaceIntersection(dimension,g,&restrictingCone2); } else { HalfOpenCone rCone(dimension); //intersection= tropicalHyperSurfaceIntersectionInSubspace(dimension,g,&rCone,myProcessor,intervalLow,intervalHigh);//<<---here /* PolyhedralFan intersectionOld=tropicalHyperSurfaceIntersection(dimension,g); AsciiPrinter P(Stderr); intersection.print(&P); intersectionOld.print(&P); */ } log2 fprintf(Stderr,"Halfopen intersection completed.\n"); } PolyhedralFan tropicalHyperSurfaceIntersectionClosed(int dimension, PolynomialSet const &g, PolyhedralCone *restrictingCone, bool expand, bool saveResult, int intervalLow, int intervalHigh) { HalfOpenConeProcessorPointCollector myProcessor; if(saveResult)myProcessor.setSave(); tropicalHyperSurfaceIntersectionWithProcessor(dimension,g,myProcessor,restrictingCone,expand,intervalLow,intervalHigh); if(saveResult)saveList(myProcessor.interiorPoints,"finalresult"); // AsciiPrinter P(Stderr); // printHalfOpenConeList(intersection, P); PolyhedralFan ret(dimension); // for(HalfOpenConeList::iterator i=intersection.begin();i!=intersection.end();i++) for(IntegerVectorList::const_iterator i=myProcessor.interiorPoints.begin();i!=myProcessor.interiorPoints.end();i++) { /*PolyhedralCone c=i->closure(); c.canonicalize(); if(expand) c=normalConeOfMinkowskiSum(g,c.getRelativeInteriorPoint()); ret.insert(c); */ ret.insert(normalConeOfMinkowskiSum(g,*i)); } /* AsciiPrinter P(Stderr); ret.print(&P); cerr<<"ETSTSETST------------------------------------------------------------------------------"; */ return ret; } void HalfOpenCone::splitIntoRelativelyOpenCones(list &l) { // fprintf(Stderr,"BEGIN\n"); // AsciiPrinter P(Stderr); // print(P); lifted.findFacets(); // print(P); /* { IntegerVector v=StringParser("(3,0,3,2,0,3)").parseIntegerVector(); if(contains(v))fprintf(Stderr,"??????????????????????????????????????????\n"); }*/ IntegerVectorList inequalityList=lifted.getHalfSpaces(); IntegerVectorList equationList=lifted.getEquations(); IntegerVectorList strict,nonstrict; for(IntegerVectorList::const_iterator i=inequalityList.begin();i!=inequalityList.end();i++) if((*i)[i->size()-1]<0) strict.push_back(*i); else if((*i)[i->size()-1]==0) nonstrict.push_back(*i); else {//CHANGED assert(i->subvector(0,i->size()-1).isZero()); strict.push_back(*i); } // AsciiPrinter(Stderr).printVectorList(nonstrict); // AsciiPrinter(Stderr).printVectorList(strict); // AsciiPrinter(Stderr).printVectorList(equationList); if(nonstrict.size()==0) { l.push_back(*this); } else { IntegerVector chosen=*nonstrict.begin(); nonstrict.pop_front(); strict.push_front(chosen); (*strict.begin())[strict.begin()->size()-1]=-1; IntegerVectorList a=nonstrict; IntegerVectorList tempa=strict; a.splice(a.begin(),tempa); // fprintf(Stderr,"New inequalities:\n"); // AsciiPrinter(Stderr).printVectorList(a); HalfOpenCone A(dimension,PolyhedralCone(a,equationList,liftedDimension)); A.splitIntoRelativelyOpenCones(l); equationList.push_front(chosen); strict.pop_front(); IntegerVectorList b=nonstrict; IntegerVectorList tempb=strict; b.splice(b.begin(),tempb); // fprintf(Stderr,"New inequalities:\n"); // AsciiPrinter(Stderr).printVectorList(b); // fprintf(Stderr,"New equationList:\n"); // AsciiPrinter(Stderr).printVectorList(equationList); HalfOpenCone B(dimension,PolyhedralCone(b,equationList,liftedDimension)); B.splitIntoRelativelyOpenCones(l); } // AsciiPrinter(Stderr).print // fprintf(Stderr,"END\n"); } void HalfOpenCone::print(class Printer &p)const { p.printString("Printing HalfOpenCone\n"); lifted.print(&p); p.printString("Done printing HalfOpenCone\n"); } HalfOpenConeList splitIntoRelativelyOpenCones(HalfOpenConeList const &l) { AsciiPrinter P(Stderr); HalfOpenConeList ret; for(HalfOpenConeList::const_iterator i=l.begin();i!=l.end();i++) { fprintf(Stderr,"A"); HalfOpenCone temp=*i; HalfOpenConeList tempSplit; // fprintf(Stderr,"---------------------------------------------------------------\n"); // temp.print(P); // fprintf(Stderr,"---------------------------------------------------------------\n"); temp.splitIntoRelativelyOpenCones(tempSplit); // fprintf(Stderr,"Splits into:"); // for(HalfOpenConeList::const_iterator i=tempSplit.begin();i!=tempSplit.end();i++) // i->print(P); // fprintf(Stderr,"Splits into End."); ret.splice(ret.begin(),tempSplit); fprintf(Stderr,"B\n"); } return ret; } static bool isSubsetOf(IntegerVector const &v, IntegerVector const &u) { for(int i=0;i cones; for(HalfOpenConeList::iterator i=L.begin();i!=L.end();i++) cones.push_back(i->closure()); int homog=1000000; int largest=0; int ambientDimension=-1; for(list::const_iterator i=cones.begin();i!=cones.end();i++) { if(i->dimension()dimension(); if(i->dimension()>largest)largest=i->dimension(); ambientDimension=i->ambientDimension(); } assert(homog!=1000000); for(list::const_iterator i=cones.begin();i!=cones.end();i++) { assert(i->dimensionOfLinealitySpace()==homog); } fprintf(Stderr,"Ambient dimension: %i, maximal dimension: %i, dimension of lineality space: %i\n",ambientDimension,largest,homog); IntegerVectorList rays; for(list::iterator i=cones.begin();i!=cones.end();i++) if(i->dimension()==homog+1)rays.push_back(i->getRelativeInteriorPoint()); p.printString("Rays:\n"); p.printVectorList(rays,true); list subsets; for(int d=homog;d<=largest;d++) { IntegerVectorList thisDimension; list cones2; for(list::iterator i=cones.begin();i!=cones.end();i++) if(i->dimension()==d) cones2.push_back(*i); for(list::const_iterator i=cones2.begin();i!=cones2.end();i++) { IntegerVector v(0); int J=0; for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++) { if(i->contains(*j)) { v.grow(v.size()+1); v[v.size()-1]=J; } J++; } thisDimension.push_back(v); } subsets.push_back(thisDimension); } list::const_iterator subsetIterator=subsets.begin(); list::const_iterator subsetIteratorNext=subsets.begin(); for(int d=homog;d<=largest;d++) { subsetIteratorNext++; IntegerVectorList maximal,nonmaximal; if(subsetIteratorNext!=subsets.end()) { for(IntegerVectorList::const_iterator i=subsetIterator->begin();i!=subsetIterator->end();i++) if(isSubsetOf(*i,*subsetIteratorNext)) nonmaximal.push_back(*i); else maximal.push_back(*i); } else maximal=*subsetIterator; p.printString("Printing ");p.printInteger(subsetIterator->size());p.printString(" ");p.printInteger(d);p.printString("-dimensional cones (");p.printInteger(maximal.size());p.printString(" maximal cones):\n"); p.printString("{"); { bool first=true; for(IntegerVectorList::const_iterator i=maximal.begin();i!=maximal.end();i++) { if(!first)p.printString(",\n"); p.printVector(*i); first=false; } if(!first && nonmaximal.size()!=0)p.printString(",\n"); p.printString("\n"); first=true; for(IntegerVectorList::const_iterator i=nonmaximal.begin();i!=nonmaximal.end();i++) { if(!first) p.printString(",\n"); p.printVector(*i); first=false; } } p.printString("}\n"); subsetIterator++; } /* for(int d=homog;d<=largest;d++) { list cones2; for(list::iterator i=cones.begin();i!=cones.end();i++) if(i->dimension()==d) cones2.push_back(*i); p.printString("Printing ");p.printInteger(cones2.size());p.printString(" ");p.printInteger(d);p.printString("-dimensional cones:\n"); p.printString("{"); for(list::const_iterator i=cones2.begin();i!=cones2.end();i++) { IntegerVector v(0); int J=0; for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++) { if(i->contains(*j)) { v.grow(v.size()+1); v[v.size()-1]=J; } J++; } if(i!=cones2.begin())p.printString(",\n"); p.printVector(v); } p.printString("}\n"); } */ } class BitSet { vector v; public: BitSet() { } BitSet(int n): v(n) { for(int i=0;i=0 && n=0 && n v; int ambientSetSize; static int bitsSetInInt(int i) { if(BITSET_BITS_PER_WORD==32) { i=(i&0x55555555)+((i>>1)&0x55555555); i=(i&0x33333333)+((i>>2)&0x33333333); i=(i&0x0f0f0f0f)+((i>>4)&0x0f0f0f0f); i=(i)+((i>>8)); i=(i)+((i>>16)); return i&255; } int ret=0; while(i&(i-1)){i&=i-1;ret++;} return ret; } public: BitSet() { } BitSet(int n): ambientSetSize(n), v(((unsigned int)(ambientSetSize-1))/BITSET_BITS_PER_WORD+1) { for(int i=0;i=0 && n=0 && n > > table; public: Table(vector > const &l): table(l.size()) { int N=l.size(); for(int i=0;i > v(N); for(int j=0;j w(l[i].size()); for(int k=0;k > fanList; Table knownEmptyIntersectionInIntersection; Table knownNonEmptyIntersection; public: int numberOfSolvedLPs; RelationTable(vector > const &l): fanList(l), knownEmptyIntersectionInIntersection(l), knownNonEmptyIntersection(l), numberOfSolvedLPs(0) { } bool knownToIntersectTriviallyInIntersection(int fan1, int cone1, int fan2, int cone2) { assert(fan1 > fans; IntegerVector chosen; IntegerVector chosenFans; IntegerVector iterators; //just used for printing IntegerVector nCandidates; //just used for printing BitSet usedFans; int numberOfUsefulCalls; int totalNumberOfCalls; HalfOpenConeProcessor &processor; bool intervalSet; int intervalLow,intervalHigh; public: RelationTable table; RecursionData(vector > const &fans_, HalfOpenConeProcessor &processor_): table(fans_), fans(fans_), chosen(fans_.size()), chosenFans(fans_.size()), usedFans(fans_.size()), iterators(fans_.size()), nCandidates(fans_.size()), numberOfUsefulCalls(0), totalNumberOfCalls(0), processor(processor_), intervalSet(false) { } void setInterval(int lo, int hi) { intervalLow=lo; intervalHigh=hi; intervalSet=true; } // HalfOpenConeList ret; bool randBool()const { return 0; static int i; i++; return (i&3)==0; } BitSet computeCandidates(int index, int fanNumber) { /* BitSet nonCandidates(fans[fanNumber].size()); for(int i=0;iindex){debug<<"Payne's trick with index:"<1) { smallest=1000000; bx=-1; by=-1; for(int x=0;x=intervalHigh) { cerr << "SKIPPING CONE "<=current.lifted.dimension()-1)//Payne's trick { bool s=rek(index+1,next); success|=s; } // else //Payne's trick // cerr<<"Payne trick at level "< > L2; vector indicesOfNonUsedFans; vector > indicesOfCones; { for(int i=0;i L; indicesOfCones.push_back(vector()); for(int j=0;j > const &fans2, vector parentList) { int freeLPs=0; HalfOpenConeProcessorVoid dummy; RecursionData data2(fans2,dummy); data2.completeTable(); data2.transitiveClosure(); assert(fans.size()==fans2.size()); assert(fans.size()==parentList.size()); // data2.table.print(); for(int f1=0;f1 > fullDimFanList; vector > coDimOneFanList; vector parents(g.size()); // AsciiPrinter(Stderr) << g; // fprintf(Stderr,"GSIZE:%i\n",g.size()); { int I=0; for(PolynomialSet::const_iterator i=g.begin();i!=g.end();i++) { HalfOpenConeList l,lf; buildFanFromPolynomial(*i, &lf, &l, &(parents[I]),restrictingCone); log2 AsciiPrinter(Stderr).printVector(parents[I]); log2 fprintf(Stderr,"\n"); vector L; for(HalfOpenConeList::const_iterator i=l.begin();i!=l.end();i++) { L.push_back(*i); } vector F; for(HalfOpenConeList::const_iterator i=lf.begin();i!=lf.end();i++) { F.push_back(*i); } fullDimFanList.push_back(F); coDimOneFanList.push_back(L); //if(b==4)break; I++; } } RecursionData data(coDimOneFanList,processor); data.extractInformationFromFullFan(fullDimFanList,parents); // data.completeTable();//HERE // data.table.print();//HERE IntegerVectorList empty; data.rek(0, HalfOpenCone(dimension,empty,empty,empty)); log2 fprintf(Stderr,"LPs solved:%i for relation table\n",data.table.numberOfSolvedLPs); } HalfOpenConeList tropicalHyperSurfaceIntersection(int dimension, PolynomialSet const &g, HalfOpenCone *restrictingCone) { HalfOpenConeProcessorConeCollector collector; tropicalHyperSurfaceIntersection(dimension, g, restrictingCone, collector); return collector.theList; } #include "binomial.h" #include "linalg.h" //ignore last coordinate. Get rid of pivots static IntegerVectorList rewriteVectorList(IntegerVectorList const &l, list nonPivots, FieldMatrix const &A) { IntegerVectorList ret; int M=nonPivots.size(); for(IntegerVectorList::const_iterator i=l.begin();i!=l.end();i++) { IntegerVector v(M+1); v[M]=(*i)[i->size()-1]; IntegerVector u=A.canonicalize(integerVectorToFieldVector(i->subvector(0,i->size()-1),Q)).primitive(); int J=0; for(list::const_iterator j=nonPivots.begin();j!=nonPivots.end();j++,J++)v[J]=u[*j]; ret.push_back(v); } return ret; } //add pivot columns static IntegerVectorList expandVectorList(IntegerVectorList const &l, list pivots) { IntegerVectorList ret; int pivotSize=pivots.size(); for(IntegerVectorList::const_iterator i=l.begin();i!=l.end();i++) { int newSize=pivotSize+i->size(); IntegerVector v(newSize); list::const_iterator J1=pivots.begin(); int J2=0; for(int j=0;j chosen)const { chosen.push_back(dimension); PolyhedralCone newLifted=PolyhedralCone( subvectorsOfIntegerVectorList(lifted.getHalfSpaces(),chosen), subvectorsOfIntegerVectorList(lifted.getEquations(),chosen), chosen.size() ); return HalfOpenCone(chosen.size()-1,newLifted); } HalfOpenCone HalfOpenCone::rewrite(FieldMatrix const &A, list nonPivots)const { PolyhedralCone newLifted=PolyhedralCone( rewriteVectorList(lifted.getHalfSpaces(),nonPivots,A), rewriteVectorList(lifted.getEquations(),nonPivots,A), nonPivots.size()+1 ); return HalfOpenCone(nonPivots.size(),newLifted); } HalfOpenCone HalfOpenCone::rewriteExpand(list pivots, IntegerVectorList const &newEquations)const { IntegerVectorList equations=expandVectorList(lifted.getEquations(),pivots); for(IntegerVectorList::const_iterator i=newEquations.begin();i!=newEquations.end();i++) { IntegerVector v(i->size()+1); for(int j=0;jlifted.print(&P); } P << "Done printing half Open cone list-----------------------------------------------------------------\n"; } static void print2(vector const &l, Printer &P) { P << "Printing half Open cone list---------------------------------------------------------------\n"; for(vector::const_iterator i=l.begin();i!=l.end();i++) { i->lifted.print(&P); } P << "Done printing half Open cone list----------------------------------------------------------------!\n"; } static IntegerVectorList liftEquations(IntegerVectorList const &l, FieldMatrix const &B) { IntegerVectorList ret; list nonPivots=B.nonPivotColumns(); for(IntegerVectorList::const_iterator i=l.begin();i!=l.end();i++) { FieldVector I=integerVectorToFieldVector(i->subvector(0,i->size()-1),Q); IntegerVector v(B.getWidth()+1); FieldVector v2(Q,B.getWidth()); for(int j=0;jsize()-1]; ret.push_back(v); } return ret; } HalfOpenCone liftEquations(HalfOpenCone const &c, FieldMatrix const &B) { PolyhedralCone newCone=PolyhedralCone( liftEquations(c.lifted.getHalfSpaces(),B), liftEquations(c.lifted.getEquations(),B), B.getWidth()+1 ); return HalfOpenCone(B.getWidth(),newCone); } /* Use full for transforming the cone back into original coordinates*/ class HalfOpenConeProcessorAffineChange : public HalfOpenConeProcessor { IntegerVectorList interiorPoints; HalfOpenConeProcessor &parent; list pivots; IntegerVectorList newEquations; FieldMatrix B; public: HalfOpenConeProcessorAffineChange(HalfOpenConeProcessor &parent_, list const &pivots_, IntegerVectorList const &newEquations_, FieldMatrix const &B_): parent(parent_), pivots(pivots_), newEquations(newEquations_), B(B_) { if(parent_.savePartialResult)setSave(); } void process(HalfOpenCone const &c, IntegerVector const &chosenFans, IntegerVector const &chosenCone) { HalfOpenCone c2=liftEquations(c.rewriteExpand(pivots,newEquations),B); parent.process(c2,chosenFans,chosenCone); } }; //HalfOpenConeList void tropicalHyperSurfaceIntersectionInSubspace(int dimension, PolynomialSet const &G, HalfOpenCone *restrictingCone, HalfOpenConeProcessor &processor, int intervalLow, int intervalHigh) { /* Removing the lineality space. (This could be carried out on the level of polyhedra, which may or may not be more efficient.) We first find generators for the linalityspace, write them as rows of a matrix B. We reduce B and wish to ignore the coordinates whose columns contains a pivot. Afterwards we need to expand the inequalities/equations to the entire space. The matrix B tels us how to project to lowerdimensional space (by taking normals forms). The equations are gotten as the pull-back of the lower dimensional equations by this normal form map. */ log2 cerr<<"Projecting Newton polytopes modulo the homogeneity space."; int N=G.getRing().getNumberOfVariables(); IntegerVectorList w=wallInequalities(G); FieldMatrix W=integerMatrixToFieldMatrix(rowsToIntegerMatrix(w,N),Q); if(restrictingCone) { PolyhedralCone temp=restrictingCone->closure(); W=combineOnTop(combineOnTop(W, integerMatrixToFieldMatrix(rowsToIntegerMatrix(temp.getEquations(),N),Q)), integerMatrixToFieldMatrix(rowsToIntegerMatrix(temp.getHalfSpaces(),N),Q)); } FieldMatrix B=W.reduceAndComputeKernel(); B.reduce(); list BNonPivots=B.nonPivotColumns(); PolynomialRing R(G.getRing().getField(),BNonPivots.size()); PolynomialSet g=G.embeddedInto(R,&BNonPivots); HalfOpenCone restrictedConeNew(0,PolyhedralCone(1)); if(restrictingCone) { restrictedConeNew=restrictingCone->withChosenCoordinates(BNonPivots); restrictingCone=&restrictedConeNew; } log2 cerr<<"Done projecting Newton polytopes modulo the homogeneity space."; /* Now do the computation with the new set of polynomials. */ /* Here follows restriction to subspace cut out by the binomials. */ log2 cerr<<"Restricting to subspace determined by binomials and computing tropical hypersurfaces."; int n=g.getRing().getNumberOfVariables(); IntegerVectorList equations; if(restrictingCone)//add those from the restricting cone { equations=restrictingCone->shrink(restrictingCone->lifted.getEquations()); } int numberOfNonBinomials=0; for(PolynomialSet::const_iterator i=g.begin();i!=g.end();i++) { if(i->numberOfTerms()==2) equations.push_back(binomialToIntegerVector(*i)); else numberOfNonBinomials++; } FieldMatrix A=integerMatrixToFieldMatrix(rowsToIntegerMatrix(equations,n),Q); int npivots=A.reduceAndComputeRank(); // Coordinates to remove are those corresponding to pivots // We want to rewrite inequalities without the non-pivots // Unfortunatetly we need to compute the fans first // AsciiPrinter(Stderr)< nonPivots=A.nonPivotColumns(); // log0 cerr<<"Coordinates left "< > fullDimFanList; vector > coDimOneFanList; vector parents(numberOfNonBinomials); list pivots=A.pivotColumns(); int I=0; for(PolynomialSet::const_iterator i=g.begin();i!=g.end();i++) if(i->numberOfTerms()!=2) { log2 cerr << I; HalfOpenConeList l,lf; log2 cerr<< "Building fan"< L; for(HalfOpenConeList::const_iterator i=l.begin();i!=l.end();i++) L.push_back(i->rewrite(A,nonPivots)); vector F; for(HalfOpenConeList::const_iterator i=lf.begin();i!=lf.end();i++) F.push_back(i->rewrite(A,nonPivots)); fullDimFanList.push_back(F); coDimOneFanList.push_back(L); log2 cerr<< "Done Building fan"<rewriteExpand(pivots,newEquations)); ret.push_back(liftEquations(i->rewriteExpand(pivots,newEquations),B)); } return ret; */ } PolyhedralFan faceComplexOfCone(HalfOpenCone &c) { PolyhedralFan ret(c.dimension); list h; c.splitIntoRelativelyOpenCones(h); for(list::iterator i=h.begin();i!=h.end();i++) { PolyhedralCone temp=i->closure(); temp.canonicalize(); ret.insert(temp); } return ret; } bool operator<(HalfOpenCone const &a, HalfOpenCone const &b) { return a.lifted > polynomialSetToHalfOpenCones(PolynomialSet const &g) { vector > coDimOneFanList; { int I=0; for(PolynomialSet::const_iterator i=g.begin();i!=g.end();i++) { HalfOpenConeList l; PolynomialSet A(g.getRing()); A.push_back(*i); A.markAndScale(LexicographicTermOrder()); PolyhedralCone h=homogeneitySpace(A); h.canonicalize(); IntegerVectorList equations=h.getEquations(); for(IntegerVectorList::const_iterator j=equations.begin();j!=equations.end();j++) { IntegerVectorList eq2; eq2.push_back(*j); HalfOpenCone C(j->size(),eq2,IntegerVectorList(),IntegerVectorList()); l.push_back(C); } vector L; for(HalfOpenConeList::const_iterator i=l.begin();i!=l.end();i++) { debug<<"----"<lifted.getEquations(); L.push_back(*i); } coDimOneFanList.push_back(L); debug<<"\n\n"; I++; } } return coDimOneFanList; } /** * Similar to polynomialSetToHalfOpenCones(), but here the polynomial is allowed to have repeated exponent vectors. * This, however, is not allowed by the Polynomial class. Therefore we use a list of lists of expnonent vectors. * Here d is the size of each exponent vector. */ static vector > exponentVectorsToHalfOpenCones(list > const &g, int d) { vector > coDimOneFanList; { int I=0; for(list >::const_iterator i=g.begin();i!=g.end();i++) { HalfOpenConeList l; IntegerVectorList homogeneitySpaceGenerators; for(list::const_iterator j=i->begin();j!=i->end();j++)homogeneitySpaceGenerators.push_back(*j-i->front()); //debug<size(),eq2,IntegerVectorList(),IntegerVectorList()); l.push_back(C); } vector L; for(HalfOpenConeList::const_iterator i=l.begin();i!=l.end();i++) { // debug<<"----"<lifted.getEquations(); L.push_back(*i); } coDimOneFanList.push_back(L); //debug<<"\n\n"; I++; } } return coDimOneFanList; } bool hasMixedCellOfDimension(PolynomialSet const &g, int D, int *maximalSeen, IntegerVectorList *affineSpanGenerators) { if(maximalSeen)*maximalSeen=-1; vector > coDimOneFanList=polynomialSetToHalfOpenCones(g); // vector > coDimOneFanList=exponentVectorsToHalfOpenCones(g,d); SingleSubspaceProcessor p(D); RecursionData data(coDimOneFanList,p); IntegerVectorList empty; data.rek(0, HalfOpenCone(g.getRing().getNumberOfVariables(),empty,empty,empty)); log2 fprintf(Stderr,"LPs solved:%i for relation table\n",data.table.numberOfSolvedLPs); if(maximalSeen)*maximalSeen=p.getMaximalDimensionFound(); // debug<push_back(c.getEquations().front()); } } return p.success(); } bool hasMixedCellOfDimension(list > const &g, int d, int D, int *maximalSeen, IntegerVectorList *affineSpanGenerators) { if(maximalSeen)*maximalSeen=-1; // vector > coDimOneFanList=polynomialSetToHalfOpenCones(g); vector > coDimOneFanList=exponentVectorsToHalfOpenCones(g,d); SingleSubspaceProcessor p(D); RecursionData data(coDimOneFanList,p); IntegerVectorList empty; data.rek(0, HalfOpenCone(/*g.getRing().getNumberOfVariables()*/d,empty,empty,empty)); log2 fprintf(Stderr,"LPs solved:%i for relation table\n",data.table.numberOfSolvedLPs); if(maximalSeen)*maximalSeen=p.getMaximalDimensionFound(); //debug<push_back(c.getEquations().front()); } } return p.success(); } /* * Could this be a bug in gcc 4.4.3? It is impossible to overload hasMixedCellOfDimension() to take only * two parameters with value =0 for the remaining. Also, below the cast of 0 cannot be avoided. */ //bool hasMixedCellOfDimension2(PolynomialSet const &g, int D) bool hasMixedCellOfDimension2(list > const &g, int d, int D) { return hasMixedCellOfDimension(g,d,D,0, (IntegerVectorList*)0); } /* This routine takes a choice of vectors from the linear affine span of each of the newton polytopes * of elements in g, and produces a choice of monomial pairs for each element in g with the property that * the dimension of the minkowskisum of the input vectors is smaller than or equal to the dimension of the minkowski sum of * the output vectors. The output is represented by specifying a 0 for each selected monomial and a 1 * otherwise. */ IntegerVector subspaceChoiceToMonomialPairChoice(PolynomialSet const &g, IntegerVectorList vectors) { int numberOfMonomials=0; for(PolynomialSet::const_iterator i=g.begin();i!=g.end();i++)numberOfMonomials+=i->numberOfTerms(); IntegerVector ret=IntegerVector::allOnes(numberOfMonomials); int monomialIndex=0; IntegerVectorList::iterator I=vectors.begin(); for(PolynomialSet::const_iterator i=g.begin();i!=g.end();i++,I++) { assert(i->numberOfTerms()>1); IntegerVectorList Icomplement; for(IntegerVectorList::const_iterator J=vectors.begin();J!=vectors.end();J++)if(J!=I)Icomplement.push_back(*J); Subspace Ic(Icomplement); if(Ic.contains(*I)) { // It does not matter which pair we choose ret[monomialIndex]=0; ret[monomialIndex+1]=0; TermMap::const_iterator a=i->terms.begin(); TermMap::const_iterator b=i->terms.begin();b++; *I=a->first.exponent-b->first.exponent; } else { int A=0; for(TermMap::const_iterator a=i->terms.begin();a!=i->terms.end();a++,A++) { int B=0; for(TermMap::const_iterator b=i->terms.begin();b!=a;b++,B++) { if(!Ic.contains(a->first.exponent-b->first.exponent)) { ret[monomialIndex+A]=0; ret[monomialIndex+B]=0; *I=a->first.exponent-b->first.exponent; goto done; } } } assert(0); done:; } monomialIndex+=i->numberOfTerms(); } return ret; } /* This routine takes a choice of vectors from the linear affine span of each of the newton polytopes * of elements in g, and produces a choice of monomial pairs for each element in g with the property that * the dimension of the minkowskisum of the input vectors is smaller than or equal to the dimension of the minkowski sum of * the output vectors. The output is represented by specifying a 0 for each selected monomial and a 1 * otherwise. */ IntegerVector subspaceChoiceToMonomialPairChoice(list > const &g, IntegerVectorList vectors) { int numberOfMonomials=0; for(list >::const_iterator i=g.begin();i!=g.end();i++)numberOfMonomials+=i->size(); IntegerVector ret=IntegerVector::allOnes(numberOfMonomials); int monomialIndex=0; IntegerVectorList::iterator I=vectors.begin(); for(list >::const_iterator i=g.begin();i!=g.end();i++,I++) { assert(i->size()>1); IntegerVectorList Icomplement; for(IntegerVectorList::const_iterator J=vectors.begin();J!=vectors.end();J++)if(J!=I)Icomplement.push_back(*J); Subspace Ic(Icomplement); if(Ic.contains(*I)) { // It does not matter which pair we choose ret[monomialIndex]=0; ret[monomialIndex+1]=0; IntegerVectorList::const_iterator a=i->begin(); IntegerVectorList::const_iterator b=i->begin();b++; *I=*a-*b; } else { int A=0; for(IntegerVectorList::const_iterator a=i->begin();a!=i->end();a++,A++) { int B=0; for(IntegerVectorList::const_iterator b=i->begin();b!=a;b++,B++) { if(!Ic.contains(*a-*b)) { ret[monomialIndex+A]=0; ret[monomialIndex+B]=0; *I=*a-*b; goto done; } } } assert(0); done:; } monomialIndex+=i->size(); } return ret; } bool nonEmptyStableIntersection(PolynomialSet const &g) { // return hasMixedCellOfDimension2(g,g.getRing().getNumberOfVariables()-g.size()); return hasMixedCellOfDimension2(g.exponents(),g.getRing().getNumberOfVariables(),g.getRing().getNumberOfVariables()-g.size()); } int coDimensionOfResultantVariety(PolynomialSet const &g, IntegerVector *choice) { int max; IntegerVectorList span; hasMixedCellOfDimension(g.exponents(),g.getRing().getNumberOfVariables(),1000000,&max,&span); // hasMixedCellOfDimension(g,1000000,&max,&span); // debug< > const &g, int d, IntegerVector *choice) { int max; IntegerVectorList span; hasMixedCellOfDimension(g,d,1000000,&max,&span); // debug< /** @brief A linear programming problem. This class represents linear programming problems of the form max(w,x) subject to Ax<=b. Or rather subject to A_ix<=b_i + epsilon^i. Notice that such perturbed system, if feassible, is fulldimensional. The problems can be stated over any ordered Field. The class has a state represented by the basis basis and vector x which first must be set by calling setCurrentBasis() or... A basis can only be set if the system is feassible. Afterwards step() can be called repeatedly until an optimal solution is found or the problem turns out to be unbounded. TODO: Anti-cycling rule goes wrong in this implementation. Fix this. */ class FieldLP { Field theField; FieldMatrix A; FieldVector b; FieldVector w; FieldVector x; set basis; static FieldVector subvector(FieldVector const &v, set const &b); static FieldMatrix submatrix(FieldMatrix const &m, set const &b); FieldVector edgeDirection(int i)const; bool isImprovingDirection(int i)const; FieldElement improvement(int i, int &newBasisMember)const; public: FieldLP(FieldMatrix const &A_, FieldVector const &b_); FieldVector basisToPoint(set const &basis)const; void setObjectiveFunction(FieldVector const &w_); void setCurrentBasis(set const &basis_); FieldMatrix computeLinealitySpace(); FieldLP buildLPForFeasibilityCheck(); void print(Printer &P)const; int step(); bool findFeasibleBasis(); FieldLP withNoLineality(); }; #endif gfan0.8beta/src/subspace.h0000664000175000017500000000254015177170257015151 0ustar andersanders#ifndef SUBSPACE_H_INCLUDED #define SUBSPACE_H_INCLUDED #include "vektor.h" #include "polynomial.h" #include "linalg.h" Polynomial vectorToPolynomial(PolynomialRing const &r, IntegerVector const &v); /** @brief A subspace of Q^n. An object of this class represents a linear subspace of Q^n. All functionality is already available in the class FieldMatrix. However, the Subspace class is different in two ways: a Subspace cannot be changed after construction and the Subspace class provides operator< for sorting and distinguishing mathematical subspaces. */ class Subspace { int n;//ambient dimension // PolynomialSet basis; FieldMatrix basis2; IntegerVectorList integerRep;//REMOVE THIS public: /** Constructs a subspace given a generating set. @param generators generators for the subspace. @param ambientDimension the dimension of the ambient space. This number must equal the sizes of the vectors in generators. */ Subspace(IntegerVectorList const &generators, int ambientDimension=-1); bool contains(IntegerVector const &v)const; int dimension(); friend Subspace sum(Subspace const &a, Subspace const &b); int ambientDimension()const; IntegerVectorList getRepresentation()const; IntegerVector canonicalizeVector(IntegerVector const &v)const; bool operator<(Subspace const &b)const; }; #endif gfan0.8beta/src/app_test.cpp0000664000175000017500000024133415177170257015524 0ustar andersanders#include #include #include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "termorder.h" #include "ep_standard.h" #include "ep_xfig.h" #include "polyhedralcone.h" #include "gfanapplication.h" #include "saturation.h" #include "field_rationals.h" #include "field_zmodpz.h" #include "field_rationalfunctions.h" #include "symmetry.h" #include "linalg.h" #include "fieldlp.h" #include "integer.h" #include "polynomialgcd.h" #include "packedmonomial.h" #include "gfanlib_zcone.h" #include "gfanlib_tableau.h" #include "gfanlib_hypersurfaceintersection.h" #include "gfanlib_circuittableint.h" #include "gfanlib_mixedvolume.h" #include "lll.h" #include "gfanlib_circuittableinteger.h" using namespace gfan; /*using gfan::CircuitTableInt32; using gfan::IntMatrix; using gfan::Cone; using namespace gfan::MixedVolumeExamples; */ //template class gfan::Vector; //template class gfan::Vector; //template class gfan::Matrix; //template class gfan::Matrix; class TestApplication : public GFanApplication { StringOption testSuiteFolderOption; StringOption executableOption; StringOption developerTestOption; public: bool includeInDefaultInstallation() { return false; } const char *helpText() { return "This runs the test suite and checks against the stored result. If no result exists, it is generated.\n"; } TestApplication(): testSuiteFolderOption("--suite","Specify the folder which contains the test suite.","testsuite"), executableOption("--gfan","Specify name of gfan executable to test.","./gfan"), developerTestOption("--dev", "Specify name of particular kind of test.","testsuite") { developerTestOption.hide(); registerOptions(); } const char *name() { return "_test"; } int testGCD() { PolynomialRing r=StringParser("Q[p126,p125,p124,p123,p027,p026,p025,p024,p023,p017,p016,p015,p014,p013,p012]").parsePolynomialRing(); // Crashes (when linked with Singular) // Polynomial p=StringParser("-p126*p027*p026*p015^2+p125*p026*p025*p017*p016-p125*p026^2*p017*p015-p125*p027*p025*p016^2+p125*p027*p026*p016*p015-p126*p025^2*p017*p016+p126*p026*p025*p017*p015+p126*p027*p025*p016*p015").parsePolynomial(r); // Polynomial q=StringParser("p126*p027*p026*p025*p016*p015*p014-p124*p026*p025^2*p017*p016^2+2*p124*p026^2*p025*p017*p016*p015-p124*p026^3*p017*p015^2+p124*p027*p025^2*p016^3-2*p124*p027*p026*p025*p016^2*p015+p124*p027*p026^2*p016*p015^2+p125*p026*p025*p024*p017*p016^2-p125*p026^2*p024*p017*p016*p015-p125*p026^2*p025*p017*p016*p014+p125*p026^3*p017*p015*p014-p125*p027*p025*p024*p016^3+p125*p027*p026*p024*p016^2*p015+p125*p027*p026*p025*p016^2*p014-p125*p027*p026^2*p016*p015*p014-p126*p026*p025*p024*p017*p016*p015+p126*p026*p025^2*p017*p016*p014+p126*p026^2*p024*p017*p015^2-p126*p026^2*p025*p017*p015*p014+p126*p027*p025*p024*p016^2*p015-p126*p027*p025^2*p016^2*p014-p126*p027*p026*p024*p016*p015^2").parsePolynomial(r); // Crashes (even when not linked to Singular) Polynomial p=StringParser("-p126*p027*p026*p015^2*p014+p124*p025^2*p017*p016^2-2*p124*p026*p025*p017*p016*p015+p124*p026^2*p017*p015^2+p125*p026*p025*p017*p016*p014-p125*p026^2*p017*p015*p014-p125*p027*p025*p016^2*p014+p125*p027*p026*p016*p015*p014-p126*p025^2*p017*p016*p014+p126*p026*p025*p017*p015*p014+p126*p027*p025*p016*p015*p014").parsePolynomial(r); Polynomial q=StringParser("p126*p027*p026*p025*p016*p015*p014-p124*p026*p025^2*p017*p016^2+2*p124*p026^2*p025*p017*p016*p015-p124*p026^3*p017*p015^2+p124*p027*p025^2*p016^3-2*p124*p027*p026*p025*p016^2*p015+p124*p027*p026^2*p016*p015^2+p125*p026*p025*p024*p017*p016^2-p125*p026^2*p024*p017*p016*p015-p125*p026^2*p025*p017*p016*p014+p125*p026^3*p017*p015*p014-p125*p027*p025*p024*p016^3+p125*p027*p026*p024*p016^2*p015+p125*p027*p026*p025*p016^2*p014-p125*p027*p026^2*p016*p015*p014-p126*p026*p025*p024*p017*p016*p015+p126*p026*p025^2*p017*p016*p014+p126*p026^2*p024*p017*p015^2-p126*p026^2*p025*p017*p015*p014+p126*p027*p025*p024*p016^2*p015-p126*p027*p025^2*p016^2*p014-p126*p027*p026*p024*p016*p015^2").parsePolynomial(r); // Finds factor // Polynomial p=StringParser("-p027*p026*p016*p015-p026*p025*p017*p016+p026^2*p017*p015+p027*p025*p016^2").parsePolynomial(r); // Polynomial q=StringParser("p126*p027*p025*p016*p014+p124*p026*p025*p017*p016-p124*p026^2*p017*p015-p124*p027*p025*p016^2+p124*p027*p026*p016*p015-p125*p026*p024*p017*p016+p125*p026^2*p017*p014+p125*p027*p024*p016^2-p125*p027*p026*p016*p014+p126*p026*p024*p017*p015-p126*p026*p025*p017*p014-p126*p027*p024*p016*p015").parsePolynomial(r); // Finds only 1 as factor // Polynomial p=StringParser("-p026*p015+p025*p016").parsePolynomial(r); // Polynomial q=StringParser("p126*p027*p025*p016*p014+p124*p026*p025*p017*p016-p124*p026^2*p017*p015-p124*p027*p025*p016^2+p124*p027*p026*p016*p015-p125*p026*p024*p017*p016+p125*p026^2*p017*p014+p125*p027*p024*p016^2-p125*p027*p026*p016*p014+p126*p026*p024*p017*p015-p126*p026*p025*p017*p014-p126*p027*p024*p016*p015").parsePolynomial(r); Polynomial g=polynomialGCD(p,q); debug< randomMatrix(int h, int w) { gfan::Matrix ret(h,w); for(int i=0;i randomMatrix2(int h, int w) { gfan::Matrix ret(h,w); for(int i=0;i gfan::Matrix convertMatrix(IntMatrix const &m) { gfan::Matrix ret(m.getHeight(),m.getWidth()); for(int i=0;i > convertMatrixVectorT(vector const &v) { vector > ret; for(int i=0;i(v[i]).transposed()); } return ret; } IntMatrix rowsToIntegerMatrix2(IntegerVectorList const &l)//taken from app_mixedvolume.cpp { assert(l.size()); IntMatrix ret(l.size(),l.front().size()); IntegerVectorList::const_iterator I=l.begin(); for(int i=0;i int numberOfEdges(gfan::Matrix const &A) { int ret=0; for(int i=0;i B(0,A.getWidth()); for(int k=0;k(B.transposed()); ret+=C.getDimension()==C.getAmbientDimension()-1; } std::cerr< sPolys; for(PolynomialSet::const_iterator i=ret.begin();i!=ret.end();i++) for(PolynomialSet::const_iterator j=ret.begin();j!=i;j++) { if(!i->checkMarking(targetOrder)||!j->checkMarking(targetOrder)) { if(!relativelyPrime(getInitialExponent(*j,targetOrder),getInitialExponent(*i,targetOrder))) sPolys.push_back(SP(*i,*j,targetOrder)); } } ret.mark(targetOrder); while(!sPolys.empty()) { AsciiPrinter P(Stderr); std::cerr<<"ret:\n"; {P.printPolynomialSet(ret);} std::cerr<<"SPO-----------------\n"<200){std::cerr<<"SKiptest\n";return PolynomialSet(start.getRing());} Polynomial p=sPolys.back();sPolys.pop_back(); auto n=division(p,ret,targetOrder); n.mark(targetOrder); std::cerr<<"Remainder";P.printPolynomial(n);std::cerr<<"\n"; if(!n.isZero()) { if(!n.checkMarking(startOrder)) { std::cerr<<"Orders do not agree so we produce all spolys\n"; //add all spolys for(auto &f:ret) // if(!relativelyPrime(getInitialExponent(n,targetOrder),getInitialExponent(f,targetOrder))) sPolys.push_back(SP(f,n,targetOrder)); } else { std::cerr<<"Orders agree so we produce only some s-polys \n"; for(auto &f:ret) if(!f.checkMarking(startOrder)) // if(!relativelyPrime(getInitialExponent(n,targetOrder),getInitialExponent(f,targetOrder))) sPolys.push_back(SP(f,n,targetOrder)); //add some spolys } ret.push_front(n); } } return ret; } int testGfanLib() { gfan::Integer v(3221); v*=1000000; v+=225472; gfan::Integer u(-2147483648); v+=u; gfan::Integer temp((signed long int)0); #if 0 if(1) { /* 1 1 1 0 -1 -1 -1 0 0 1 -1 0 0 -1 1 0 1 0 -1 1 1 -1 0 0 -1 1 0 0 1 0 -1 1*/ gfan::Matrix A(9,4); int i=0; A[i][0]= 1;A[i][1]= 1;A[i][2]= 1;A[i][3]= 0;i++; A[i][0]=-1;A[i][1]=-1;A[i][2]=-1;A[i][3]= 0;i++; A[i][0]= 0;A[i][1]= 1;A[i][2]=-1;A[i][3]= 0;i++; A[i][0]= 0;A[i][1]=-1;A[i][2]= 1;A[i][3]= 0;i++; A[i][0]= 1;A[i][1]= 0;A[i][2]=-1;A[i][3]= 1;i++; A[i][0]= 1;A[i][1]=-1;A[i][2]= 0;A[i][3]= 0;i++; A[i][0]=-1;A[i][1]= 1;A[i][2]= 0;A[i][3]= 0;i++; A[i][0]= 1;A[i][1]= 0;A[i][2]=-1;A[i][3]= 1;i++; A[i][0]= 0;A[i][1]= 0;A[i][2]= 0;A[i][3]=-1;i++; Cone C1(A); std::cerr< A(9,4); int i=0; A[i][0]= 1;A[i][1]= 1;A[i][2]= 1;A[i][3]= 0;i++; A[i][0]=-1;A[i][1]=-1;A[i][2]=-1;A[i][3]= 0;i++; A[i][0]= 0;A[i][1]= 1;A[i][2]=-1;A[i][3]= 0;i++; A[i][0]= 0;A[i][1]=-1;A[i][2]= 1;A[i][3]= 0;i++; A[i][0]= 1;A[i][1]= 0;A[i][2]=-1;A[i][3]= 1;i++; A[i][0]= 1;A[i][1]=-1;A[i][2]= 0;A[i][3]= 0;i++; A[i][0]=-1;A[i][1]= 1;A[i][2]= 0;A[i][3]= 0;i++; A[i][0]= 1;A[i][1]= 0;A[i][2]=-1;A[i][3]= 1;i++; A[i][0]= 0;A[i][1]= 0;A[i][2]= 0;A[i][3]=-1;i++; Cone C1(A.transposed()); std::cerr< A=convertMatrix(rowsToIntegerMatrix2(temp)); Cone C1(A.transposed()); std::cerr< A=convertMatrix(rowsToIntegerMatrix2(temp)); Cone C1(A); auto linealitySpace=C1.getLinealitySpace(); auto rays=C1.getRays(); return 0; } if(0) { auto v=StringParser("(13,5,4)").parseIntegerVector(); WeightReverseLexicographicTermOrder T(v); FileParser P(Stdin); auto L=P.parsePolynomialSetListWithRing(); for(auto &g:L) if(g.size()<=3) { std::cerr<<"Trying:\n"; AsciiPrinter(Stderr).printPolynomialSet(g,true); PolynomialSet h(g.getRing()); for(auto &f:g) { auto M=f.getMarked().m; Polynomial F(g.getRing()); for(auto &t:f.terms) if(!T(t.first.exponent,M.exponent)) F=F+Polynomial(Term(t.second,t.first)); h.push_back(F); } std::cerr<<"Truncation:\n"; AsciiPrinter(Stderr).printPolynomialSet(h,true); buchberger(&h,T); minimize(&h); autoReduce(&h,T); std::cerr< A=convertMatrix(rowsToIntegerMatrix2(temp)); Cone C1(A.submatrixColumns(0,6),A.submatrixColumns(6,9)); // std::cerr<<"DDD"< v; std::stringstream s("(1,2,3,43)"); s>>v; std::cerr<::readMatrix(s,3)<<"\n"; //std::cerr<::readMatrix(s,3)<<"\n"; // std::cerr<::readMatrix(s,3)<<"\n"; gfan::GeneratedCone C(gfan::Matrix::readMatrix(s,3)); std::stringstream A; C.save(A); auto As=A.str(); std::cerr<<"AS"<::load(B); C2.save(std::cerr); } return 0; } // typedef gfan::CircuitTableInteger typ; typedef gfan::CircuitTableInt32 typ; // typedef gfan::CircuitTableInt64 typ; IntegerVectorList temp=StringParser( "{(1,1,1)," "(1,1,-1)," "(1,-1,1)}" ).parseIntegerVectorList(); gfan::Matrix A=convertMatrix(rowsToIntegerMatrix2(temp)); IntegerVectorList temp2=StringParser( "{(1,-1,-1)}" ).parseIntegerVectorList(); gfan::Matrix A2=convertMatrix(rowsToIntegerMatrix2(temp2)); HalfOpenCone C1(A.transposed(),gfan::Matrix(3,0),A2.transposed()); std::cerr< M(1,1); M[0][0]=B; std::cerr<(M); std::cerr<(N); std::cerr<(rowsToIntegerMatrix2(StringParser("{(0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)," "(0,-2,-2,-2,-2,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0)," "(0,-2,-2,-2,-2,2,2,2,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1)," "(0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)," "(0,0,-2,-2,0,2,2,0,0,0,0,1,0,0,-1,-1,0,-1,-1,-1)," "(0,0,-2,0,-2,2,0,2,0,0,0,0,1,0,-1,0,-1,-1,-1,-1)," "(0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)," "(0,0,0,-2,-2,0,2,2,0,0,0,0,0,1,0,-1,-1,-1,-1,-1)," "(0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)," "(0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0)," "(0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0)," "(0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0)," "(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1)," "(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1)," "(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0)," "(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0)," "(0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0)," "(0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0)," "(0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0)," "(0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0)," "(0,0,0,2,2,0,-2,-2,0,-1,-1,-1,-1,-1,0,0,0,0,0,1)," "(0,0,2,0,2,-2,0,-2,-1,0,-1,-1,-1,-1,0,0,0,0,1,0)," "(0,0,2,2,0,-2,-2,0,-1,-1,0,-1,-1,-1,0,0,0,1,0,0)," "(0,8,8,8,8,0,0,0,-4,-4,-4,5,8,8,12,12,0,9,0,0)," "(0,8,8,8,8,0,0,0,-4,-4,-4,8,5,8,12,0,12,0,9,0)," "(0,8,8,8,8,0,0,0,-4,-4,-4,8,8,5,0,12,12,0,0,9)," "(0,8,8,8,8,0,0,0,-4,5,8,-4,-4,8,12,9,0,12,0,0)," "(0,8,8,8,8,0,0,0,-4,8,5,-4,-4,8,12,0,9,0,12,0)," "(0,8,8,8,8,0,0,0,-4,8,8,-4,-4,5,0,0,0,12,12,9)," "(0,8,8,8,8,0,0,0,5,-4,8,-4,8,-4,9,12,0,12,0,0)," "(0,8,8,8,8,0,0,0,5,8,-4,8,-4,-4,9,0,12,0,12,0)," "(0,8,8,8,8,0,0,0,8,-4,5,-4,8,-4,0,12,9,0,0,12)," "(0,8,8,8,8,0,0,0,8,-4,8,-4,5,-4,0,0,0,12,9,12)," "(0,8,8,8,8,0,0,0,8,5,-4,8,-4,-4,0,9,12,0,0,12)," "(0,8,8,8,8,0,0,0,8,8,-4,5,-4,-4,0,0,0,9,12,12)}").parseIntegerVectorList())); GeneratedCone C1(A.transposed(),gfan::Matrix(A.getWidth(),0)); std::cerr<<"DIM"< > configurations; for(auto &p:g) configurations.push_back(convertMatrix(rowsToIntegerMatrix2(p.exponents()))); vector > f; //int n=3; // vector > configurations=convertMatrixVectorT(MixedVolumeExamples::cyclic(7)); // configurations.pop_back();configurations.pop_back();configurations.pop_back();//configurations.pop_back(); //We pretend that first coordinate is speciale (that it is the t parameter) int n=configurations[0].getWidth(); int nonEmptyIntersections=0; // vector edgeCounts; // for(int i=0;i used(configurations.size()); PolytopeIntersectionData data(configurations,HalfOpenCone::entireSpace(n)); gfan::Matrix strictInequalities(n,1); strictInequalities[0][0]=typ(-1); std::cerr<<"ETSEEETET\n"; ProgressCounter progress; CommonStatistics statistics; commonRefinement( {gfan::HalfOpenCone( gfan::Matrix(n,0), gfan::Matrix(n,0), strictInequalities)},used,configurations,(std::function&)>)[&f](HalfOpenCone const& c)mutable->void{f.push_back(c);},nonEmptyIntersections/*,&edgeCounts*/,data,RelationTable(data.layout),progress,&statistics,8/*8*/); assert(!f.empty()); // std::cerr<<"ABD"<getDimension();//<closure().getLinealitySpace(); auto linealitySpace=f.begin()->closure().getLinealitySpace(); RayCollector collector(f.begin()->closure().getLinealitySpace()); if(0){ vector > F; for(auto &c:f) if(!c.representedPolyhedronIsBounded()) if(!c.representedPolyhedronsRecessionConeIsContainedInNegativeHalfSpace()) F.push_back(c); f=F; } int numberOfNonEmptyHalfOpenCones=0; for(auto &c:f) { if(!c.isEmpty()) { numberOfNonEmptyHalfOpenCones++; // std::cerr<<"++++++++++++++++++++++++++++++++++++++\n"; auto rays=c.closure().getRays(); for(int i=0;i>::value,""); static_assert(std::is_nothrow_move_constructible>::value,""); static_assert(std::is_move_constructible>::value,""); // static_assert(std::is_trivially_move_constructible>::value,""); static_assert(std::is_nothrow_move_constructible>::value,""); static_assert(std::is_nothrow_move_constructible>::value,""); static_assert(std::is_nothrow_move_constructible>::value,""); static_assert(std::is_move_assignable>::value,""); static_assert(std::is_nothrow_move_constructible>::value,""); return 0; } { // typedef gfan::CircuitTableInt64 typ; // typedef gfan::CircuitTableInteger typ; typedef gfan::CircuitTableInt128 typ; std::cerr<<"Digits:"<::digits<<"\n"; std::cerr<<"Digits:"<::digits<<"\n"; std::cerr<<"Digits:"<::digits<<"\n"; std::cerr<<"Digits:"<::digits<<"\n"; std::cerr<<"Digits:"<::digits<<"\n"; { __int128 t=0; __int128 A=2; __int128 s=-4; __int128 B=1; B=(B<<127)+3; std::cerr<<"---B\n"; std::cerr<(rowsToIntegerMatrix2(L)).transposed(); auto lines=gfan::Matrix(rays.getHeight(),0); GeneratedCone C(rays,lines); std::cerr<<"Dimension of Lineality Space:"< A=convertMatrix(ex); /* gfan::Matrix A(3,2); A[1][0]=1; A[2][1]=1;*/ /*= restrictedTropicalHypersurface( gfan::HalfOpenCone( gfan::Matrix(0,3), gfan::Matrix(0,3)), A );*/ initializeCddlibIfRequired();//SEEMS TO BE REQUIRED HERE. WHERE DOES THE INITIALISATION USUALLY HAPPEN? int largest=10+2; vector halfOpenConesStatistics(largest+1); vector nonEmptyIntersectionsStatistics(largest+1); for(int k=2/*largest/*2*/;k<=largest;k++) { vector > f; vector > configurations=convertMatrixVectorT(MixedVolumeExamples::cyclic(k)); if(0) { auto temp=configurations; temp[0]=configurations[7]; temp[1]=configurations[3]; temp[2]=configurations[1]; temp[3]=configurations[5]; temp[4]=configurations[6]; temp[5]=configurations[0]; temp[6]=configurations[4]; temp[7]=configurations[2]; configurations=temp; } if(0) { auto temp=configurations; temp[0]=configurations[9]; temp[1]=configurations[4]; temp[2]=configurations[1]; temp[3]=configurations[7]; temp[4]=configurations[3]; temp[5]=configurations[5]; temp[6]=configurations[0]; temp[7]=configurations[8]; temp[8]=configurations[2]; temp[9]=configurations[6]; configurations=temp; } // while(configurations.size()>3)configurations.pop_back(); int n=configurations[0].getWidth(); std::cerr<<"n:"< edgeCounts; // for(int i=0;i used(configurations.size()); PolytopeIntersectionData data(configurations,HalfOpenCone::entireSpace(n)); //std::cerr<( gfan::Matrix(n,0), gfan::Matrix(n,0), gfan::Matrix(n,0))},used,configurations,(std::function&)>)[&f](HalfOpenCone const& c)mutable->void{f.push_back(c);},nonEmptyIntersections,/*&edgeCounts,*/data,RelationTable(data.layout),progress,&statistics,8); if(1) { Vector sum(n+1); for(auto &a:f)sum=sum+a.fVector(); std::cerr<<"F_VECTOR:"<isEmpty()); auto linealitySpace=f.begin()->closure().getLinealitySpace(); RayCollector collector(linealitySpace); for(auto &c:f) { if(!c.isEmpty()) { auto rays=c.closure().getRays(); for(int i=0;i A=randomMatrix2(4,3); Cone C(A.transposed()); std::cerr<<"------------------------------------\n"< M2(randomMatrix(4,15),true); for(int i=0;i<100;i++) { gfan::Matrix A=randomMatrix(3,3); debug< M2(A); debug< M(4,8); M[0][0]=1;M[0][1]=-1;M[0][2]=1;M[0][3]=-1;M[0][4]=1;M[0][5]=-1;M[0][6]=1;M[0][7]=-1; M[1][0]=1;M[1][1]=1;M[1][2]=-1;M[1][3]=-1;M[1][4]=1;M[1][5]=1;M[1][6]=-1;M[1][7]=-1; M[2][0]=1;M[2][1]=1;M[2][2]=1;M[2][3]=1;M[2][4]=-1;M[2][5]=-1;M[2][6]=-1;M[2][7]=-1; M[3][0]=1;M[3][1]=1;M[3][2]=1;M[3][3]=1;M[3][4]=1;M[3][5]=1;M[3][6]=1;M[3][7]=1; gfan::GeneratedCone M2(M); debug< M(3,5); M[0][0]=0;M[0][1]=0;M[0][2]=2;M[0][3]=2;M[0][4]=1; M[1][0]=1;M[1][1]=0;M[1][2]=3;M[1][3]=2;M[1][4]=1; M[2][0]=2;M[2][1]=0;M[2][2]=2;M[2][3]=0;M[2][4]=0; gfan::GeneratedCone M2(M); debug< M(2,2); M[0][0]=2; M[1][0]=1; M[1][1]=2; M[0][1]=2; gfan::Tableau M2(M,true); debug< M(3,6); M[0][0]=1; M[1][0]=0; M[2][0]=1; M[0][1]=0; M[1][1]=1; M[2][1]=1; M[0][2]=2; M[1][2]=2; M[2][2]=1; M[0][3]=5; M[1][3]=1; M[2][3]=1; M[0][4]=4; M[1][4]=0; M[2][4]=1; M[0][5]=3; M[1][5]=3; M[2][5]=3; gfan::GeneratedCone M2(M); debug<"+outputName; cerr<<"Running command:\""< subFolderNames() { #define tempName "GfAnTeMpTeStS" char command[256]; int err=system("rm " tempName); err=0;//Having err!=0 above is probably not at mistake. Rather the file did not exist. sprintf(command,"ls %s>" tempName ,testSuiteFolderOption.getValue()); err|=system(command); assert(err==0); list ret; FILE *f=fopen(tempName,"r"); assert(f); char name[256]; while(fgets(name,255,f)) { for(int i=0;i<255 && name[i];i++)if(name[i]=='\n'){name[i]=0;} if(name[0]>='0' && name[0]<='9')ret.push_back(string(testSuiteFolderOption.getValue())+"/"+string(name)); } fclose(f); return ret; } unsigned long int subTest(int32_t v) { return ((unsigned long int)0xffffffffL)&((unsigned long int)-v); } int main() { if(0) { int32_t v;//=-2147483648; cin >> v; if(v>0){} else //-2147483648 cerr<::readMatrix(cin,4); } if(strcmp(developerTestOption.getValue(),"testsuite")!=0) { // lpRationalFunctionTest(); // testRationalFunctionField(); // packedTest();return 0; // return testIntegers(); // return testGCD(); return testGfanLib(); // return testPolynomialGCD(); // return testLLL(); } else { list testFolders=subFolderNames(); list testList; for(list::const_iterator i=testFolders.begin();i!=testFolders.end();i++) { testList.push_back(TestCase(*i)); } cout<<"Number of tests to perform "< failed; int good=0; int bad=0; for(list::iterator i=testList.begin();i!=testList.end();i++) if(i->perform(executableOption.getValue())) good++; else { bad++; failed.push_back(i->folder); } cout<<"\n"; if(!failed.empty()) { cout<<"Failed tests:\n-------------\n"; for(list::iterator i=failed.begin();i!=failed.end();i++) { cout<<*i<<" FAILED!\n"; } } cout<<"Number of succesful tests "< #include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "breadthfirstsearch.h" #include "termorder.h" #include "ep_standard.h" #include "ep_xfig.h" #include "gfanapplication.h" #include "polyhedralfan.h" #include "minkowskidual.h" #include "log.h" #include "tropical_weildivisor.h" #include "field_rationals.h" #include "linalg.h" class PolytopeAlgebraApplication : public GFanApplication { public: bool includeInDefaultInstallation() // Not included since the program has not been documented and is likely not working. { return false; } const char *helpText() { return "This does some experimental computations in the polytope algebra.\n"; } PolytopeAlgebraApplication() { registerOptions(); } const char *name() { return "_polytopealgebra"; } PolyhedralFan simpleRationalFunction(PolyhedralFan const &support, IntegerVector const &withValueOne) { //D(withValueOne); int n=support.getAmbientDimension(); PolyhedralFan ret(n); for(PolyhedralFan::coneIterator i=support.conesBegin();i!=support.conesEnd();i++) if(!i->contains(withValueOne)) { PolyhedralCone temp(*i); temp.setLinearForm(IntegerVector(n)); ret.insert(temp); } else { PolyhedralCone temp(*i); IntegerVectorList rays=i->extremeRays(); IntegerVectorList lines=i->generatorsOfLinealitySpace(); FieldMatrix LFA(Q,lines.size()+rays.size(),n); FieldVector LFB(Q,lines.size()+rays.size()+n); int J=0; for(IntegerVectorList::const_iterator j=rays.begin();j!=rays.end();j++,J++) { LFA[J]=integerVectorToFieldVector(*j,Q); LFB[J]=Q.zHomomorphism((*j-withValueOne).isZero()*120); } // D(LFA); // D(LFB); FieldVector LFX=LFA.solver().canonicalize(LFB); if(LFX.subvector(0,LFX.size()-n).isZero()) { temp.setLinearForm(fieldVectorToIntegerVector(LFX.subvector(LFX.size()-n,LFX.size()))); // D(temp.getLinearForm()); } else { cerr<<"Values on cone are not linear" <> // product.printWithIndices(&debug,FPF_multiplicities|FPF_default); IntegerVector generator(E.getWidth()); int K=0; for(PolyhedralFan::coneIterator k=a.conesBegin();k!=a.conesEnd();k++,K++) { if(product.containsInSupport(k->getRelativeInteriorPoint())) generator[K]=product.coneContaining(k->getRelativeInteriorPoint()).getMultiplicity(); } generators.push_back(generator); } IntegerMatrix F=rowsToIntegerMatrix(generators,E.getWidth()); pout< #include "printer.h" #include "log.h" EnumerationFilePrinter::EnumerationFilePrinter(): initialisedFile(0), file(0), filename("") { } EnumerationFilePrinter::~EnumerationFilePrinter() { assert(file==0); } void EnumerationFilePrinter::open(string filename) { this->filename=filename; string name=filename+extension(); initialisedFile=fopen(name.c_str(),"w"); file=initialisedFile; assert(file); fprintf(Stderr,"Output file opened: \"%s\"\n",name.c_str()); onOpened(); } void EnumerationFilePrinter::open(FILE *file) { initialisedFile=0; this->file=file; assert(file); onOpened(); } void EnumerationFilePrinter::close() { onClose(); if(initialisedFile) { fclose(initialisedFile); onClosed(); initialisedFile=0; } file=0; } string EnumerationFilePrinter::extension() { return ""; } void EnumerationAlgorithm::printProgress(int step) { while(step>0) { progressCounter++; // if(!(progressCounter&4095)) // if(!(progressCounter&255)) if(!(progressCounter&15)) log2 fprintf(Stderr,"Number of Gr\"obner Bases found %i\n",progressCounter); fflush(Stderr); step--; } } //-------------------------------------- // EnumerationTargetCollector //-------------------------------------- void EnumerationTargetCollector::beginEnumeration(PolynomialSet const &g) { theList=PolynomialSetList(); } void EnumerationTargetCollector::endEnumeration() { } bool EnumerationTargetCollector::basis(const PolynomialSet &groebnerBasis) { theList.push_back(groebnerBasis); return true; } PolynomialSetList EnumerationTargetCollector::getList() { return theList; } #include "traverser_groebnerfan.h" TargetGlue::TargetGlue(EnumerationTarget &target_): target(target_) { } bool TargetGlue::process(ConeTraverser &traverser) { GroebnerFanTraverser &r=dynamic_cast(traverser); return target.basis(r.refToGroebnerBasisRepresentation()); } gfan0.8beta/src/field_rationals.cpp0000664000175000017500000006074215177170257017046 0ustar andersanders#include "field_rationals.h" #include #include #include /* Always include cstdio before gmp.h.*/ #include #include #include "lp_cdd.h" #include "printer.h" #include "timer.h" #include "log.h" #include "field_zmodpz.h" #include "rational.h" #include "gfanlib_z.h" //static Timer rationalTimer("Rational",1); #include #include int FieldElementRationalsLiving; static mutex mtx; class A{ public: A() { //mtx.lock(); } ~A() { //mtx.unlock(); } }; class FieldElementRational : public FieldElementImplementation { public: mpq_t value; FieldElementRational(FieldImplementation &a):FieldElementImplementation(a) { A aaaa; FieldElementRationalsLiving++; mpq_init(value); } FieldElementRational(FieldImplementation &a,int n_):FieldElementImplementation(a) { A aaaa; FieldElementRationalsLiving++; mpz_init_set_si(mpq_numref(value), n_); mpz_init_set_ui(mpq_denref(value), 1); } FieldElementRational(FieldImplementation &a, mpq_t *n_):FieldElementImplementation(a) { A aaaa; FieldElementRationalsLiving++; mpq_init(value); mpq_set(value,*n_); } virtual ~FieldElementRational() { A aaaa; FieldElementRationalsLiving--; mpq_clear(value); } FieldElementRational& operator=(const FieldElementRational& a) { A aaaa; assert(0); const FieldElementRational *A=(const FieldElementRational*)&a; if (this != A) { mpq_clear(value); mpz_init_set(mpq_numref(value), mpq_numref(a.value)); mpz_init_set(mpq_denref(value), mpq_denref(a.value)); } return *this; } mpq_t const *getGmpRationalTemporaryPointer()const { return &value; } bool isInteger()const { ::A aaaa; return mpz_cmp_si(mpq_denref(value),1)==0; } FieldElementImplementation *multiplierGivingInteger()const { ::A aaaa; FieldElementRational *r= new FieldElementRational(*getField()); mpz_set(mpq_numref(r->value), mpq_denref(value)); return r; } void operator*=(const FieldElementImplementation &a) { const FieldElementRational *A=(const FieldElementRational*)&a; assert(A); ::A aaaa; // TimerScope ts(&rationalTimer); mpq_mul(value,value,A->value); } void operator+=(const FieldElementImplementation &a) { const FieldElementRational *A=(const FieldElementRational*)&a; assert(A); ::A aaaa; // TimerScope ts(&rationalTimer); mpq_add(value,value,A->value); // mpq_canonicalize(value); } void madd(const FieldElementImplementation &a,const FieldElementImplementation &b) { const FieldElementRational *A=(const FieldElementRational*)&a; assert(A); const FieldElementRational *B=(const FieldElementRational*)&b; assert(B); ::A aaaa; // TimerScope ts(&rationalTimer); mpq_t temp; mpq_init(temp); mpq_mul(temp,A->value,B->value); mpq_add(value,value,temp); mpq_clear(temp); } FieldElementRational *one() const; bool isZero() const { return mpq_sgn(value)==0; } FieldElementRational *sum(const FieldElementImplementation &b)const { // TimerScope ts(&rationalTimer); const FieldElementRational *B=(const FieldElementRational*)&b; FieldElementRational *r= new FieldElementRational(*getField()); // fprintf(Stderr,"NEW\n"); A aaaa; mpq_add(r->value,value,B->value); return r; } FieldElementRational *difference(const FieldElementImplementation &b)const { // TimerScope ts(&rationalTimer); const FieldElementRational *B=(const FieldElementRational*)&b; FieldElementRational *r= new FieldElementRational(*getField()); // fprintf(Stderr,"NEW\n"); A aaaa; mpq_sub(r->value,value,B->value); return r; } FieldElementRational *negation()const { FieldElementRational *r= new FieldElementRational(*getField()); A aaaa; // fprintf(Stderr,"NEW\n"); mpq_neg(r->value,value); return r; } FieldElementImplementation *inverse()const { FieldElementRational *r= new FieldElementRational(*getField()); // fprintf(Stderr,"NEW\n"); if(isZero()) { AsciiPrinter P(Stderr); P.printString("Error inverting FieldElement: "); //P.printFieldElement(*this); P.printString(toString()); P.printString("\n"); assert(0); } A aaaa; mpq_inv(r->value,value); return r; } int sign()const { return mpq_sgn(value); } static int val(mpz_t m, int p) { int ret=0; if(p==2) { int p2Val=mpz_scan1(m,0); // assert(0); // assert(p2Val==ret); return p2Val; } while(mpz_divisible_ui_p(m,p)) { mpz_divexact_ui(m,m,p); ret++; } return ret; } int pAdicValuation(int p)const { mpq_t temp; mpq_init(temp); mpq_set(temp,value); int ret=val(mpq_numref(temp),p)-val(mpq_denref(temp),p); mpq_clear(temp); return ret; } FieldElement pAdicRemainder(Field const &ZModPZ)const { #if USESHAREDPTR int p=(dynamic_cast(ZModPZ.implementingObject.get()))->getCharacteristic(); #else int p=(dynamic_cast(ZModPZ.implementingObject))->getCharacteristic(); #endif mpz_t temp; mpz_init(temp); mpz_set(temp,mpq_numref(value)); int v=pAdicValuation(p); while(v>0){mpz_divexact_ui(temp,temp,p);v--;} FieldElement A=ZModPZ.zHomomorphism(mpz_fdiv_ui(temp,p)); mpz_set(temp,mpq_denref(value)); while(v<0){mpz_divexact_ui(temp,temp,p);v++;} FieldElement B=ZModPZ.zHomomorphism(mpz_fdiv_ui(temp,p)); mpz_clear(temp); // FieldElement A=ZModPZ.zHomomorphism(mpz_fdiv_ui(mpq_numref(value),p)); // FieldElement B=ZModPZ.zHomomorphism(mpz_fdiv_ui(mpq_denref(value),p)); assert(!B.isZero()); return A*(B.inverse()); } FieldElement modularRepresentative(Field const &ZModPZ)const { assert(isInteger()); #if USESHAREDPTR int p=(dynamic_cast(ZModPZ.implementingObject.get()))->getCharacteristic(); #else int p=(dynamic_cast(ZModPZ.implementingObject))->getCharacteristic(); #endif mpz_t temp; mpz_init(temp); mpz_set(temp,mpq_numref(value)); mpz_mod_ui(temp,temp,p); FieldElement A=ZModPZ.zHomomorphism(mpz_fdiv_ui(temp,p)); mpz_clear(temp); return A; } static string LaTeXTranslator(const string &s) { int startIndex=0; string sign; if(s[0]=='-') { sign=string("-"); startIndex=1; } int slashIndex=-1; for(int i=startIndex;iisZero(); //fprintf(Stderr,"DELETE\n"); delete temp; temp=sum(*tempOne); bool isMinusOne=temp->isZero(); //fprintf(Stderr,"DELETE\n"); delete temp; //fprintf(Stderr,"DELETE\n"); delete tempOne; if(!writeIfOne && isOne) { if(alwaysWriteSign)return std::string("+"); return std::string(""); } if(!writeIfOne && isMinusOne) return std::string("-"); #if 0 static char s[1290*1000]; // mpq_get_str(s,10,value); //// CHECK BUFFER SIZE!!!! // Changed to make code gmp 3.1.1 compatible mpz_get_str(s,10,mpq_numref(value)); //CHECK BUFFER SIZE!!!! string S(s); #endif string S=gfan::mpzToString(mpq_numref(value)); if(mpz_cmp_ui(mpq_denref(value),1)!=0) { #if 0 mpz_get_str(s,10,mpq_denref(value)); //CHECK BUFFER SIZE!!!! S=S+string("/")+string(s); #endif S=S+string("/")+gfan::mpzToString(mpq_denref(value)); } if(latexMode)S=LaTeXTranslator(S); if(alwaysWriteSign && mpq_sgn(value)!=-1) return std::string("+")+S; return S; } FieldElementRational *copy()const { FieldElementRational *r= new FieldElementRational(*getField()); // fprintf(Stderr,"NEW\n"); A aaaa; mpq_clear(r->value); mpz_init_set(mpq_numref(r->value), mpq_numref(value)); mpz_init_set(mpq_denref(r->value), mpq_denref(value)); return r; } }; bool FieldRationalsImplementation::isRationals()const { return true; } int FieldRationalsImplementation::getCharacteristic()const { return 0; } FieldRationalsImplementation::FieldRationalsImplementation() { } std::string FieldRationalsImplementation::toString()const { return std::string("Q"); } FieldElementImplementation *FieldRationalsImplementation::zHomomorphismImplementation(int n) { /* if(n==0) //NEED TO CHANGE THIS BACK SOMEHOW { static FieldElementImplementation *p; if(p==0)p=new FieldElementRational(*this,0); p->refCount++; return p; } else if(n==1) { static FieldElementImplementation *p; if(p==0)p=new FieldElementRational(*this,1); p->refCount++; return p; } else if(n==-1) { static FieldElementImplementation *p; if(p==0)p=new FieldElementRational(*this,-1); p->refCount++; return p; }*/ FieldElementImplementation *ret=new FieldElementRational(*this,n); // fprintf(Stderr,"NEW\n"); // ret->refCount++; return ret; } FieldElement FieldRationalsImplementation::zHomomorphism(int n) { // fprintf(Stderr,"NEW\n"); // return FieldElement(new FieldElementRational(*this,n)); return FieldElement(zHomomorphismImplementation(n)); } const char *FieldRationalsImplementation::name() { return "GmpRationals"; } /*FieldRationals::FieldRationals(): Field(new FieldRationalsImplementation()) { /* fprintf(Stderr,"Adding field rationals\n"); next=list; list=this; */ /* log2 fprintf(Stderr,"Initializing field Rationals\n"); } */ //FieldRationals Q; Field Q(new FieldRationalsImplementation()); FieldElementRational *FieldElementRational::one() const { // fprintf(Stderr,"NEW\n"); return new FieldElementRational(*getField(),1); } void printMpq(mpq_t value) { char s[1000]; char t[1000]; mpz_get_str(s,10,mpq_numref(value)); //CHECK BUFFER SIZE!!!! mpz_get_str(t,10,mpq_denref(value)); //CHECK BUFFER SIZE!!!! fprintf(stderr,"%s/%s ",s,t); } IntegerVector primitiveVectorOld(vector const &v) { int n=v.size(); mpq_t *point = new mpq_t [n]; for(int i=0;i const &v) { int n=v.size(); IntegerVector ret(n); mpz_t lcm; mpz_t gcd; mpz_init_set_ui(lcm, 1); mpz_init_set_ui(gcd, 0); for(int j=0;j(i); assert(i2); return &(i2->value); } double fieldElementToFloatingPoint(FieldElement const&c) { return mpq_get_d(*fieldElementToGmp(c)); } FieldElement fieldElementFromGmp(mpq_t *c) { FieldElement ret=FieldElement(new FieldElementRational(*(Q.implementingObject),c)); return ret; } FieldElement gcd(FieldElement const &a, FieldElement const &b, FieldElement &s, FieldElement &t) { mpz_t G; mpz_t S; mpz_t T; mpz_init(G); mpz_init(S); mpz_init(T); mpz_gcdext(G, S, T, mpq_numref(*fieldElementToGmp(a)), mpq_numref(*fieldElementToGmp(b))); mpq_t Grat; mpq_init(Grat); mpq_set_z(Grat, G); mpq_t Srat; mpq_init(Srat); mpq_set_z(Srat, S); mpq_t Trat; mpq_init(Trat); mpq_set_z(Trat, T); FieldElement ret=fieldElementFromGmp(&Grat); s=fieldElementFromGmp(&Srat); t=fieldElementFromGmp(&Trat); mpq_clear(Trat); mpq_clear(Srat); mpq_clear(Grat); mpz_clear(T); mpz_clear(S); mpz_clear(G); return ret; } IntegerVector toIntegerVector(vector const &v) { int n=v.size(); mpq_t *point = new mpq_t [n]; for(int i=0;ivalue); } void operator+=(const FieldElementImplementation &a) { const FieldElementRational2 *A=(const FieldElementRational2*)&a; assert(A); assert(0); cerr<value; cerr<value); // mpq_canonicalize(value); } void madd(const FieldElementImplementation &a,const FieldElementImplementation &b) { const FieldElementRational2 *A=(const FieldElementRational2*)&a; assert(A); const FieldElementRational2 *B=(const FieldElementRational2*)&b; assert(B); assert(0); cerr<value*B->value; cerr<value,value,B->value); // cerr<value=value+B->value; // cerr<value.toString()); return r; } FieldElementRational2 *difference(const FieldElementImplementation &b)const { // TimerScope ts(&rationalTimer); const FieldElementRational2 *B=(const FieldElementRational2*)&b; FieldElementRational2 *r= new FieldElementRational2(*getField()); // fprintf(Stderr,"NEW\n"); r->value=value-B->value; // mpq_sub(r->value,value,B->value); return r; } FieldElementRational2 *negation()const { FieldElementRational2 *r= new FieldElementRational2(*getField()); // fprintf(Stderr,"NEW\n"); // mpq_neg(r->value,value); // cerr<<"NEW"<value=-value; //cerr<<"NEW"<value <<"\n"; return r; } FieldElementImplementation *inverse()const { FieldElementRational2 *r= new FieldElementRational2(*getField()); // fprintf(Stderr,"NEW\n"); if(isZero()) { AsciiPrinter P(Stderr); P.printString("Error inverting FieldElement: "); // P.printFieldElement(*this); P.printString(this->value.toString()); P.printString("\n"); assert(0); } r->value=Rational(1)/value; // mpq_inv(r->value,value); return r; } int sign()const { return value.sign(); // return mpq_sgn(value); } static int val(mpz_t m, int p) { assert(0); /* int ret=0; if(p==2) { int p2Val=mpz_scan1(m,0); return p2Val; } while(mpz_divisible_ui_p(m,p)) { mpz_divexact_ui(m,m,p); ret++; } return ret; */ return 0; } int pAdicValuation(int p)const { assert(0); /* mpq_t temp; mpq_init(temp); mpq_set(temp,value); int ret=val(mpq_numref(temp),p)-val(mpq_denref(temp),p); mpq_clear(temp); return ret;*/ return 0; } FieldElement pAdicRemainder(Field const &ZModPZ)const { assert(0); /* int p=(dynamic_cast(ZModPZ.implementingObject))->getP(); mpz_t temp; mpz_init(temp); mpz_set(temp,mpq_numref(value)); int v=pAdicValuation(p); while(v>0){mpz_divexact_ui(temp,temp,p);v--;} FieldElement A=ZModPZ.zHomomorphism(mpz_fdiv_ui(temp,p)); mpz_set(temp,mpq_denref(value)); while(v<0){mpz_divexact_ui(temp,temp,p);v++;} FieldElement B=ZModPZ.zHomomorphism(mpz_fdiv_ui(temp,p)); mpz_clear(temp); assert(!B.isZero()); return A*(B.inverse()); */ // return *this; return ZModPZ.zHomomorphism(0); } static string LaTeXTranslator(const string &s) { int startIndex=0; string sign; if(s[0]=='-') { sign=string("-"); startIndex=1; } int slashIndex=-1; for(int i=startIndex;iisZero(); //fprintf(Stderr,"DELETE\n"); delete temp; temp=sum(*tempOne); bool isMinusOne=temp->isZero(); //fprintf(Stderr,"DELETE\n"); delete temp; //fprintf(Stderr,"DELETE\n"); delete tempOne; if(!writeIfOne && isOne) { if(alwaysWriteSign)return std::string("+"); return std::string(""); } if(!writeIfOne && isMinusOne) return std::string("-"); static char s[1290*1000]; // mpq_get_str(s,10,value); //// CHECK BUFFER SIZE!!!! // Changed to make code gmp 3.1.1 compatible mpz_get_str(s,10,mpq_numref(value)); //CHECK BUFFER SIZE!!!! string S(s); if(mpz_cmp_ui(mpq_denref(value),1)!=0) { mpz_get_str(s,10,mpq_denref(value)); //CHECK BUFFER SIZE!!!! S=S+string("/")+string(s); } if(latexMode)S=LaTeXTranslator(S); if(alwaysWriteSign && mpq_sgn(value)!=-1) return std::string("+")+S; return S; */ // return ""; } FieldElementRational2 *copy()const { FieldElementRational2 *r= new FieldElementRational2(*getField()); // fprintf(Stderr,"NEW\n"); /* mpq_clear(r->value); mpz_init_set(mpq_numref(r->value), mpq_numref(value)); mpz_init_set(mpq_denref(r->value), mpq_denref(value)); */ r->value=value; return r; } }; FieldElementImplementation *FieldRationals2Implementation::zHomomorphismImplementation(int n) { // cerr<refCount++; return p; } else if(n==1) { static FieldElementImplementation *p; if(p==0)p=new FieldElementRational2(*this,1); p->refCount++; return p; } else if(n==-1) { static FieldElementImplementation *p; if(p==0)p=new FieldElementRational2(*this,-1); p->refCount++; return p; }*/ FieldElementImplementation *ret=new FieldElementRational2(*this,n); // fprintf(Stderr,"NEW\n"); // ret->refCount++; // cerr<toString(); return ret; } FieldElement FieldRationals2Implementation::zHomomorphism(int n) { return FieldElement(zHomomorphismImplementation(n)); } const char *FieldRationals2Implementation::name() { return "Rationals2"; } std::string FieldRationals2Implementation::toString()const { return std::string("QQ"); } bool FieldRationals2Implementation::isRationals()const { return false;//TO BE CHANGED? } int FieldRationals2Implementation::getCharacteristic()const { return 0; } FieldRationals2Implementation::FieldRationals2Implementation() { } Field QQ(new FieldRationals2Implementation()); FieldElementRational2 *FieldElementRational2::one() const { // fprintf(Stderr,"NEW\n"); return new FieldElementRational2(*getField(),1); } gfan0.8beta/src/polyhedralfan.h0000664000175000017500000002072115177170257016175 0ustar andersanders#ifndef POLYHEDRALFAN_H_INCLUDED #define POLYHEDRALFAN_H_INCLUDED #include #include #include "polyhedralcone.h" #include "polynomial.h" #include "printer.h" #include "matrix.h" class SymmetryGroup; typedef set PolyhedralConeList; typedef map IncidenceList; enum FanPrintingFlags{ FPF_conesCompressed=1, FPF_conesExpanded=2, FPF_cones=4, FPF_maximalCones=8, FPF_boundedInfo=16, FPF_values=32, FPF_group=64, FPF_multiplicities=128, FPF_xml=256, FPF_tPlaneSort=512, FPF_primitiveRays=1024, FPF_default=2+4+8 }; /** A PolyhedralFan is simply a collection of canonicalized PolyhedralCones. * It contains no combinatorial information in the sense of a polyhedral complex. * A cone being present in the PolyhedralFan corresponds to the cone and all its facets being present * in the mathematical object. * The intersection of cones in the fan must be a face of both. * In particular all cones in a PolyhedralFan have the same lineality space.*/ class PolyhedralFan { int n; PolyhedralConeList cones; public: static IntegerVector stableRay(PolyhedralCone const &c, SymmetryGroup const *sym); static IntegerVector stableRay(IntegerVector const &v, IntegerVectorList const &equations, IntegerVectorList const &inequalities, SymmetryGroup const *sym); static class PolyhedralFan bergmanOfPrincipalIdeal(Polynomial const &p); static class PolyhedralFan normalFanOfNewtonPolytope(Polynomial const &p); static class PolyhedralFan fullSpace(int n); static class PolyhedralFan halfSpace(int n, int i); static class PolyhedralFan facetsOfCone(PolyhedralCone const &c); /** This routine computes a fan F with minimal support with the following property: the cone can be inserted to (is compatible with) F and this will make F complete. The support of F is the closure of the complement of C. If includec is true then C is indeed inserted into F before returning. */ static class PolyhedralFan complementOfCone(PolyhedralCone const &c, bool includec=false); PolyhedralFan(int ambientDimension); void print(class Printer *p)const; //void printWithIndices(class Printer *p, SymmetryGroup *sym=0, const char *polymakeFileName=0)const; //fan must be pure vector renamingStrings(IntegerVectorList const &theVectors, IntegerVectorList const &originalRays, IntegerVectorList const &linealitySpace, SymmetryGroup *sym)const; void printWithIndices(class Printer *p, int flags=FPF_default, SymmetryGroup *sym=0, vector const *comments=0)const; // void printWithIndices(class Printer *p, bool printMultiplicities, SymmetryGroup *sym, bool group=false, bool ignoreCones=false, bool xml=false, bool tPlaneSort=false, vector const *comments=0)const; /* Read in a polyhedral fan, but with the cones containing w. If present, only read in cones among coneIndices. If sym is present, read COMPRESSED section and make w containment up to symmetry, taking all elements in the orbit that contains w into the fan. If onlyMaximal is set then only maximal cones are read in. */ static PolyhedralFan readFan(string const &filename, bool onlyMaximal=true, IntegerVector *w=0, set const *conesIndice=0, SymmetryGroup const *sym=0, bool readCompressedIfNotSym=false); int getAmbientDimension()const; int getMaxDimension()const; int getMinDimension()const; friend PolyhedralFan refinement(const PolyhedralFan &a, const PolyhedralFan &b, int cutOffDimension, bool allowASingleConeOfCutOffDimension, bool stable); friend PolyhedralFan product(const PolyhedralFan &a, const PolyhedralFan &b); IntegerVectorList getRays(int dim=1);//This can be called for other dimensions than 1. The term "Rays" still makes sense modulo the common linearity space IntegerVectorList getRelativeInteriorPoints(); PolyhedralCone const& highestDimensionalCone()const; //returns one of the cones in the fan with highest dimension PolyhedralCone convexHull()const; void insert(PolyhedralCone const &c); void insertFacetsOfCone(PolyhedralCone const &c); void remove(PolyhedralCone const &c); void removeAllExcept(int a); //deletes all except the first a cones void removeAllLowerDimensional(); /** Since the cones stored in a PolyhedralFan are cones of a polyhedral fan, it is possible to identify non maximal cones by just checking containment of relative interior points in other cones. This routine removes all non-maximal cones. */ void removeNonMaximal(); /** Returns the number of cones stored in the fan. This is not the number of cones in the fan in a mathematical sense. */ int size()const; int dimensionOfLinealitySpace()const; void makePure(); bool contains(PolyhedralCone const &c)const; /** * For a vector contained in the support of the fan represented by the fan object, this function * computes the cone that contains the vector in its relative interior. */ PolyhedralCone coneContaining(IntegerVector const &v)const; PolyhedralFan facetComplex()const; /** This routine computes all cones in the fan and returns them as a new PolyhedralFan. This routine is extremely slow. */ PolyhedralFan fullComplex()const; PolyhedralFan facetComplexSymmetry(SymmetryGroup const &sym, bool keepRays=false, bool dropLinealitySpace=false)const; PolyhedralFan rayComplexSymmetry(SymmetryGroup const &sym)const; IntegerVectorList getRaysInPrintingOrder(SymmetryGroup const *sym, bool upToSymmetry=false)const; IncidenceList getIncidenceList(SymmetryGroup *sym=0)const; bool isEmpty()const; bool isRefinementOf(PolyhedralFan const &f)const; /** Computes the link of the face containing w in its relative interior. */ PolyhedralFan link(IntegerVector const &w)const; PolyhedralFan link(IntegerVector const &w, SymmetryGroup *sym)const; /** If the cones have been assigned linear forms then this specifies a piecewise linear function on the support of the fan. This routine evaluates that linear function. */ int64 evaluatePiecewiseLinearFunction(IntegerVector const &x)const; typedef PolyhedralConeList::const_iterator coneIterator; PolyhedralFan::coneIterator conesBegin()const; PolyhedralFan::coneIterator conesEnd()const; /** Computes the volume of the d-dimensional cones stored in the fan. If the symmetry group is specified each volume of a cone is multiplied by the size of its orbit. */ FieldElement volume(int d, SymmetryGroup *sym=0)const; /** Assuming that the fan is pure, this function tests whether the fan is connected in codimension 1. IF SYMMETRY IS SPECIFIED THEN THE CHECK IS NOT COMPLETE AND IT WILL ONLY BE CHECKED IF THAT GIVEN TWO CONES THAT EXIST ELEMENTS IN THE TWO RESPECTIVE ORBITS WHICH ARE CONNECTED BY A RIDGE PATH. */ bool isConnected(SymmetryGroup *sym=0)const; PolyhedralFan negated()const; /** Checks if c can be inserted in the fan without violating the fan axioms. Very slow. */ bool isCompatible(PolyhedralCone const &c)const; /** Change the polyhedral structure of the fan and add in the cone c. Overlap of c and the cones are allowed. This routine is extremely slow. */ void merge(PolyhedralCone const &c); /** * Converts a PolyhedralFan into a SymmetricComplex. This is used for homology computations, but not for printing yet. */ class SymmetricComplex toSymmetricComplex(SymmetryGroup *sym); /** * This routine deletes the cones from the polyhedral fan and appends them to v. */ void moveConesToVector(vector &v); /** * Removes all lower dimensional faces of the fan and returns exactly the equations, * which the multiplicities of the facets must satisfy in order for the fan to be * tropically balanced. */ IntegerMatrix balancingEquations(); /** * Checks if w is contained in the support of the fan. */ bool containsInSupport(IntegerVector const &w); /** * Returns a triangulation of the fan. */ PolyhedralFan triangulation()const; }; PolyhedralFan refinement(const PolyhedralFan &a, const PolyhedralFan &b, int cutOffDimension=-1, bool allowASingleConeOfCutOffDimension=false, bool stable=false); void addFacesToSymmetricComplex(class SymmetricComplex &c, PolyhedralCone const &cone, IntegerVectorList const &facetCandidates, IntegerVectorList const &generatorsOfLinealitySpace); void addFacesToSymmetricComplex(SymmetricComplex &c, set const &indices, IntegerVectorList const &facetCandidates, int dimension, int multiplicity); #endif gfan0.8beta/src/gfanlib_zcone.cpp0000664000175000017500000011120115177170257016472 0ustar andersanders/* * lib_cone.cpp * * Created on: Sep 29, 2010 * Author: anders */ #include "gfanlib_zcone.h" #include #include #include //extern "C"{ #ifdef NOCDDPREFIX #include "setoper.h" #include "cdd.h" #else #include "cdd/setoper.h" #include "cdd/cdd.h" #endif //} namespace gfan{ bool isCddlibRequired() { return true; } void initializeCddlibIfRequired() // calling this frequently will cause memory leaks because deinitialisation is not possible with old versions of cddlib. { dd_set_global_constants(); } void deinitializeCddlibIfRequired() { // dd_free_global_constants(); } static void ensureCddInitialisation() { // A more complicated initialisation than the following (meaning attempts to count the number of times // cddlib was requested to be initialised) would require cddlib to be thread aware. // The error below is implemented with an assert(0) because throwing an exception may leave the impression that // it is possible to recover from this error. While that may be true, it would not work in full generality, // as the following if statement cannot test whether dd_free_global_constants() has also been called. // Moverover, in multithreaded environments it would be quite difficult to decide if cddlib was initialised. if(!dd_one[0]._mp_num._mp_d) { std::cerr<<"CDDLIB HAS NOT BEEN INITIALISED!\n" "\n" "Fix this problem by calling the following function in your initialisation code:\n" "dd_set_global_constants();\n" "(after possibly setting the gmp allocators) and\n" "dd_free_global_constants()\n" "in your deinitialisation code (only available for cddlib version>=094d).\n" "This requires the header includes:\n" "#include \"cdd/setoper.h\"\n" "#include \"cdd/cdd.h\"\n" "\n" "Alternatively, you may call gfan:initializeCddlibIfRequired() and deinitializeCddlibIfRequired()\n" "if gfanlib is the only code using cddlib. If at some point cddlib is no longer required by gfanlib\n" "these functions may do nothing.\n" "Because deinitialisation is not possible in cddlib <094d, the functions may leak memory and should not be called often.\n" "\n" "This error message will never appear if the initialisation was done properly, and therefore never appear in a shipping version of your software.\n"; assert(0); } /* static bool initialized; if(!initialized) { dd_set_global_constants(); initialized=true; }*/ } class LpSolver { static dd_MatrixPtr ZMatrix2MatrixGmp(ZMatrix const &g, dd_ErrorType *Error) { int n=g.getWidth(); dd_MatrixPtr M=NULL; dd_rowrange m_input,i; dd_colrange d_input,j; dd_RepresentationType rep=dd_Inequality; // dd_boolean found=dd_FALSE, newformat=dd_FALSE, successful=dd_FALSE; char command[dd_linelenmax], comsave[dd_linelenmax]; dd_NumberType NT; (*Error)=dd_NoError; rep=dd_Inequality; // newformat=dd_TRUE; m_input=g.getHeight(); d_input=n+1; NT=dd_Rational; M=dd_CreateMatrix(m_input, d_input); M->representation=rep; M->numbtype=NT; for (i = 0; i < m_input; i++) { dd_set_si(M->matrix[i][0],0); for (j = 1; j < d_input; j++) { g[i][j-1].setGmp(mpq_numref(M->matrix[i][j])); mpz_set_ui(mpq_denref(M->matrix[i][j]), 1); mpq_canonicalize(M->matrix[i][j]); } } // successful=dd_TRUE; return M; } static dd_MatrixPtr ZMatrix2MatrixGmp(ZMatrix const &inequalities, ZMatrix const &equations, dd_ErrorType *err) { ZMatrix g=inequalities; g.append(equations); int numberOfInequalities=inequalities.getHeight(); int numberOfRows=g.getHeight(); dd_MatrixPtr A=NULL; ensureCddInitialisation(); A=ZMatrix2MatrixGmp(g, err); for(int i=numberOfInequalities;ilinset,i+1); return A; } static ZMatrix getConstraints(dd_MatrixPtr A, bool returnEquations) { int rowsize=A->rowsize; int n=A->colsize-1; ZMatrix ret(0,n); for(int i=0;ilinset); if(isEquation==returnEquations) { QVector v(n); for(int j=0;jmatrix[i][j+1]); ret.appendRow(QToZVectorPrimitive(v)); } } return ret; } static bool isFacet(ZMatrix const &g, int index) { bool ret; // dd_MatrixPtr M=NULL,M2=NULL,M3=NULL; dd_MatrixPtr M=NULL; // dd_colrange d; dd_ErrorType err=dd_NoError; // dd_rowset redrows,linrows,ignoredrows, basisrows; // dd_colset ignoredcols, basiscols; // dd_DataFileType inputfile; FILE *reading=NULL; ensureCddInitialisation(); M=ZMatrix2MatrixGmp(g, &err); if (err!=dd_NoError) goto _L99; // d=M->colsize; //static dd_Arow temp; dd_Arow temp; dd_InitializeArow(g.getWidth()+1,&temp); ret= !dd_Redundant(M,index+1,temp,&err); dd_FreeMatrix(M); dd_FreeArow(g.getWidth()+1,temp); if (err!=dd_NoError) goto _L99; return ret; _L99: assert(0); return false; } /* Heuristic for checking if inequality of full dimensional cone is a facet. If the routine returns true then the inequality is a facet. If it returns false it is unknown. */ static bool fastIsFacetCriterion(ZMatrix const &normals, int i) { int n=normals.getWidth(); for(int j=0;j > Container; Container container; int tableSize; public: class iterator { class MyHashMap &hashMap; int index; // having index==-1 means that we are before/after the elements. std::set::iterator i; public: bool operator++() { if(index==-1)goto search; i++; while(i==hashMap.container[index].end()) { search: index++; if(index>=hashMap.tableSize){ index=-1; return false; } i=hashMap.container[index].begin(); } return true; } ZVector const & operator*()const { return *i; } ZVector operator*() { return *i; } iterator(MyHashMap &hashMap_): hashMap(hashMap_) { index=-1; } }; unsigned int function(const ZVector &v) { unsigned int ret=0; int n=v.size(); for(int i=0;i>29)+v.UNCHECKEDACCESS(i).hashValue(); return ret%tableSize; } MyHashMap(int tableSize_): container(tableSize_), tableSize(tableSize_) { assert(tableSize_>0); } void insert(const ZVector &v) { container[function(v)].insert(v); } void erase(ZVector const &v) { container[function(v)].erase(v); } iterator begin() { iterator ret(*this); ++ ret; return ret; } int size() { iterator i=begin(); int ret=0; do{ret++;}while(++i); return ret; } }; static ZMatrix normalizedWithSumsAndDuplicatesRemoved(ZMatrix const &a) { // TODO: write a version of this function which will work faster if the entries fit in 32bit if(a.getHeight()==0)return a; int n=a.getWidth(); ZVector temp1(n); // ZVector temp2(n); ZMatrix ret(0,n); MyHashMap b(a.getHeight()); for(int i=0;ilinset,i+1); A->objective=dd_LPmax; dd_rowset impl_linset; dd_rowset redset; dd_rowindex newpos; if(removeInequalityRedundancies) dd_MatrixCanonicalize(&A, &impl_linset, &redset, &newpos, &err); else dd_MatrixCanonicalizeLinearity(&A, &impl_linset, &newpos, &err); if (err!=dd_NoError) goto _L99; { int n=A->colsize-1; equations=ZMatrix(0,n); //TODO: the number of rows needed is actually known inequalities=ZMatrix(0,n); //is known by set_card(). That might save some copying. { int rowsize=A->rowsize; QVector point(n); for(int i=0;imatrix[i][j+1]); ((set_member(i+1,A->linset))?equations:inequalities).appendRow(QToZVectorPrimitive(point)); } } assert(set_card(A->linset)==equations.getHeight()); assert(A->rowsize==equations.getHeight()+inequalities.getHeight()); set_free(impl_linset); if(removeInequalityRedundancies) set_free(redset); free(newpos); dd_FreeMatrix(A); return; } _L99: assert(!"Cddlib reported error when called by Gfanlib."); } ZVector relativeInteriorPoint(const ZMatrix &inequalities, const ZMatrix &equations) { QVector retUnscaled(inequalities.getWidth()); ensureCddInitialisation(); int numberOfEqualities=equations.getHeight(); int numberOfInequalities=inequalities.getHeight(); int numberOfRows=numberOfEqualities+numberOfInequalities; // dd_rowset r=NULL; ZMatrix g=inequalities; g.append(equations); dd_LPSolverType solver=dd_DualSimplex; dd_MatrixPtr A=NULL; dd_ErrorType err=dd_NoError; A=ZMatrix2MatrixGmp(g,&err); if (err!=dd_NoError) goto _L99; { dd_LPSolutionPtr lps1; dd_LPPtr lp,lp1; for(int i=0;imatrix[i][0],-1); for(int i=numberOfInequalities;ilinset,i+1); A->objective=dd_LPmax; lp=dd_Matrix2LP(A, &err); if (err!=dd_NoError) goto _L99; lp1=dd_MakeLPforInteriorFinding(lp); dd_LPSolve(lp1,solver,&err); if (err!=dd_NoError) goto _L99; lps1=dd_CopyLPSolution(lp1); assert(!dd_Negative(lps1->optvalue)); for (int j=1; j <(lps1->d)-1; j++) retUnscaled[j-1]=Rational(lps1->sol[j]); dd_FreeLPData(lp); dd_FreeLPSolution(lps1); dd_FreeLPData(lp1); dd_FreeMatrix(A); return QToZVectorPrimitive(retUnscaled); } _L99: assert(0); return QToZVectorPrimitive(retUnscaled); } void dual(ZMatrix const &inequalities, ZMatrix const &equations, ZMatrix &dualInequalities, ZMatrix &dualEquations) { int result; dd_MatrixPtr A=NULL; dd_ErrorType err=dd_NoError; ensureCddInitialisation(); A=ZMatrix2MatrixGmp(inequalities, equations, &err); dd_PolyhedraPtr poly; poly=dd_DDMatrix2Poly2(A, dd_LexMin, &err); if (poly->child==NULL || poly->child->CompStatus!=dd_AllFound) assert(0); dd_MatrixPtr A2=dd_CopyGenerators(poly); dualInequalities=getConstraints(A2,false); dualEquations=getConstraints(A2,true); dd_FreeMatrix(A2); dd_FreeMatrix(A); dd_FreePolyhedra(poly); return; _L99: assert(0); } // this procedure is take from cddio.c. static void dd_ComputeAinc(dd_PolyhedraPtr poly) { /* This generates the input incidence array poly->Ainc, and two sets: poly->Ared, poly->Adom. */ dd_bigrange k; dd_rowrange i,m1; dd_colrange j; dd_boolean redundant; dd_MatrixPtr M=NULL; mytype sum,temp; dd_init(sum); dd_init(temp); if (poly->AincGenerated==dd_TRUE) goto _L99; M=dd_CopyOutput(poly); poly->n=M->rowsize; m1=poly->m1; /* this number is same as poly->m, except when poly is given by nonhomogeneous inequalty: !(poly->homogeneous) && poly->representation==Inequality, it is poly->m+1. See dd_ConeDataLoad. */ poly->Ainc=(set_type*)calloc(m1, sizeof(set_type)); for(i=1; i<=m1; i++) set_initialize(&(poly->Ainc[i-1]),poly->n); set_initialize(&(poly->Ared), m1); set_initialize(&(poly->Adom), m1); for (k=1; k<=poly->n; k++){ for (i=1; i<=poly->m; i++){ dd_set(sum,dd_purezero); for (j=1; j<=poly->d; j++){ dd_mul(temp,poly->A[i-1][j-1],M->matrix[k-1][j-1]); dd_add(sum,sum,temp); } if (dd_EqualToZero(sum)) { set_addelem(poly->Ainc[i-1], k); } } if (!(poly->homogeneous) && poly->representation==dd_Inequality){ if (dd_EqualToZero(M->matrix[k-1][0])) { set_addelem(poly->Ainc[m1-1], k); /* added infinity inequality (1,0,0,...,0) */ } } } for (i=1; i<=m1; i++){ if (set_card(poly->Ainc[i-1])==M->rowsize){ set_addelem(poly->Adom, i); } } for (i=m1; i>=1; i--){ if (set_card(poly->Ainc[i-1])==0){ redundant=dd_TRUE; set_addelem(poly->Ared, i); }else { redundant=dd_FALSE; for (k=1; k<=m1; k++) { if (k!=i && !set_member(k, poly->Ared) && !set_member(k, poly->Adom) && set_subset(poly->Ainc[i-1], poly->Ainc[k-1])){ if (!redundant){ redundant=dd_TRUE; } set_addelem(poly->Ared, i); } } } } dd_FreeMatrix(M); poly->AincGenerated=dd_TRUE; _L99:; dd_clear(sum); dd_clear(temp); } std::vector > extremeRaysInequalityIndices(const ZMatrix &inequalities) { int dim2=inequalities.getHeight(); if(dim2==0)return std::vector >(); // int dimension=inequalities.getWidth(); dd_MatrixPtr A=NULL; dd_ErrorType err=dd_NoError; ensureCddInitialisation(); A=ZMatrix2MatrixGmp(inequalities, &err); dd_PolyhedraPtr poly; poly=dd_DDMatrix2Poly2(A, dd_LexMin, &err); if (poly->child==NULL || poly->child->CompStatus!=dd_AllFound) assert(0); if (poly->AincGenerated==dd_FALSE) dd_ComputeAinc(poly); std::vector > ret; /* How do we interpret the cddlib output? For a long ting gfan has been using poly->n as the number of rays of the cone and thus returned sets of indices that actually gave the lineality space. The mistake was then caught later in PolyhedralCone. On Feb 17 2009 gfan was changed to check the length of each set to make sure that it does not specify the lineality space and only return those sets giving rise to rays. This does not seem to be the best strategy and might even be wrong. */ for (int k=1; k<=poly->n; k++) { int length=0; for (int i=1; i<=poly->m1; i++) if(set_member(k,poly->Ainc[i-1]))length++; if(length!=dim2) { std::vector v(length); int j=0; for (int i=1; i<=poly->m1; i++) if(set_member(k,poly->Ainc[i-1]))v[j++]=i-1; ret.push_back(v); } } dd_FreeMatrix(A); dd_FreePolyhedra(poly); return ret; _L99: assert(0); return std::vector >(); } }; LpSolver lpSolver; bool ZCone::isInStateMinimum(int s)const { return state>=s; } bool operator<(ZCone const &a, ZCone const &b) { assert(a.state>=3); assert(b.state>=3); if(a.nb.n)return false; if(a.equations1)//there can be no implied equation unless we have at least two inequalities lpSolver.removeRedundantRows(inequalities,equations,false); assert(inequalities.getWidth()==equations.getWidth()); } if((state<2) && (s>=2) && !(preassumptions&PCP_facetsKnown)) { /* if(inequalities.size()>25) { IntegerVectorList h1; IntegerVectorList h2; bool a=false; for(IntegerVectorList::const_iterator i=inequalities.begin();i!=inequalities.end();i++) { if(a) h1.push_back(*i); else h2.push_back(*i); a=!a; } PolyhedralCone c1(h1,equations); PolyhedralCone c2(h2,equations); c1.ensureStateAsMinimum(2); c2.ensureStateAsMinimum(2); inequalities=c1.inequalities; for(IntegerVectorList::const_iterator i=c2.inequalities.begin();i!=c2.inequalities.end();i++) inequalities.push_back(*i); } */ if(equations.getHeight()) { QMatrix m=ZToQMatrix(equations); m.reduce(); m.REformToRREform(); ZMatrix inequalities2(0,equations.getWidth()); for(int i=0;i=3)) { QMatrix equations2=ZToQMatrix(equations); equations2.reduce(false,false,true); equations2.REformToRREform(true); for(int i=0;i=1); return lpSolver.relativeInteriorPoint(inequalities,equations); } ZVector ZCone::getUniquePoint()const { ZMatrix rays=extremeRays(); ZVector ret(n); for(int i=0;i=1); ensureStateAsMinimum(1); return ambientDimension()-equations.getHeight(); } int ZCone::dimensionOfLinealitySpace()const { ZMatrix temp=inequalities; temp.append(equations); ZCone temp2(ZMatrix(0,n),temp); return temp2.dimension(); } bool ZCone::isOrigin()const { return dimension()==0; } bool ZCone::isFullSpace()const { for(int i=0;i=1); for(int i=0;i=2); ensureStateAsMinimum(2); return codimension()+inequalities.getHeight()+dimensionOfLinealitySpace()==n; } ZCone ZCone::linealitySpace()const { ZCone ret(ZMatrix(0,n),combineOnTop(equations,inequalities)); // ret.ensureStateAsMinimum(state); return ret; } ZCone ZCone::dualCone()const { ensureStateAsMinimum(1); // assert(state>=1); ZMatrix dualInequalities,dualEquations; lpSolver.dual(inequalities,equations,dualInequalities,dualEquations); ZCone ret(dualInequalities,dualEquations); ret.ensureStateAsMinimum(state); return ret; } ZCone ZCone::negated()const { ZCone ret(-inequalities,equations,(areFacetsKnown()?PCP_facetsKnown:0)|(areImpliedEquationsKnown()?PCP_impliedEquationsKnown:0)); // ret.ensureStateAsMinimum(state); return ret; } ZMatrix ZCone::extremeRays(ZMatrix const *generatorsOfLinealitySpace)const { // assert((dimension()==ambientDimension()) || (state>=3)); if(dimension()!=ambientDimension()) ensureStateAsMinimum(3); if(haveExtremeRaysBeenCached)return cachedExtremeRays; ZMatrix ret(0,n); std::vector > indices=lpSolver.extremeRaysInequalityIndices(inequalities); for(unsigned i=0;i asVector(inequalities.getHeight()); for(unsigned j=0;jequations; ZVector theInequality; for(unsigned j=0;jequations,inequalities)); QMatrix temp=combineOnTop(linealitySpaceOrth.reduceAndComputeKernel(),ZToQMatrix(equations)); thePrimitiveVector=QToZVectorPrimitive(temp.reduceAndComputeVectorInKernel()); } if(!contains(thePrimitiveVector))thePrimitiveVector=-thePrimitiveVector; ret.appendRow(thePrimitiveVector); } cachedExtremeRays=ret; haveExtremeRaysBeenCached=true; return ret; } Integer ZCone::getMultiplicity()const { return multiplicity; } void ZCone::setMultiplicity(Integer const &m) { multiplicity=m; } ZMatrix ZCone::getLinearForms()const { return linearForms; } void ZCone::setLinearForms(ZMatrix const &linearForms_) { linearForms=linearForms_; } ZMatrix ZCone::quotientLatticeBasis()const { // assert(isInStateMinimum(1));// Implied equations must have been computed in order to know the span of the cone ensureStateAsMinimum(1); int a=equations.getHeight(); int b=inequalities.getHeight(); // Implementation below could be moved to nonLP part of code. // small vector space defined by a+b equations.... big by a equations. ZMatrix M=combineLeftRight(combineLeftRight( equations.transposed(), inequalities.transposed()), ZMatrix::identity(n)); M.reduce(false,true); /* [A|B|I] is reduced to [A'|B'|C'] meaning [A'|B']=C'[A|B] and A'=C'A. [A'|B'] is in row echelon form, implying that the rows of C' corresponding to zero rows of [A'|B'] generate the lattice cokernel of [A|B] - that is the linealityspace intersected with Z^n. [A'] is in row echelon form, implying that the rows of C' corresponding to zero rows of [A'] generate the lattice cokernel of [A] - that is the span of the cone intersected with Z^n. It is clear that the second row set is a superset of the first. Their difference is a basis for the quotient. */ ZMatrix ret(0,n); for(int i=0;i=1)?PCP_impliedEquationsKnown:0); ret.ensureStateAsMinimum(state); return ret; } ZMatrix ZCone::getInequalities()const { return inequalities; } ZMatrix ZCone::getEquations()const { return equations; } ZMatrix ZCone::generatorsOfSpan()const { ensureStateAsMinimum(1); QMatrix l=ZToQMatrix(equations); return QToZMatrixPrimitive(l.reduceAndComputeKernel()); } ZMatrix ZCone::generatorsOfLinealitySpace()const { QMatrix l=ZToQMatrix(combineOnTop(inequalities,equations)); return QToZMatrixPrimitive(l.reduceAndComputeKernel()); } } gfan0.8beta/src/app_candidatesfortropicalbasis.cpp0000664000175000017500000000643015177170257022127 0ustar andersanders#include #include "parser.h" #include "printer.h" #include "polynomial.h" #include "buchberger.h" #include "reversesearch.h" #include "termorder.h" #include "genericwalk.h" #include "gfanapplication.h" #include "timer.h" #include "tropical2.h" #include "log.h" #include "field_rationals.h" #include "saturation.h" class CandidatesForTropicalBasisApplication : public GFanApplication { IntegerOption optionNumberOfParameters; SimpleOption optionDropFirstEntry; SimpleOption optionMinX; public: bool includeInDefaultInstallation() { return false; } const char *helpText() { return "This program takes a list of polynomials and a list of weight vectors. The output is the set of \n"; } CandidatesForTropicalBasisApplication(): optionNumberOfParameters("--nparams","Specify number of variables to regard as parameters.\n"), optionDropFirstEntry("--drop","Ignore first column of the matrix of weight vectors."), optionMinX("--minx","Switch to min-convention.") { registerOptions(); } const char *name() { return "_candidatesfortropicalbasis"; } bool doesPolyExclude(Polynomial const &p, IntegerVector const &w) { Polynomial g=initialForm(p,w); if(g.isZero())return false; g.saturate(); if(g.numberOfVariablesInUseConsecutive()<=optionNumberOfParameters.getValue()) return true; return false; } int main() { PolynomialSet g=FileParser(Stdin).parsePolynomialSetWithRing(); IntegerVectorList wlist=FileParser(Stdin).parseIntegerVectorList(); PolynomialSet out(g.getRing()); for(auto w:wlist) { if(optionMinX.getValue()) w=-w; if(optionDropFirstEntry.getValue()) w=w.withIthCoordinateRemoved(0); w=concatenation(IntegerVector(g.numberOfVariablesInRing()-w.size()),w); WeightTermOrder T(w); g.markAndScale(T); static int skip=30; skip--; if(1) { if(skip<0) { pout<print(); fprintf(Stderr,"}\n"); } XFig::Polygon XFig::intersect(const Polygon &polygon, const Point &normal) { // fprintf(Stderr,"intersect input:\n"); // printPolygon(polygon); Polygon ret; Polygon temp; Polygon::const_iterator i=polygon.begin(); while(i!=polygon.end()) { if(normal.isInside(*i))break; i++; } if(i==polygon.end())return ret; for(Polygon::const_iterator j=i;j!=polygon.end();j++) temp.push_back(*j); for(Polygon::const_iterator j=polygon.begin();j!=i;j++) temp.push_back(*j); temp.push_back(*i); // fprintf(Stderr,"intersect temp:\n"); // printPolygon(temp); Polygon::const_iterator j=temp.begin(); while(j!=temp.end()) { Point last(0,0,0); while(j!=temp.end()&&normal.isInside(*j)) { //fprintf(Stderr,"inside:"); //j->print(); last=*j; ret.push_back(*j); j++; } if(j==temp.end())break; Point leaving=normal.intersect(last,*j); while(!normal.isInside(*j)) { //fprintf(Stderr,"outside:"); //j->print(); last=*j; j++; } Point entering=normal.intersect(last,*j); ret.push_back(leaving); ret.push_back(entering); ret.push_back(*j); j++; } ret.pop_back(); // fprintf(Stderr,"intersect ret:\n"); // printPolygon(ret); return ret; } void XFig::kickPoint(const Point &p, int mode) { // fprintf(file," %i %i",(int)(p.x*10000),(int)(p.y*10000)); switch(mode) { case 0: { float invSqrt2=0.707106781; float invSqrt6=0.40824829; fprintf(f," %i %i",(int)((invSqrt2+invSqrt2*p.x-invSqrt2*p.y)*10000+offsetX),(int)((2*invSqrt6+invSqrt6*p.x+invSqrt6*p.y-2*invSqrt6*p.z)*10000+offsetY)); } break; case 1: { fprintf(f," %i %i",(int)((p.x)*10000+offsetX),(int)((p.y)*10000+offsetY)); } } } void XFig::drawPolygon(const Polygon &vertices, int mode) { if(vertices.size()) { fprintf(f,"2 3 0 1 0 %i 50 0 25 0.000 0 0 -1 0 0 %i\n ",7,(int)vertices.size()+1); for(Polygon::const_iterator i=vertices.begin();i!=vertices.end();i++) kickPoint(*i,mode); kickPoint(*vertices.begin(),mode); fprintf(f,"\n"); } fflush(f); } gfan0.8beta/src/gfanlib_z.h0000664000175000017500000006171615177170257015311 0ustar andersanders/* * lib_z.h * * Created on: Sep 28, 2010 * Author: anders */ #ifndef LIB_Z_H_ #define LIB_Z_H_ #include #include #include #include #include #define OLD 1 #if OLD #include "gmp.h" namespace gfan{ static std::string mpzToString(const __mpz_struct * value) //consider operator<< below for alternative { thread_local std::vector temp; temp.reserve(mpz_sizeinbase(value,10)+2);// Two additional bytes are needed - one for the sign and one for string termination. mpz_get_str(temp.data(),10,value); return std::string(temp.data()); } class IntGMP { mpz_t value; public: typedef IntGMP POD;//Not actually a POD type. But here we can specify a POD type if one exists. static bool isField() { return false; } IntGMP() { mpz_init(value); } IntGMP(signed long int value_) { mpz_init(value); mpz_set_si(value,value_); } IntGMP(IntGMP const & value_) { mpz_init_set(value,value_.value); } IntGMP(mpz_t const value_) { mpz_init_set(value,value_); } IntGMP(std::string const&s) { mpz_init(value); mpz_set_str(value, s.c_str(), 10); } ~IntGMP() { mpz_clear(value); } IntGMP& operator=(const IntGMP& a) { const IntGMP *A=(const IntGMP*)&a; if (this != A) { mpz_clear(value); mpz_init_set(value, a.value); } return *this; } bool isZero()const{ return mpz_sgn(value)==0; } friend std::ostream &operator<<(std::ostream &f, IntGMP const &a) { void (*freefunc)(void *, size_t); mp_get_memory_functions(0,0,&freefunc); char *str=mpz_get_str(0,10,a.value); f<setGmp(v); bool ret=(mpz_fits_sint_p(v)!=0); mpz_clear(v); return ret; } int64_t toInt()const//works for 64 bit integers { mpz_t v; mpz_init(v); this->setGmp(v); int ret=0; // if(mpz_fits_sint_p(v)) ret=mpz_get_si(v); // else // ok=false; mpz_clear(v); return ret; } std::string toString()const { return mpzToString(value); #if 0 //delete this //this awful code also appears in field_rationals.cpp static char s[1290*1000];//NOT THREAD SAFE // mpq_get_str(s,10,value); //// CHECK BUFFER SIZE!!!! // Changed to make code gmp 3.1.1 compatible mpz_get_str(s,10,value); //CHECK BUFFER SIZE!!!! return std::string(s); #endif } }; /* * Integer is supposed to be a more efficient version of IntGMP. However, the current implementation is not portable. * Therefore the following if can be used to enable/disable the efficient version. */ #if 0 // enable more efficient integer here typedef IntGMP Integer; #else class Integer2 { /* Integer2 represents an integer by either an GMP integer or an immediate value. * * The value needs to be interpreted in two different ways depending on whether the pointer value._mp_d is odd or even. * We assume that odd pointers are not actually used for storing limbs - although that is not guaranteed on all architectures. * If the pointer is even, then Integer uses gmp to store its value in an mpz_t. If the pointer is odd, then a signed 32 bit * value is stored in value._mp_alloc. * * Because the above conventions may change in the future, access to the machine integer representation has been encapsulated * in the private methods below. */ mpz_t value; bool hasLimbs()const { return !(((long int)(value->_mp_d))&1); } void initSetInt32(std::int32_t v)//should only be used in constructor or after mpz_clear has been called { value->_mp_alloc=v; *((long int*)&(value->_mp_d))=1; } void setInt32(std::int32_t v) { assert(!hasLimbs()); value->_mp_alloc=v; } std::int32_t getInt32()const { assert(!hasLimbs()); return int32_t(value[0]._mp_alloc); } void extend() { assert(!hasLimbs()); mpz_init_set_si(value,getInt32()); } bool fitsInInt32(signed long int v) { return (v>=-65536*(long)0x00008000)&&(v<=0x7fffffff); } void tryShrinking() { if(hasLimbs()) if(mpz_fits_slong_p(value)) if(fitsInInt32(mpz_get_si(value))) { auto v=mpz_get_si(value); mpz_clear(value); initSetInt32(v); } } void dump()const { std::cerr<_mp_d<<" "<_mp_alloc<<"\n"; } public: typedef Integer2 POD;//Not actually a POD type. But here we can specify a POD type if one exists. static bool isField() { return false; } Integer2() { initSetInt32(0); // mpz_init(value); } Integer2(signed long int value_) { if(fitsInInt32(value_)) initSetInt32(value_); else mpz_init_set_si(value,value_); } Integer2(Integer2 const & value_) { if(value_.hasLimbs()) mpz_init_set(value,value_.value); else value[0]=value_.value[0]; } Integer2(mpz_t const value_) { if(mpz_fits_sint_p(value_)) initSetInt32(mpz_get_si(value_)); else mpz_init_set(value,value_); } Integer2(std::string const&s) { mpz_init(value); mpz_set_str(value, s.c_str(), 10); tryShrinking(); } ~Integer2() { if(hasLimbs()) mpz_clear(value); } Integer2& operator=(const Integer2& a) { const Integer2 *A=(const Integer2*)&a; if (this != A) { if(hasLimbs()) if(a.hasLimbs()) mpz_set(value,a.value); else { mpz_clear(value); initSetInt32(a.getInt32()); } else if(a.hasLimbs()) mpz_init_set(value, a.value); else setInt32(a.getInt32()); } return *this; } bool isZero()const{ // dump(); if(hasLimbs()) return mpz_sgn(value)==0; return getInt32()==0; } friend std::ostream &operator<<(std::ostream &f, Integer2 const &a) { if(a.hasLimbs()) { void (*freefunc)(void *, size_t); mp_get_memory_functions(0,0,&freefunc); char *str=mpz_get_str(0,10,a.value); f<0) mpz_add_ui(value,value,v); else // mpz_sub_ui(value,value,((unsigned long int)0xffffffff)&((unsigned long int)-v)); // The above line fails on // 3221225472 += -2147483648 which gives -18446744068340842496 // The reason is that changing sign of -2147483648 with operator- is // undefined behavior. Since we just excluded the case where v is positive, // the compiler may now assume that -v is in the range 0 to 2147483647. // Therefore it is unnecessary to do the masking and the and instruction is // never emitted. The value is extended from 32 bit to 64 bit by sign. But if // in fact if v==-2147483648, then the result is a very small negative number. mpz_sub_ui(value,value,-(signed long int)v); } else if(a.hasLimbs()) { mpz_init_set_si(value,getInt32()); mpz_add(value,value,a.value); } else { auto r=((long int)getInt32())+(long int)a.getInt32(); if(fitsInInt32(r)) setInt32(r); else mpz_init_set_si(value,r); } tryShrinking(); return *this; } Integer2& operator-=(const Integer2& a) { if(hasLimbs()) if(a.hasLimbs()) mpz_sub(value,value,a.value); else { auto v=a.getInt32(); if(v>0) mpz_sub_ui(value,value,v); else //mpz_add_ui(value,value,((unsigned long int)0xffffffffL)&((unsigned long int)-v)); mpz_add_ui(value,value,-(signed long int)v); } else if(a.hasLimbs()) { mpz_init_set_si(value,getInt32()); mpz_sub(value,value,a.value); } else { auto r=((long int)getInt32())-(long int)a.getInt32(); if(fitsInInt32(r)) setInt32(r); else mpz_init_set_si(value,r); } tryShrinking(); return *this; } Integer2& operator*=(const Integer2& a) { if(hasLimbs()) if(a.hasLimbs()) mpz_mul(value,value,a.value); else mpz_mul_si(value,value,a.getInt32()); else if(a.hasLimbs()) { mpz_init_set_si(value,getInt32()); mpz_mul(value,value,a.value); } else { auto r=((long int)getInt32())*(long int)a.getInt32(); if(fitsInInt32(r)) setInt32(r); else mpz_init_set_si(value,r); } tryShrinking(); return *this; } Integer2& operator/=(const Integer2& a) { if(hasLimbs()) if(a.hasLimbs()) mpz_fdiv_q(value,value,a.value); else { int v=a.getInt32(); if(v>0) mpz_fdiv_q_ui(value,value,a.getInt32()); else { // mpz_fdiv_q_ui(value,value,((unsigned long int)0xffffffffL)&((unsigned long int)-v)); mpz_fdiv_q_ui(value,value,-(signed long int)v); mpz_neg(value,value); } } else if(a.hasLimbs()) { mpz_init_set_si(value,getInt32()); mpz_fdiv_q(value,value,a.value); } else setInt32(getInt32()/a.getInt32()); tryShrinking(); return *this; } Integer2& exactlyDivideBy(const Integer2 &a) { assert(0);//should be optimised if(hasLimbs()) if(a.hasLimbs()) mpz_divexact(value,value,a.value); else { int v=a.getInt32(); if(v>0) mpz_divexact_ui(value,value,a.getInt32()); else { // mpz_divexact_ui(value,value,((unsigned long int)0xffffffffL)&((unsigned long int)-v)); mpz_divexact_ui(value,value,-(signed long int)v); mpz_neg(value,value); } } else if(a.hasLimbs()) { mpz_init_set_si(value,getInt32()); mpz_divexact(value,value,a.value); } else setInt32(getInt32()/a.getInt32()); tryShrinking(); return *this; } friend Integer2 operator-(const Integer2 &b) { Integer2 ret; ret-=b; return ret; } Integer2 operator+(const Integer2 &a)const { Integer2 ret(*this); ret+=a; return ret; } Integer2 operator-(const Integer2 &a)const { Integer2 ret(*this); ret-=a; return ret; } Integer2 operator*(const Integer2 &a)const { Integer2 ret(*this); ret*=a; return ret; } Integer2 operator/(const Integer2 &a)const { Integer2 ret(*this); ret/=a; return ret; } Integer2 exactQuotientBy(const Integer2 &a)const { Integer2 ret(*this); ret.exactlyDivideBy(a); return ret; } void madd(const Integer2 &a,const Integer2 &b) { /* mpz_t temp; mpz_init(temp); mpz_mul(temp,a.value,b.value); mpz_add(value,value,temp); mpz_clear(temp);*/ if((!hasLimbs())&&(a.hasLimbs()||b.hasLimbs())) mpz_init_set_si(value,getInt32()); if(a.hasLimbs()) if(b.hasLimbs()) mpz_addmul(value,a.value,b.value); else if(b.getInt32()>0) mpz_addmul_ui(value,a.value,b.getInt32()); else // mpz_submul_ui(value,a.value,((unsigned long int)0xffffffffL)&((unsigned long int)-b.getInt32())); mpz_submul_ui(value,a.value,-(signed long int)b.getInt32()); else if(b.hasLimbs()) if(a.getInt32()>0) mpz_addmul_ui(value,b.value,a.getInt32()); else // mpz_submul_ui(value,b.value,((unsigned long int)0xffffffffL)&((unsigned long int)-a.getInt32())); mpz_submul_ui(value,b.value,-(signed long int)a.getInt32()); else { if(hasLimbs()) { auto prod=((long int)a.getInt32())*(long int)b.getInt32(); if(prod>=0) mpz_add_ui(value,value,prod); else mpz_sub_ui(value,value,-prod); } else { auto r=getInt32()+((long int)a.getInt32())*(long int)b.getInt32(); if(fitsInInt32(r)) setInt32(r); else mpz_init_set_si(value,r); } } tryShrinking(); } bool operator<(const Integer2 &a)const { if(hasLimbs()) if(a.hasLimbs()) return mpz_cmp(value,a.value)<0; else return mpz_cmp_si(value,a.getInt32())<0; else if(a.hasLimbs()) return -mpz_cmp_si(a.value,getInt32())<0; else return getInt32()0)return 1; else return 0; } static Integer2 gcd(Integer2 const &a, Integer2 const &b, Integer2 &s, Integer2 &t) { auto A(a); auto B(b); if(!A.hasLimbs())A.extend(); if(!B.hasLimbs())B.extend(); if(!s.hasLimbs())s.extend(); if(!t.hasLimbs())t.extend(); mpz_t r; mpz_init(r); mpz_gcdext(r,s.value,t.value,A.value,B.value); Integer2 ret(r); mpz_clear(r); s.tryShrinking(); t.tryShrinking(); return ret; } static Integer2 gcd(Integer2 const &a, Integer2 const &b) { auto A(a); auto B(b); if(!A.hasLimbs())A.extend(); if(!B.hasLimbs())B.extend(); mpz_t r; mpz_init(r); mpz_gcd(r,A.value,B.value); Integer2 ret(r); mpz_clear(r); return ret; } /** * Assigns the value to z. z must have been initialized as a gmp variable. */ void setGmp(mpz_t z)const { if(hasLimbs()) mpz_set(z,value); else mpz_set_si(z,getInt32()); } /** * Returns a value which is useful for computing hash functions. */ signed long int hashValue()const { if(hasLimbs()) return mpz_get_si(value); return getInt32(); } bool fitsInInt()const { if(hasLimbs()) { mpz_t v; mpz_init(v); this->setGmp(v); bool ret=(mpz_fits_sint_p(v)!=0); mpz_clear(v); return ret; } return true; } int64_t toInt()const//works for 64 bit integers { if(hasLimbs()) { mpz_t v; mpz_init(v); this->setGmp(v); int ret=0; // if(mpz_fits_sint_p(v)) ret=mpz_get_si(v); // else // ok=false; mpz_clear(v); return ret; } return getInt32(); } std::string toString()const { if(fitsInInt())return std::to_string(toInt()); return mpzToString(value); #if 0 //delete this //this awful code also appears in field_rationals.cpp static char s[1290*1000];//NOT THREAD SAFE // mpq_get_str(s,10,value); //// CHECK BUFFER SIZE!!!! // Changed to make code gmp 3.1.1 compatible mpz_get_str(s,10,value); //CHECK BUFFER SIZE!!!! return std::string(s); #endif } }; #if 0 // enable debug integer here class IntegerBoth { IntGMP A; Integer2 B; bool test()const { mpz_t a,b; mpz_init(a); mpz_init(b); A.setGmp(a); B.setGmp(b); bool ret=(mpz_cmp(a,b)==0); mpz_clear(b); mpz_clear(a); return ret; } public: typedef IntegerBoth POD;//Not actually a POD type. But here we can specify a POD type if one exists. static bool isField() { return false; } IntegerBoth(): A(),B() { assert(test()); } IntegerBoth(signed long int value_): A(value_), B(value_) { assert(test()); } IntegerBoth(IntegerBoth const & value_): A(value_.A), B(value_.B) { assert(test()); } IntegerBoth(mpz_t const value_): A(value_), B(value_) { assert(test()); } IntegerBoth(std::string const&s): A(s), B(s) { assert(test()); } bool isZero()const{ assert(test()); assert(A.isZero()==B.isZero()); return A.isZero(); } friend std::ostream &operator<<(std::ostream &f, IntegerBoth const &a) { assert(a.test()); return f< struct spec64malloc{ int64_t data; bool hasLimbs() { return data&1; } word fitsMask() { return 0xc000000000000000; } void assign(word value)//assuming data fits { data=value<<1; } void alloc(int nlimbs)//one limb is added since that will tell the number of remaining limbs { int64_t temp=(int64_t)malloc((nlimbs+1)*limbSizeInBytes); assert(temp); data=temp+1; } LimbWord *limbs()//assuming that limbs exist { return (LimbWord*)(data-1); } word nlimbs()//assuming limbs exist { return (word)*limbs(); } void copy(spec64malloc b) { if(hasLimbs()) { word n2=b.nlimbs()+1; int64_t temp=(int64_t)malloc((n2)*limbSizeInBytes); assert(temp); data=temp+1; memcpy((LimbWord*)temp,limbs(),n2*limbSizeInBytes); } else { data=b.data; } } void doFree()//assuming that limbs exist { free((void*)(data-1)); } word valueToWord()//assume no limbs and that word is big enough to contain int64_t { return data>>1; } }; template struct IntegerTemplate : public spec { private: bool fits(word v) { return !((value_&fitsMask())^((value_<<1)&fitsMask)); } public: static bool isField() { return false; } IntegerTemplate() { spec.data=0; } void assignWordNoFree() { if(fits(value_)) { assign(value); } else { alloc(1); limbs()[0]=1; limbs()[1]=value_; } } IntegerTemplate(word value_) { assignWordNoFree(value_); } IntegerTemplate(IntegerTemplate const & value_) { if(value_.hasLimbs()) { copy(value_); } else data=value.data; } /* Integer(mpz_t value_) { mpz_init_set(value,value_); }*/ ~IntegerTemplate() { if(hasLimbs())doFree(); } IntegerTemplate& operator=(const IntegerTemplate& a) { if(this!=&a) { if(hasLimps())doFree(); copy(a); } return *this; } bool isZero()const{ return data==0; } friend std::ostream &operator<<(std::ostream &f, IntegerTemplate const &a) { if(hasLimps()) { LimpWord *p=limbs(); int l=*p++; for(int i=0;i Integer; }; #endif #endif /* LIB_Z_H_ */ gfan0.8beta/src/parser.cpp0000664000175000017500000003735015177170257015202 0ustar andersanders#include "parser.h" #include #include #include #include "printer.h" #include "field_rationals.h" #include "field_rationalfunctions.h" #include "field_zmodpz.h" #include #include #include "log.h" using namespace std; static string variableIndexToString(int i) { // fprintf(Stderr,"I:%i\n",i); static char s[4]; if(i>=0 && i<26)sprintf(s,"%c",i+'a'); else if(i>=26 && i<52)sprintf(s,"%c",i+'A'-26); else assert(0); return string(s); } //-------------------------------------------------- // Parser //-------------------------------------------------- void Parser::parserError(const char *expected, char c) { fprintf(Stderr,"PARSER ERROR: Expected: \"%s\" Found: \"%c\"\n",expected,c); } //-------------------------------------------------- // CharacterBasedParser //-------------------------------------------------- PolynomialRing CharacterBasedParser::azAZ(Field const &f, int n) { assert(n<=52); vector na(n); for(int i=0;i='0' && c<='9') { ret=ret*f.zHomomorphism(10)+f.zHomomorphism(c-'0'); c=getChar(); } else break; } ungetChar(c); return ret; } int CharacterBasedParser::parseInt() { int ret=0; int c=getChar(); int numberOfDigits=0; while(c!=0 && (c=='\t' || c==' ' || c=='\n' || c==10 || c==13))c=getChar(); if(c=='-')return -parseInt(); if(c=='(')//allow parentheses for Laurent exponents { ungetChar(c); IntegerVector v=parseIntegerVector(); assert(v.size()==1); return v[0]; } while(c!=0) { if(c>='0' && c<='9') { numberOfDigits++; assert(numberOfDigits<10); ret=ret*10+(c-'0'); c=getChar(); } else break; } ungetChar(c); return ret; } double CharacterBasedParser::parseFloat() { double ret=0; static char s[64]; int i=0; int c=nextNonBlank(); while(i<64 && ((c>='0' && c<='9') || c=='.' || c=='-') ) { s[i++]=c; c=getChar(); } assert(i<64); s[i]=0; ungetChar(c); sscanf(s,"%lf",&ret); //does this work? Are we reading floats or doubles? return ret; } ComplexNumber CharacterBasedParser::parseComplexNumber() { FloatVector v=parseFloatVector(); assert(v.size()==2); return ComplexNumber(v[0],v[1]); } FieldElement CharacterBasedParser::parseFieldElement(Field const &f) { // return FieldElement(parseInt()); FieldElement a=parseFieldElementFromInteger(f); int c=nextNonBlank(); // debug<<"parseFieldElement called with next non-blank:"<='a' && c<='z') || (c>='A' && c<='Z'); } bool CharacterBasedParser::isDigit(int c) { return (c>='0' && c<='9'); } int CharacterBasedParser::variableIndex(int c) { if(c>='a' && c<='z')return c-'a'; if(c>='A' && c<='Z')return c-'A'+26; assert(0); return 0; } static bool isVariableCharacter(int c) { return ((c>='a' && c<='z')||(c>='A' && c<='Z')||(c>='0' && c<='9')||(c=='_' || c==']' || c=='[')); } Monomial CharacterBasedParser::parseMonomial(PolynomialRing const &r) { // fprintf(Stderr,"Atest\n"); int dimension=r.getNumberOfVariables(); // fprintf(Stderr,"Dim%i\n",dimension); /* Parses a monomial without spaces and without sign */ // Monomial m(IntegerVector((dimension==-1)?0:dimension)); Monomial m(r,IntegerVector(dimension)); IntegerVector &ret=m.exponent; int c=nextNonBlank(); // int c=getChar(); if(c=='1')return m; while(c!=0 && (c=='\t' || c==' ' || c=='\n' || c==10 || c==13))c=getChar(); while(c!=0) { string name; while(isVariableCharacter(c)) { name+=c; if(r.variableIndex(name)!=-1)break; c=getChar(); } if(r.variableIndex(name)!=-1) { //fprintf(Stderr,"NAME:%s\n",name.c_str()); int index=r.variableIndex(name); int exponent=1; if(dimension==-1) ret.grow(index+1); else assert(index(r.getField().implementingObject); if(fp) { // debug<<"Rational functions detected\n"; auto names=r.getVariableNames(); names.push_back(fp->parameterName); PolynomialRing R(fp->coefficientField,names); // debug<polynomialEmbedding( Polynomial( Term(t.second, Monomial(fp->thePolynomialRing,IntegerVector::singleEntry(t.first.exponent[r.getNumberOfVariables()])) ) )) , Monomial(r,t.first.exponent.subvector(0,r.getNumberOfVariables())) ); } if(ret1.isMarked()) ret.mark(Monomial(r,ret1.getMarked().m.exponent.subvector(0,r.getNumberOfVariables()))); // debug<<"Converted:"<p.getNumberOfVariables())p.changeNumberOfVariables(q.getNumberOfVariables()); //if(p.getNumberOfVariables()>q.getNumberOfVariables())q.changeNumberOfVariables(p.getNumberOfVariables()); p+=q; // fprintf(Stderr,"test5\n"); } } else break; } // fprintf(Stderr,"parsePolynomialEnd\n"); // AsciiPrinter(Stderr).printPolynomial(p); // fprintf(Stderr,"parsePolynomialEnd\n"); if(!first) { firstMonomial.exponent.resize(p.getNumberOfVariables()); p.mark(firstMonomial); //AsciiPrinter(Stderr).printVector(firstMonomial.exponent); } //fprintf(Stderr,"parsePolynomial - End\n"); return p; } PolynomialSet CharacterBasedParser::parsePolynomialSet(PolynomialRing const &r) { // fprintf(Stderr,"%i\n",r.getNumberOfVariables()); PolynomialSet ret(r); int c=nextNonBlank(); if(!isLeftBracket(c)) { parserError("left bracket",c); assert(0); } c=nextNonBlank(); if(isRightBracket(c))return ret; ungetChar(c); do { ret.push_back(parsePolynomial(r)); } while((c=nextNonBlank())==','); assert(isRightBracket(c)); return ret; } PolynomialSetList CharacterBasedParser::parsePolynomialSetList(PolynomialRing const &r) { PolynomialSetList ret; int c=nextNonBlank(); assert(isLeftBracket(c)); do { ret.push_back(parsePolynomialSet(r)); } while((c=nextNonBlank())==','); assert(isRightBracket(c)); return ret; } IntegerVector CharacterBasedParser::parseIntegerVector() { list temp; int c=nextNonBlank(); assert(isLeftBracket(c)); do temp.push_back(parseInt()); while((c=nextNonBlank())==','); assert(isRightBracket(c)); IntegerVector ret(temp.size()); { int j=0; for(list::iterator i=temp.begin();i!=temp.end();i++) ret[j++]=*i; } return ret; } FloatVector CharacterBasedParser::parseFloatVector() { list temp; int c=nextNonBlank(); assert(isLeftBracket(c)); do temp.push_back(parseFloat()); while((c=nextNonBlank())==','); assert(isRightBracket(c)); FloatVector ret(temp.size()); { int j=0; for(list::iterator i=temp.begin();i!=temp.end();i++) ret[j++]=*i; } return ret; } ComplexVector CharacterBasedParser::parseComplexVector() { list temp; int c=nextNonBlank(); assert(isLeftBracket(c)); do temp.push_back(parseComplexNumber()); while((c=nextNonBlank())==','); assert(isRightBracket(c)); ComplexVector ret(temp.size()); { int j=0; for(list::iterator i=temp.begin();i!=temp.end();i++) ret[j++]=*i; } return ret; } IntegerVectorList CharacterBasedParser::parseIntegerVectorList() { IntegerVectorList ret; int c=nextNonBlank(); assert(isLeftBracket(c)); if((c=nextNonBlank())=='}')return ret; ungetChar(c); do ret.push_back(parseIntegerVector()); while((c=nextNonBlank())==','); assert(isRightBracket(c)); return ret; } IntegerVectorList CharacterBasedParser::parseIntegerVectorList4ti2() { IntegerVectorList ret; int m=parseInt(); int n=parseInt(); for(int i=0;i CharacterBasedParser::parseVariableList() { vector ret; int c=nextNonBlank(); assert(c=='['||c=='('); c=nextNonBlank(); if(c==']'||c==')') return ret; ungetChar(c); do { ret.push_back(parseVariableName()); c=nextNonBlank(); } while((c)==','); assert(c==']'||c==')'); return ret; } PolynomialRing CharacterBasedParser::parsePolynomialRing() { Field f=parseField(); vector variables=parseVariableList(); return PolynomialRing(f,variables); } Polynomial CharacterBasedParser::parsePolynomialWithRing() { PolynomialRing theRing=parsePolynomialRing(); return parsePolynomial(theRing); } PolynomialSet CharacterBasedParser::parsePolynomialSetWithRing() { // PolynomialSet ret(r); int c=nextNonBlankDoNotGet(); if(!isLeftBracket(c)) { PolynomialRing theRing=parsePolynomialRing(); return parsePolynomialSet(theRing); } PolynomialRing r=azAZ(Q); // fprintf(Stderr,"%i\n",r.getNumberOfVariables()); log3 AsciiPrinter(Stderr).printPolynomialRing(r); //fprintf(Stderr,"a\n"); PolynomialSet temp=parsePolynomialSet(r); //fprintf(Stderr,"a\n"); int n=temp.numberOfVariablesInUseConsecutive(); //fprintf(Stderr,"a\n"); PolynomialRing r2=azAZ(Q,n); //fprintf(Stderr,"a\n"); return temp.embeddedInto(r2); } PolynomialSetList CharacterBasedParser::parsePolynomialSetListWithRing() { // PolynomialSet ret(r); int c=nextNonBlankDoNotGet(); if(!isLeftBracket(c)) { PolynomialRing theRing=parsePolynomialRing(); return parsePolynomialSetList(theRing); } PolynomialRing r=azAZ(Q); PolynomialSetList temp=parsePolynomialSetList(r); assert(temp.size()); int n=temp.begin()->numberOfVariablesInUseConsecutive();//!!!!!!! PolynomialRing r2=azAZ(Q,n); PolynomialSetList ret; for(PolynomialSetList::const_iterator i=temp.begin();i!=temp.end();i++) ret.push_back(i->embeddedInto(r2)); return ret; } //-------------------------------------------------- // FileParser //-------------------------------------------------- int FileParser::getChar() { int c=getc(f); // fprintf(Stderr,"getChar c=\'%c\',%i\n",c,c); if(c==EOF)return 0; return c; } void FileParser::ungetChar(int c) { ungetc(c,f); } FileParser::FileParser(FILE *f) { this->f=f; } //-------------------------------------------------- // StringParser //-------------------------------------------------- int StringParser::getChar() { if(hasUngotten) { hasUngotten=false; return ungotten; } return s[index++]; } void StringParser::ungetChar(int c) { assert(hasUngotten==false); hasUngotten=true; ungotten=c; } StringParser::StringParser(const char *s): index(0), hasUngotten(false) { this->s=s; } gfan0.8beta/src/app_krulldimension.cpp0000664000175000017500000000260515177170257017600 0ustar andersanders#include "dimension.h" #include "printer.h" #include "parser.h" #include "buchberger.h" #include "gfanapplication.h" #include "multiplicity.h" class KrullDimensionApplication : public GFanApplication { SimpleOption isGroebnerBasisOption; SimpleOption optionNumberOfSolutions; public: KrullDimensionApplication(): isGroebnerBasisOption("-g","Tell the program that the input is already a reduced Groebner basis."), optionNumberOfSolutions("--nsolutions","When the ideal is zero-dimensional this option will give the number of solutions over the algebraic closure of the coefficient field.") { optionNumberOfSolutions.hide(); registerOptions(); } const char *name() { return "_krulldimension"; } int main() { FileParser P(Stdin); PolynomialSet g=P.parsePolynomialSetWithRing(); if(!isGroebnerBasisOption.getValue())buchberger(&g,StandardGradedLexicographicTermOrder()); int kd=krullDimension(g); pout< using namespace std; class IntegerGBApplication : public GFanApplication { SimpleOption gbOption; SimpleOption initialOption; SimpleOption gFanOption; SimpleOption gConeOption; SimpleOption listOption; SimpleOption optionInputIsGroebnerBasis; public: const char *helpText() { return "This program is an experimental implementation of Groebner bases for ideals in Z[x_1,...,x_n].\n" "Several operations are supported by specifying the appropriate option:\n" " (1) computation of the reduced Groebner basis with respect to a given vector (tiebroken lexicographically),\n" " (2) computation of an initial ideal,\n" " (3) computation of the Groebner fan,\n" " (4) computation of a single Groebner cone.\n" "Since Gfan only knows polynomial rings with coefficients being elements of a field, the ideal is specified by giving a set of polynomials in the polynomial ring Q[x_1,...,x_n]. That is, by using Q instead of Z when specifying the ring. The ideal MUST BE HOMOGENEOUS (in a positive grading) for computation of the Groebner fan. Non-homogeneous ideals are allowed for the other computations if the specified weight vectors are positive.\n" "NOTE: This program is experimental and expected to change behaviour in future releases, so don't write your SAGE and M2 interfaces just yet.\n"; } IntegerGBApplication(): gbOption("--groebnerBasis","Asks the program to compute a marked Groebner basis with respect to a weight vector tie-broken lexicographically.\n" "The input order is: Ring ideal vector.\n"), initialOption("--initialIdeal","Asks the program to compute an initial ideal with respect to a vector. " "The input order is: Ring ideal vector.\n"), gFanOption("--groebnerFan","Asks the program to compute the Groebner fan. \n " "The input order is: Ring ideal.\n"), gConeOption("--groebnerCone","Asks the program to compute a single Groebner cone containing the specified vector in its relative interior. The output is stored as a fan. " "The input order is: Ring ideal vector."), listOption("-m","For the operations taking a vector as input, read in a list of vectors instead, and perform the operation for each vector in the list."), optionInputIsGroebnerBasis("-g", "Tells the program that the input is already a Groebner basis (with the initial term of each polynomial being " "the first ones listed). Use this option if the usual --groebnerFan is too slow.\n") { registerOptions(); } const char *name() { return "_overintegers"; } int main() { if(gbOption.getValue()+initialOption.getValue()+gFanOption.getValue()+gConeOption.getValue()!=1) { debug<<"WRONG COMBINATION OF COMMAND LINE OPTIONS\n"; assert(0); } LexicographicTermOrder tieBreaker; FileParser P(Stdin); PolynomialSet a=P.parsePolynomialSetWithRing(); int n=a.getRing().getNumberOfVariables(); // IntegerVectorList omegas=P.parseIntegerVectorList(); if(gFanOption.getValue()) { SymmetryGroup G(n); SymmetricTargetFanBuilder target(n,G); if(optionInputIsGroebnerBasis.getValue()) { IntegerVectorList empty; IntegerVector w=PolyhedralCone(wallInequalities(a),empty).getRelativeInteriorPoint(); WeightReverseLexicographicTermOrder tieBreaker(w); zAutoReduce(&a,tieBreaker); } else { WeightReverseLexicographicTermOrder tieBreaker(IntegerVector::allOnes(n)); zBuchberger(a,tieBreaker); } IntegerGroebnerFanTraverser traverser(a); symmetricTraverse(traverser,target); AsciiPrinter Q(Stdout); target.getFanRef().printWithIndices(&Q, FPF_default); } else { IntegerVectorList omegas; if(listOption.getValue()) omegas=P.parseIntegerVectorList(); else omegas.push_back(P.parseIntegerVector()); for(IntegerVectorList::const_iterator i=omegas.begin();i!=omegas.end();i++) { if(i->size()!=a.getRing().getNumberOfVariables()) { debug<<"ERROR: The number of entries of the weight vector is not equal to the number of variables in the ring.\n"; assert(0); } if(gbOption.getValue()) { WeightTermOrder T(*i); zBuchberger(a,T); pout< #include #include "polyhedralcone.h" #include "symmetry.h" /** * The BSPTree is binary space partition tree. Its main feature is that it can be used to recover convex connected * components of complements to unions of cones. However, with the algorithm of [Jensen, Yu], it is no longer an * advantage to create the tree. In fact, doing so in higher dimensions is bad. Therefore the tree is not constructed * until buildTree is called. Notice that this can happen in the constructor. * * The main functionality of the BSPTree class is therefore now to store symmetric fans compactly via the SmallCone class. * The method regionFast() may be called even when the tree has not been build. */ class BSPTree { public: #if 1 typedef struct SmallCone{ IntegerVector permutation; PolyhedralCone const *theCone; SmallCone(PolyhedralCone const *theCone_, IntegerVector const &permutation_): permutation(permutation_), theCone(theCone_) { } IntegerVectorList getEquations()const { IntegerVectorList ret;SymmetryGroup::appendPermutedIntegerVectorList(theCone->getEquations(),permutation,ret);return ret; //return SymmetryGroup::permuteIntegerVectorList(theCone->getEquations(),permutation); } void assignEquation(IntegerVector &dest)const { IntegerVectorList const &l=theCone->getEquations(); assert(l.size()==1); permutation.composeAssign(l.front(),dest); // SymmetryGroup::composeAssign(permutation,l.front(),dest); } IntegerVectorList getHalfSpaces()const { IntegerVectorList ret;SymmetryGroup::appendPermutedIntegerVectorList(theCone->getHalfSpaces(),permutation,ret);return ret; // return SymmetryGroup::permuteIntegerVectorList(theCone->getHalfSpaces(),permutation); } IntegerVectorList generatorsOfLinealitySpace()const { IntegerVectorList ret;SymmetryGroup::appendPermutedIntegerVectorList(theCone->generatorsOfLinealitySpace(),permutation,ret);return ret; // return SymmetryGroup::permuteIntegerVectorList(theCone->generatorsOfLinealitySpace(),permutation); } void appendGeneratorsOfLinealitySpace(IntegerVectorList &ret)const { SymmetryGroup::appendPermutedIntegerVectorList(theCone->generatorsOfLinealitySpace(),permutation,ret); } IntegerVectorList extremeRays()const { IntegerVectorList ret;SymmetryGroup::appendPermutedIntegerVectorList(theCone->extremeRays(),permutation,ret);return ret; // return SymmetryGroup::permuteIntegerVectorList(theCone->extremeRays(),permutation); } void appendExtremeRays(IntegerVectorList &ret)const { SymmetryGroup::appendPermutedIntegerVectorList(theCone->extremeRays(),permutation,ret); } bool contains(IntegerVector const &v)const { return theCone->contains(SymmetryGroup::composeInverse(permutation,v)); } bool containsPerturbed(IntegerVectorList const &l)const { if(!contains(l.front()))return false; return theCone->containsPerturbed(SymmetryGroup::permuteInverseIntegerVectorList(permutation,l)); } bool doesSatisfyInequalityExpensive(IntegerVector const &ineq)const { //IntegerVector ineq2=SymmetryGroup::composeInverse(permutation,ineq); static IntegerVector ineq2; permutation.composeInverseAssign(ineq,ineq2); return theCone->doesSatisfyInequalityExpensive(ineq2); } /* * 1: before * 0: same * -1: after */ static bool beforeNonPert(IntegerVector const &u, IntegerVector const &p, IntegerVector const &h1, IntegerVector const &h2) { /* * The ray is (after scaling) parameterized as follows * v(t)=tu+b * where t goes from infinity through 0 to minus infinity. * * The times for intersection are * t_i=(hi*b)/(-u*hi) * WLOG we assume that u*hi>0 * * Hence we check if * (h1*b)*(u*h2) < (h2*b)*(u*h1) */ int64 uh1,uh2,ph1,ph2; dotLong4(u,p,h1,h2,uh1,uh2,ph1,ph2); bool flag=(uh1<0)^(uh2<0); if(ph1*uh2>ph2*uh1)return false^flag; if(ph1*uh2getEquations().front(); IntegerVectorList const &inequalities=theCone->getHalfSpaces(); //Does this copy the list? bool passesThroughClosed=true; bool passesThroughInterior=true; for(IntegerVectorList::const_iterator j=inequalities.begin();j!=inequalities.end();j++) { int64 ju=dotLong(*j,u2); if(ju==0) { int64 jp=dotLong(*j,p2); if(jp<=0)passesThroughInterior=false; if(jp<0)passesThroughClosed=false; } else if(ju>0) { int b=beforeNonPert(u2,p2,*j,equation); if(b==1) { passesThroughInterior=false; passesThroughClosed=false; } if(b==0) passesThroughInterior=false; } else { int b=beforeNonPert(u2,p2,equation,*j); if(b==1) { passesThroughInterior=false; passesThroughClosed=false; } if(b==0) passesThroughInterior=false; } if(!passesThroughClosed && !passesThroughInterior)break; } if(passesThroughInterior)return 2; return (passesThroughClosed); } int multiplicity()const { return theCone->getMultiplicity(); } }SmallCone; #else typedef PolyhedralCone SmallCone; #endif int n; // vector const &theCones; vector const &theCones; vector hyperplanes; class Node { public: Node *leftRight[2]; IntegerVector normal; vector conesInHyperplane; Node(Node *left_,Node *right_,IntegerVector const &normal_, vector const &conesInHyperplane_): normal(normal_), conesInHyperplane(conesInHyperplane_) { leftRight[0]=left_; leftRight[1]=right_; } }; Node *root; bool hasBeenBuilt; static vector buildPointers(vector const &v) { vector ret; for(int i=0;i const &active); BSPTree(int n_, vector const &theCones_, PolyhedralCone const *restrictingCone=0, bool doBuild=true); static bool isOnRightHandSide(IntegerVectorList const &omega, IntegerVector const &normal); static PolyhedralCone glue(PolyhedralCone A, PolyhedralCone B, IntegerVector const &normal); PolyhedralCone regionRek(PolyhedralCone const &C, IntegerVectorList const &omega, const Node *tree)const; PolyhedralCone region(IntegerVectorList const &omega)const; static void printRek(Node const *p); void print()const; int numberOfRegionsRek(Node const *v)const; int numberOfRegions()const; IntegerVector heuristic1(PolyhedralCone const ®ion, vector const &active); IntegerVector heuristic2(PolyhedralCone const ®ion, vector const &active); //Routines for avoiding BSP tree expansion: bool isInComplement(IntegerVector const &v)const; IntegerVector randomVectorInComplement()const; IntegerVector perturbationToVectorInComplement(IntegerVector const &u, IntegerVector const &normal)const; IntegerVector firstIntersectionNormal(IntegerVector const &u, IntegerVector const &p,vector::const_iterator i)const; PolyhedralCone regionFast(IntegerVector const &v)const; /** * Computes the multiplicity at a generic perturbation of v in the hyperplane defined by normal. */ int multiplicity(IntegerVector const &v, IntegerVector const &normal)const; }; #endif /* BSPTREE_H_ */ gfan0.8beta/src/lll.h0000664000175000017500000000105215177170257014124 0ustar andersanders#ifndef LLL_H_INCLUDED #define LLL_H_INCLUDED #include "vektor.h" #include "matrix.h" using namespace std; IntegerMatrix mlll(IntegerMatrix &b, IntegerMatrix *inverseTransposedM=0);//LLL reduce the rows of b. The non-zero rows of b are put at the bottom rows. The returned matrix M satisfies: newb=M*oldb. The inverse transposed of M can also be computed. IntegerMatrix latticeKernelOfTransposed(IntegerMatrix const &B);//The rows of the returned matrix is a lattice basis for the integer kernal of the transposed of B. //int rank(basis_i B); #endif gfan0.8beta/src/traverser_bsptree.cpp0000664000175000017500000000610215177170257017436 0ustar andersanders/* * traverser_bsptree.cpp * * Created on: Aug 23, 2011 * Author: anders */ #include "traverser_bsptree.h" #include "parser.h" BSPTreeTraverser::BSPTreeTraverser(int n_, BSPTree const & tree_): ConeTraverser(n_), tree(tree_) { IntegerVectorList omega=IntegerMatrix::identity(n).getRows(); theCone=tree.region(omega); theCone.canonicalize(); } void BSPTreeTraverser::changeCone(IntegerVector const &ridgeVector, IntegerVector const &rayVector) { IntegerVectorList omega; omega.push_back(ridgeVector); omega.push_back(rayVector); //debug<<"OMEGA"<>old; D(theCone); debug>>theCone; assert(0); }*/ IntegerVector lastFacetVector=ridgeVector; IntegerVectorList temp=old.faceContaining(ridgeVector).getEquations(); assert(temp.size()==1); IntegerVector lastFlipDirection=temp.front(); if(dotLong(lastFlipDirection,rayVector)<0)lastFlipDirection=-lastFlipDirection; // debug< #include "polynomial.h" using namespace std; /* * These are the classes for the field of multivariate rational functions. * At the moment this code has the option of falling back on Singulars factory library for computing multivariate gcds. */ class FieldRationalFunctions2Implementation : public FieldImplementation { PolynomialRing thePolynomialRing; FieldElementImplementation *zHomomorphismImplementation(int n);/* Creates FieldElementImplementation object with refcount1 */ FieldElement zHomomorphism(int n); const char *name(); std::string toString()const; public: virtual bool isRationals()const; int getCharacteristic()const; PolynomialRing getPolynomialRing()const; FieldRationalFunctions2Implementation(PolynomialRing const &r); // PolynomialRing getPolynomialRing()const; }; // Let's see how inheritance and slicing works together class FieldRationalFunctions2 : public Field { public: FieldRationalFunctions2(PolynomialRing const &r); FieldElement polynomialToFraction(Polynomial const &p); }; std::pair getNumeratorAndDenominatorOfRationalFunction2(FieldElement const &e); /** * Creates a polynomial ring where * After having */ PolynomialRing makeVariablesParameters(PolynomialRing const &r, int numberOfParameters); Polynomial makeVariablesParameters(PolynomialRing const &genericRing, Polynomial const &p); PolynomialSet makeVariablesParameters(PolynomialRing const &genericRing, PolynomialSet const &p); #endif gfan0.8beta/src/app_ismarkedgroebnerbasis.cpp0000664000175000017500000000220115177170257021076 0ustar andersanders#include "vektor.h" #include "printer.h" #include "parser.h" #include "gfanapplication.h" #include "newtonpolytope.h" #include "buchberger.h" #include "wallideal.h" #include "log.h" class IsMarkedGroebnerBasisApplication : public GFanApplication { public: const char *helpText() { return "This program checks if a set of marked polynomials is a Groebner basis with respect to its marking. First it is checked if the markings are consistent with respect to a positive vector. Then Buchberger's S-criterion is checked. The output is boolean value.\n"; } IsMarkedGroebnerBasisApplication() { registerOptions(); } const char *name() { return "_ismarkedgroebnerbasis"; } int main() { FileParser P(Stdin); PolynomialSet g=P.parsePolynomialSetWithRing(); bool isConsistent=isMarkingConsistent(g); log1 fprintf(Stderr,"Is marking consistent:%i\n",isConsistent); bool isGroebnerBasis=isConsistent; if(isGroebnerBasis) isGroebnerBasis=isMarkedGroebnerBasis(g); fprintf(Stdout,isGroebnerBasis?"true\n":"false\n"); return 0; } }; static IsMarkedGroebnerBasisApplication theApplication; gfan0.8beta/src/app_intsinpolytope.cpp0000664000175000017500000001067215177170257017644 0ustar andersanders#include "vektor.h" #include "printer.h" #include "parser.h" #include "gfanapplication.h" #include "intsinpolytope.h" #include "lattice.h" #include "determinant.h" class IntsInPolytopeApplication : public GFanApplication { public: bool includeInDefaultInstallation() { return false; } IntsInPolytopeApplication() { registerOptions(); } const char *name() { return "_intsinpolytope"; } // a is a squarematrix whose rows span a simplicial cone bool isInSimplicialCone(IntegerMatrix const &a, IntegerVector const &v) { for(int i=0;i > partsOfZBases(set > const &s, IntegerMatrix const &M) { set > setsToCheck; for(set >::const_iterator i=s.begin();i!=s.end();i++) { for(int j=0;j temp=*i; temp.insert(j); if(temp.size()!=i->size()) { bool isOK=true; /* if(temp.size()==5) { IntegerMatrix MM(5,5); int I=0; for(set::const_iterator k=temp.begin();k!=temp.end();k++,I++) { MM[I]=M[*k]; } IntegerVector v(5); v[0]=2;//????????????????????????????????????????????????? v[1]=2; v[2]=2; v[3]=17; v[4]=8; if(!isInSimplicialCone(MM,v)) isOK=false; }*/ if(isOK) for(set::const_iterator k=temp.begin();k!=temp.end();k++) { set temp2=temp; temp2.erase(*k); if(s.count(temp2)==0) { isOK=false; break; } } if(isOK) { static int c; c++; if(!(c&4095))fprintf(stderr,"tocheck:%i\n",c); /* if(temp.size()==5) { IntegerMatrix MM(5,5); int I=0; for(set::const_iterator k=temp.begin();k!=temp.end();k++,I++) { MM[I]=M[*k]; } fprintf(stderr,"Candidate:\n"); AsciiPrinter(Stderr).printVectorList(MM.getRows()); }*/ setsToCheck.insert(temp); } } } } fprintf(stderr,"Sets to test: %i\n",(int)setsToCheck.size()); set > ret; for(set >::const_iterator i=setsToCheck.begin();i!=setsToCheck.end();i++) { static int c; c++; if(!(c&4095))fprintf(stderr,"%i\n",c); IntegerVectorList l; for(set::const_iterator j=i->begin();j!=i->end();j++) l.push_back(M[*j]); if(isPartOfAZBasis(l))ret.insert(*i); } fprintf(stderr,"Produced sets: %i\n",(int)ret.size()); return ret; } int main() { FileParser p(Stdin); IntegerVectorList ivl=p.parseIntegerVectorList(); IntegerMatrix A=rowsToIntegerMatrix(ivl);//.transposed(); IntegerVector rightHandSide=p.parseIntegerVector(); IntegerVector v=p.parseIntegerVector(); AsciiPrinter P(stdout); fprintf(Stdout,"Lattice Kernel:\n"); IntegerVectorList l=intsInPolytopeGivenIneqAndPt(A,rightHandSide,v); P.printVectorList(l); // return 0;//!!!!!!!!!!!!!!!!!!!!!!!! // P.printVectorList(intsInPolytopeGivenIneq(A,rightHandSide)); { IntegerVectorList l2; for(IntegerVectorList::const_iterator i=l.begin();i!=l.end();i++) { IntegerVector temp(i->size()+1); temp[0]=1; for(int j=0;jsize();j++)temp[j+1]=(*i)[j]; l2.push_back(temp); /* IntegerVectorList k; k.push_back(*i); if(isPartOfAZBasis(k)) P.printVector(*i); */ } IntegerVectorList l3; for(IntegerVectorList::const_iterator i=l2.begin();i!=l2.end();i++) //if(((*i)[1]<=2)&&((*i)[2]<=2)&&((*i)[3]<=17)&&((*i)[4]<=8)) l3.push_back(*i); // if(((*i)[0]<=2)&&((*i)[1]<=2)&&((*i)[2]<=17)&&((*i)[3]<=8))l3.push_back(*i); IntegerMatrix M=rowsToIntegerMatrix(l3); P.printVectorList(M.getRows()); fprintf(stdout,"size:%i\n",M.getHeight()); set > s; s.insert(set()); for(int i=0;i<5;i++) { s=partsOfZBases(s,M); for(set >::const_iterator i=s.begin();i!=s.end();i++) { for(set::const_iterator j=i->begin();j!=i->end();j++) { // fprintf(stderr,"%i ",*j); } // fprintf(stderr,"\n"); } // fprintf(stderr,"\n\n\n\n"); } } return 0; } const char *helpText() { return "This program computes the integer points in a polytope.\n"; } }; static IntsInPolytopeApplication theApplication; gfan0.8beta/src/polymakefile.cpp0000664000175000017500000002304115177170257016357 0ustar andersanders#include "polymakefile.h" #include "printer.h" #include "log.h" #include #include bool PolymakeFile::xmlForced=false; static void eatComment2(int &c, stringstream &s) { if(c=='#') { do c=s.get(); while(c!='\n' && !s.eof()); } } static void eatComment(stringstream &s) { int c=s.get(); while(c==' '||c=='\t')c=s.get(); eatComment2(c,s); s.unget(); } PolymakeProperty::PolymakeProperty(const string &name_, const string &value_, bool embedded_): name(name_), value(value_), embedded(embedded_) { } static string readUntil(FILE *f, int c) { stringstream ret; int c2; c2=fgetc(f); while(c2!=c && c2!=EOF) { ret<\n"); for(list::const_iterator i=properties.begin();i!=properties.end();i++) { if(i->embedded) { fprintf(f,"\n",mapToPolymakeNames(i->name.c_str()),i->value.c_str()); } else { fprintf(f,"\n",mapToPolymakeNames(i->name.c_str())); fprintf(f,"%s",i->value.c_str()); fprintf(f,"\n"); } } fprintf(f,"\n"); } else { fprintf(f,"_application %s\n",application.c_str()); fprintf(f,"_version 2.2\n"); fprintf(f,"_type %s\n",type.c_str()); for(list::const_iterator i=properties.begin();i!=properties.end();i++) { fprintf(f,"\n%s\n",i->name.c_str()); fprintf(f,"%s",i->value.c_str()); } } fclose(f); } void PolymakeFile::writeStream(ostream &file) { if(isXml) { file << "\n"; file << "\n"; for(list::const_iterator i=properties.begin();i!=properties.end();i++) { if(i->embedded) { file << "name.c_str())<< "\" value=\""<value.c_str()<<"\" />\n"; } else { file << "name.c_str()) << "\">\n"; file << i->value.c_str(); file << "\n"; } } file << "\n"; } else { file << "_application " << application << endl; file << "_version 2.2\n"; file << "_type " << type << endl; for(list::const_iterator i=properties.begin();i!=properties.end();i++) { file << endl << i->name.c_str() << endl; file << i->value; } } } list::iterator PolymakeFile::findProperty(const char *p) { string s(p); for(list::iterator i=properties.begin();i!=properties.end();i++) { if(s==i->name)return i; } return properties.end(); } void PolymakeFile::writeProperty(const char *p, const string &data, bool embedded) { if(hasProperty(p)) { assert(0); } properties.push_back(PolymakeProperty(string(p),data,embedded)); } bool PolymakeFile::hasProperty(const char *p, bool doAssert) { if(doAssert) if(findProperty(p)==properties.end()) { fprintf(stderr,"Property: \"%s\" not found in file.\n",p); assert(0); } return findProperty(p)!=properties.end(); } int PolymakeFile::readCardinalProperty(const char *p) { assert(hasProperty(p,true)); list::iterator prop=findProperty(p); stringstream s(prop->value); int ret; s>>ret; return ret; } void PolymakeFile::writeCardinalProperty(const char *p, int n) { stringstream t; if(isXml) { t<::iterator prop=findProperty(p); stringstream s(prop->value); for(int i=0;i>v; ret[i][j]=v; } return ret; } void PolymakeFile::writeMatrixProperty(const char *p, const IntegerMatrix &m, bool indexed, const vector *comments) { stringstream t; if(comments)assert(comments->size()>=m.getHeight()); if(isXml) { t << "\n"; for(int i=0;i"; for(int j=0;j\n"; } t << "\n"; } else { for(int i=0;i\n"; for(int i=0;i"; for(int j=0;j\n"; } t << "\n"; } else { for(int i=0;i readIntList(istream &s) { list ret; int c=s.peek(); while((c>='0') && (c<='9')|| (c==' ')) { // fprintf(Stderr,"?\n"); int r; s >> r; ret.push_back(r); c=s.peek(); } return ret; } vector > PolymakeFile::readMatrixIncidenceProperty(const char *p) { vector > ret; assert(hasProperty(p,true)); list::iterator prop=findProperty(p); stringstream s(prop->value); while((s.peek()!=-1)&&(s.peek()!='\n')&&(s.peek()!=0)) { // fprintf(Stderr,"!\n"); int c=s.get(); //fprintf(Stderr,"%i",c); assert(c=='{'); ret.push_back(readIntList(s)); c=s.get(); assert(c=='}'); c=s.get(); while(c==' ' || c=='\t')c=s.get(); eatComment2(c,s); assert(c=='\n'); } return ret; } void PolymakeFile::writeIncidenceMatrixProperty(const char *p, const vector > &m, int baseSetSize) { stringstream t; if(isXml) { t<<""; for(int i=0;i"; list temp=m[i]; temp.sort(); for(list::const_iterator j=temp.begin();j!=temp.end();j++) { if(j!=temp.begin())t<<' '; t<< *j; } t<<"\n"<\n"; } else { for(int i=0;i temp=m[i]; temp.sort(); for(list::const_iterator j=temp.begin();j!=temp.end();j++) { if(j!=temp.begin())t<<' '; t<< *j; } t<<'}'<::iterator prop=findProperty(p); stringstream s(prop->value); list temp=readIntList(s); IntegerVector ret(temp.size()); int I=0; for(list::const_iterator i=temp.begin();i!=temp.end();i++,I++)ret[I]=*i; return ret; } void PolymakeFile::writeCardinalVectorProperty(const char *p, IntegerVector const &v) { stringstream t; if(isXml) { t<<""; for(int i=0;i\n"; } else { for(int i=0;idivides(x))break; i++; } return i; } static int rek(IntegerVectorList const &b, IntegerVector &x, IntegerVectorList &output) { // fprintf(stdout,"rek\n"); // AsciiPrinter(Stdout).printVector(x); int ret=1; output.push_back(x); for(IntegerVectorList::const_iterator i=b.begin();i!=b.end();i++) { x+=*i; if(x.isNonNegative()) if(findImproving(b,x)==i)ret+=rek(b,x,output); x-=*i; } return ret; } bool solveIntegerProgramIneq(IntegerMatrix const &M, IntegerVector const &rightHandSide, IntegerVector &solution) { int d=M.getHeight(); int n=M.getWidth(); IntegerMatrix M2(d,n+d); for(int i=0;i static Polynomial wallPolynomial(Polynomial const &p, Subspace const &subspace) // This routine should be deleted since it is inefficient // hmm... does this actually work? { Polynomial r(p.getRing()); IntegerVector markedExponent=p.getMarked().m.exponent; for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) { IntegerVector dif=markedExponent-i->first.exponent; if(subspace.contains(dif)) r+=Polynomial(Term(i->second,i->first)); } r.mark(Monomial(p.getRing(),markedExponent)); return r; } static PolynomialSet wallIdeal(PolynomialSet const &groebnerBasis, Subspace const &subspace) { // fprintf(Stderr,"wallIdeal %i",perp.size()); PolynomialSet ret(groebnerBasis.getRing()); for(PolynomialSet::const_iterator i=groebnerBasis.begin();i!=groebnerBasis.end();i++) ret.push_back(wallPolynomial(*i,subspace)); // fprintf(Stderr,"done\n"); return ret; } BergmanFan bergmanRayIntersection(PolynomialSet const &idealGroebnerBasis, int d) // Input ideal is assumed to be homogeneous with respect to a positive vector // Input ideal is assumed not to contain a monomial // Call the Krull dimensionn of the ring/ideal d // The ideal is homogenous with respect to a vector space of dimension d-1 // All d dimensional cones in the Gro\"obner fan with no monomials are computed { BergmanFan bfan; int n=idealGroebnerBasis.numberOfVariablesInRing(); // log0 AsciiPrinter(Stderr).printPolynomialSet(idealGroebnerBasis); if(d==-1)d=krullDimension(idealGroebnerBasis); PolyhedralFan bergmanFan(n); PolynomialSet tropBasis=tropicalBasisOfCurve(n,idealGroebnerBasis,&bergmanFan,d-1); // PolyhedralFan bergmanFan=tropicalPrincipalIntersection(n,tropBasis,d-1); IntegerVectorList rays=bergmanFan.getRays(d); int maximalConeLabel=0; // fprintf(Stderr,"---------------------------------------------------------\n"); // AsciiPrinter(Stderr).printVectorList(rays); // fprintf(Stderr,"---------------------------------------------------------\n"); log2 cerr<<"BBLABL"; for(IntegerVectorList::const_iterator i=rays.begin();i!=rays.end();i++) { log2 cerr<<"1"; PolynomialSet g=idealGroebnerBasis; g=GE_groebnerBasis(g,WeightReverseLexicographicTermOrder(*i),true,false);//Set to true? // buchberger(&g,WeightReverseLexicographicTermOrder(*i)); PolynomialSet cg=initialFormsAssumeMarked(g,*i); log2 cerr<<"2"; bool inList=false; for(BergmanFan::MaximalConeList::const_iterator j=bfan.cones.begin();j!=bfan.cones.end();j++) { if(areIdealsEqual(j->coneGroebnerBasis,cg)) { inList=true; break; } } log2 cerr<<"3"; if(!inList) { bfan.cones.push_back(BergmanFan::MaximalCone(cg,g,true,maximalConeLabel++)); } log2 cerr<<"4"; } log2 cerr<<"BBLAB END"; // AsciiPrinter temp(Stderr); // bfan.print(temp); return bfan; } BergmanFan bergmanRay(PolynomialSet const &idealGroebnerBasis) // Input ideal is assumed to be homogeneous with respect to a positive vector // Input ideal is assumed not to contain a monomial // Call the Krull dimensionn of the ring/ideal d // The ideal is homogenous with respect to a vector space of dimension d-1 // All d dimensional cones in the Gro\"obner fan with no monomials are computed { BergmanFan bfan; EnumerationTargetCollector gfan; LexicographicTermOrder myTermOrder; ReverseSearch rs(myTermOrder); rs.setEnumerationTarget(&gfan); rs.enumerate(idealGroebnerBasis); int n=idealGroebnerBasis.numberOfVariablesInRing(); fprintf(Stderr,"rankOfMatrix(wallin.idealGroebnerBasis=%i\n",rankOfMatrix(wallInequalities(idealGroebnerBasis))); AsciiPrinter(Stderr).printVectorList(wallInequalities(idealGroebnerBasis)); int d=n-rankOfMatrix(wallInequalities(idealGroebnerBasis))+1; int krull=krullDimension(idealGroebnerBasis); //AsciiPrinter(Stderr).printVectorList(wallInequalities(idealGroebnerBasis)); assert(rankOfMatrix(wallInequalities(idealGroebnerBasis))==Subspace(wallInequalities(idealGroebnerBasis)).dimension()); // fprintf(Stderr,"d: %i krull: %i\n",d,krull); // assert(d==krull); int maximalConeLabel=0; for(PolynomialSetList::const_iterator g=gfan.theList.begin();g!=gfan.theList.end();g++) { PolynomialSetList s; //fprintf(Stderr,"current gbasis:\n"); //AsciiPrinter(Stderr).printPolynomialSet(*g); if(0) { s=fullColoredIdeals(*g,false); fprintf(Stderr,"Full colored ideals computed, #=%i\n",(int)s.size()); } else { IntegerVectorList inequalities=wallInequalities(*g); inequalities=wallFlipableNormals(*g,true); int isize=inequalities.size(); // fprintf(Stderr,"cdd facets to rays "); // AsciiPrinter(Stderr).printVectorList(inequalities); IntegerVectorList rays=extremeRaysInequalityIndices(inequalities); //fprintf(Stderr,"done\n"); //AsciiPrinter(Stderr).printVectorList(rays); // AsciiPrinter(Stderr).printVectorList(rays); for(IntegerVectorList::const_iterator i=rays.begin();i!=rays.end();i++) if(i->size()!=isize) { IntegerVectorList perp; int j=0; int K=0; for(IntegerVectorList::const_iterator k=inequalities.begin();k!=inequalities.end()&&jsize();k++,K++) if((*i)[j]==K) { perp.push_back(*k); j++; } s.push_back(wallIdeal(*g,Subspace(perp))); } } //fprintf(Stderr,"Number of face ideals to check:%i\n",s.size()); for(PolynomialSetList::const_iterator i=s.begin();i!=s.end();i++) { //fprintf(Stderr,"d:%i\n",d); //fprintf(Stderr,"krull:%i\n",krull); //fprintf(Stderr,"n:%i\n",n); //fprintf(Stderr,"rank: %i\n",rankOfMatrix(wallInequalities(*i))); assert(i->isMarked()); // fprintf(Stderr,"d: %i, rank %i",d,n-rankOfMatrix(wallInequalities(*i))); if(d==n-rankOfMatrix(wallInequalities(*i)))//dimension check { // fprintf(Stderr,"Checking monomial containment"); if(!containsMonomial(*i)) { // fprintf(Stderr,"Done - no\n"); PolynomialSet cg=*i; //buchberger(&cg,StandardGradedLexicographicTermOrder()); The cg is already a Groebner basis bool inList=false; for(BergmanFan::MaximalConeList::const_iterator j=bfan.cones.begin();j!=bfan.cones.end();j++) { if(areIdealsEqual(j->coneGroebnerBasis,cg)) { inList=true; break; } } if(!inList) { bfan.cones.push_back(BergmanFan::MaximalCone(cg,*g,true,maximalConeLabel++)); } } // else // fprintf(Stderr,"Done - yes\n"); } else fprintf(Stderr,"dimension check fails\n"); } } //fprintf(Stderr,"No duplicates:\n"); /* for(PolynomialSetList::const_iterator i=tropical.begin();i!=tropical.end();i++) { AsciiPrinter(Stdout).printPolynomialList(i->coneGroebnerBasis); int coDim=rankOfMatrix(wallInequalities(*i)); int d=i->numberOfVariablesInRing()-coDim; fprintf(Stderr,"%i\n",d); } */ return bfan; } /*static bool staticInOrbit(PolynomialSet const &groebnerBasis1, PolynomialSet const &groebnerBasis2, SymmetryGroup const &s) { for(SymmetryGroup::ElementContainer::const_iterator j=s.elements.begin();j!=s.elements.end();j++) if(areIdealsEqual(SymmetryGroup::permutePolynomialSet(groebnerBasis2,*j),groebnerBasis1))return true; return false; }*/ /*static bool staticPermutationFixesCone(PolynomialSet const &groebnerBasis, IntegerVector const &v) { // Cone is fixed iff the cone ideal is fixed. PolynomialSet q(groebnerBasis.getRing()); for(PolynomialSet::const_iterator i=groebnerBasis.begin();i!=groebnerBasis.end();i++) { q.push_back(SymmetryGroup::permutePolynomial(*i,v)); } return areIdealsEqual(q,groebnerBasis); }*/ /*static int staticOrbitSize(PolynomialSet const &groebnerBasis, SymmetryGroup const &s) { int groupSize=s.elements.size(); int numFixed=0; for(SymmetryGroup::ElementContainer::const_iterator j=s.elements.begin();j!=s.elements.end();j++) if(staticPermutationFixesCone(groebnerBasis,*j))numFixed++; // fprintf(Stderr,"groupSize = %i, numFixed = %i\n",groupSize,numFixed); return groupSize/numFixed; } */ /** Objects of this class represent ConeOrbits of facet of a tropical variety. */ class ConeOrbit { public: const SymmetryGroup &s; PolynomialSet coneGroebnerBasis; PolynomialSet idealGroebnerBasis; int label; // PolynomialSetList markedFacets; PolyhedralCone theCone; // IntegerVectorList markedFacets; //marked facets of dim d cone. The facet of a facet is a ridge of the tropical variety. IntegerVector stableRay; //stable relative interior point IntegerVectorList unMarkedFacetNormals; ConeOrbit(const SymmetryGroup &s_, PolynomialSet const &coneGroebnerBasis_, PolynomialSet const &idealGroebnerBasis_, int label_): coneGroebnerBasis(coneGroebnerBasis_), idealGroebnerBasis(idealGroebnerBasis_), label(label_), s(s_), theCone(fastNormals(wallInequalities(idealGroebnerBasis_)),//wallFlipableNormals(idealGroebnerBasis_,false), wallInequalities(coneGroebnerBasis_), idealGroebnerBasis_.getRing().getNumberOfVariables()) { /* log0 AsciiPrinter(Stderr).printPolynomialSet(coneGroebnerBasis_); log0 AsciiPrinter(Stderr).printPolynomialSet(idealGroebnerBasis_); log0 fprintf(Stderr,"inequalities:\n"); log0 AsciiPrinter(Stderr).printVectorList(wallInequalities(coneGroebnerBasis_)); log0 fprintf(Stderr,"equalities:\n"); log0 AsciiPrinter(Stderr).printVectorList(wallFlipableNormals(idealGroebnerBasis_,false)); AsciiPrinter P(Stderr); log0 theCone.print(&P); */ theCone.findFacets(); // theCone.canonicalize();//REMOVE ME JAN 2009 stableRay=PolyhedralFan::stableRay(theCone,&s); unMarkedFacetNormals=theCone.getHalfSpaces(); } IntegerVector getStableRay()const { return stableRay; } bool doesPermutationFixCone(IntegerVector const &v)const { // Cone is fixed iff stableRay is fixed. return (SymmetryGroup::compose(v,stableRay)==stableRay); } int orbitSize()const { int groupSize=s.elements.size(); int numFixed=0; for(SymmetryGroup::ElementContainer::const_iterator j=s.elements.begin();j!=s.elements.end();j++) if(doesPermutationFixCone(*j))numFixed++; // fprintf(Stderr,"groupSize = %i, numFixed = %i\n",groupSize,numFixed); return groupSize/numFixed; } void markFacet(IntegerVector const &relIntRidgeVector) { for(SymmetryGroup::ElementContainer::const_iterator j=s.elements.begin();j!=s.elements.end();j++) if(doesPermutationFixCone(*j)) { IntegerVector relIntRidgeVector2=SymmetryGroup::compose(*j,relIntRidgeVector); { for(IntegerVectorList::iterator i=unMarkedFacetNormals.begin();i!=unMarkedFacetNormals.end();) if(dotLong(*i,relIntRidgeVector2)==0) { IntegerVectorList::iterator temp=i; temp++; unMarkedFacetNormals.erase(i); i=temp; } else i++; } } } /* bool containsAndMark(PolynomialSet const &coneGroebnerBasis_, PolynomialSet const &facetIdeal, IntegerVector *labelPermutation) { for(SymmetryGroup::ElementContainer::const_iterator j=s.elements.begin();j!=s.elements.end();j++) if(areIdealsEqual(coneGroebnerBasis,SymmetryGroup::permutePolynomialSet(coneGroebnerBasis_,*j))) { PolynomialSet facetIdeal2=SymmetryGroup::permutePolynomialSet(facetIdeal,*j); bool found=false; for(PolynomialSetList::const_iterator i=markedFacets.begin();i!=markedFacets.end();i++) if(areIdealsEqual(*i,facetIdeal2)) { found=true; break; } // assert(!found); //this is not a mistake is it? markedFacets.push_back(facetIdeal2); if(labelPermutation)*labelPermutation=*j; return true; } return false; }*/ /* Alternative using only geometric information. */ bool containsAndMark(IntegerVector const &relIntFacetVector, IntegerVector const &relIntRidgeVector, IntegerVector *labelPermutation) { for(SymmetryGroup::ElementContainer::const_iterator j=s.elements.begin();j!=s.elements.end();j++) if(theCone.contains(SymmetryGroup::compose(*j,relIntFacetVector))) { markFacet(SymmetryGroup::compose(*j,relIntRidgeVector)); if(labelPermutation)*labelPermutation=*j; return true; } return false; } bool hasUnmarkedFacet()const { return(!unMarkedFacetNormals.empty()); } IntegerVector getUnmarkedFacet()const { assert(!unMarkedFacetNormals.empty()); return *unMarkedFacetNormals.begin(); } /* bool isMarkedFacet(PolynomialSet const &f) { for(SymmetryGroup::ElementContainer::const_iterator j=s.elements.begin();j!=s.elements.end();j++) if(staticPermutationFixesCone(coneGroebnerBasis,*j)) for(PolynomialSetList::const_iterator i=markedFacets.begin();i!=markedFacets.end();i++) if(areIdealsEqual(SymmetryGroup::permutePolynomialSet(f,*j),*i))return true; return false; }*/ void print(AsciiPrinter &p)const { p.printString("ConeOrbit{\n"); p.printInteger(label); p.printNewLine(); IntegerVector v=getStableRay(); /* if(v.size()==25) { p.printVector(v.subvector(0,5));p.printNewLine(); p.printVector(v.subvector(5,10));p.printNewLine(); p.printVector(v.subvector(10,15));p.printNewLine(); p.printVector(v.subvector(15,20));p.printNewLine(); p.printVector(v.subvector(20,25));p.printNewLine(); }*/ p.printVector(v); p.printNewLine(); p.printString("Orbit size:"); p.printInteger(orbitSize()); p.printString("\nConeIdeal:\n"); p.printPolynomialSet(coneGroebnerBasis); p.printString("\nFullIdeal:\n"); p.printPolynomialSet(idealGroebnerBasis); // p.printString("Unmarked facet normals:\n"); // p.printVectorList(unMarkedFacetNormals); theCone.print(&p); p.printString("}ConeOrbit\n"); } IntegerVectorList getEquations()const { return theCone.getEquations(); } IntegerVectorList getInequalities()const { return theCone.getHalfSpaces(); } }; class ConeOrbitContainer { typedef list ConeOrbitList; ConeOrbitList l; public: void push_back(const ConeOrbit &orbit) { l.push_back(orbit); } bool empty() { return l.empty(); } ConeOrbit &front() { return *l.begin(); } int size() { return l.size(); } void pop_front() { l.pop_front(); } void print(AsciiPrinter &p) { p.printString("OrbitList{\n"); for(ConeOrbitList::const_iterator i=l.begin();i!=l.end();i++) { i->print(p); // p.printPolynomialSet(i->coneGroebnerBasis); //p.printNewLine(); } p.printString("}OrbitList\n"); } bool containsAndMark(IntegerVector const &relIntFacetVector, IntegerVector const &relIntRidgeVector, int *label, IntegerVector *labelPermutation) // bool containsAndMark(PolynomialSet const &coneGroebnerBasis, PolynomialSet const &facetIdeal, int *label, IntegerVector *labelPermutation) { // fprintf(Stderr,"listlength:%i",l.size()); // int I=0; // for(ConeOrbitList::const_iterator i=l.begin();i!=l.end();i++) // { // fprintf(Stderr,"%i",I++); // } for(ConeOrbitList::iterator i=l.begin();i!=l.end();i++) { /* fprintf(Stderr,"Comparing:\n"); AsciiPrinter(Stderr).printPolynomialSet(coneGroebnerBasis); AsciiPrinter(Stderr).printPolynomialSet(i->coneGroebnerBasis); */ // if(i->containsAndMark(coneGroebnerBasis,facetIdeal,labelPermutation)) if(i->containsAndMark(relIntFacetVector,relIntRidgeVector,labelPermutation)) // if(areIdealsEqual(coneGroebnerBasis,i->coneGroebnerBasis))// this could be slow! { *label=i->label; return true; } // if(i->coneGroebnerBasis==coneGroebnerBasis)return true; } /* fprintf(Stderr,"________________NOT IN LIST:\n"); AsciiPrinter(Stderr).printPolynomialSet(coneGroebnerBasis); */ return false; } }; static int staticOrbitSize(PolynomialSet const &coneGroebnerBasis, PolynomialSet const &idealGroebnerBasis, SymmetryGroup const &s) { return ConeOrbit(s, coneGroebnerBasis, idealGroebnerBasis, -1).orbitSize(); } BergmanFan bergman(PolynomialSet const &coneGroebnerBasis1, PolynomialSet const &idealGroebnerBasis1, SymmetryGroup const *symmetryGroup) { PolynomialRing theRing=coneGroebnerBasis1.getRing(); bool useFanIntersection=true; bool isSimplicial=true; assert(coneGroebnerBasis1.numberOfVariablesInRing()==idealGroebnerBasis1.numberOfVariablesInRing()); int n=coneGroebnerBasis1.numberOfVariablesInRing(); SymmetryGroup localSymmetryGroup(n); if(!symmetryGroup)symmetryGroup=&localSymmetryGroup; BergmanFan ret; ret.setSymmetryGroup(*symmetryGroup); ConeOrbitContainer active; int maximalConeLabel=0; { ConeOrbit newConeOrbit(*symmetryGroup,coneGroebnerBasis1,idealGroebnerBasis1,maximalConeLabel++); log1 fprintf(Stderr,"Adding orbit of size: %i\n",newConeOrbit.orbitSize()); active.push_back(newConeOrbit); } while(!active.empty()) { log1 fprintf(Stderr,"\n-------------------------------------\n"); log1 fprintf(Stderr,"Size of active set: %i, Completed: %i\n",(int)active.size(),(int)ret.cones.size()); log1 fprintf(Stderr,"-------------------------------------\n"); AsciiPrinter p(Stderr); ConeOrbit ¤t=active.front(); /* AsciiPrinter p2(stdout);//REMOVE THESE THREE LINES current.print(p2); fflush(stdout); */ // IntegerVectorList equalities=wallInequalities(current.coneGroebnerBasis); // IntegerVectorList normals=wallFlipableNormals(current.idealGroebnerBasis,false); /* { PolyhedralCone p(normals,equalities); p.findFacets(); isSimplicial&=p.isSimplicial(); }HUSK AT INDSÆTTE DETTE IGEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ // removeRedundantRows(&normals,&equalities,true);//IS THIS RIGHT? IntegerVectorList facePerp=current.getEquations();//equalities; /* int numberOfNormals=normals.size(); int numberOfEqualities=equalities.size(); IntegerVectorList inequalities=equalities; inequalities.splice(inequalities.begin(),normals,normals.begin(),normals.end()); IntegerVector equalitySet(inequalities.size()); for(int i=0;iidealGroebnerBasis.isMarked()); log2 cerr<<"8"; PolynomialSet g2(theRing); WeightTermOrder termOrder(termorderWeight(initialIdeal)); for(PolynomialSet::const_iterator j=i->idealGroebnerBasis.begin();j!=i->idealGroebnerBasis.end();j++) g2.push_back(divisionLift(*j, initialIdeal, current.idealGroebnerBasis, termOrder)); assert(g2.isMarked()); log2 cerr<<"9"; if(1) { log2 cerr << "AUTOREDUCTION"; autoReduce(&g2,LexicographicTermOrder()); log2 cerr << "AUTOREDUCTION END"<idealGroebnerBasis); log0 cerr << "RESTRICTED AUTOREDUCTION END"<coneGroebnerBasis,g2,-1); log2 cerr<<"0"; IntegerVector relIntFacetVector=tempConeOrbit.getStableRay(); log2 cerr<<"A"; int label=-1; IntegerVector labelPermutation; if(!active.containsAndMark(relIntFacetVector,relIntRidgeVector,&label,&labelPermutation)) // if(!active.containsAndMark(i->coneGroebnerBasis,initialIdeal,&label,&labelPermutation)) { log2 cerr<<"B"; if(!ret.contains(i->coneGroebnerBasis)) { label=maximalConeLabel++; labelPermutation=SymmetryGroup::identity(n); ConeOrbit newConeOrbit(*symmetryGroup,i->coneGroebnerBasis,g2,label); log1 fprintf(Stderr,"Adding orbit of size: %i\n",newConeOrbit.orbitSize()); //newConeOrbit.markFacet(initialIdeal); newConeOrbit.markFacet(relIntRidgeVector); active.push_back(newConeOrbit); } else { assert(0);//Can this ever happen? REMOVE JAN 2009 } log2 cerr<<"C"; } log2 cerr<<"D"; ret.codimensionOneCones.back().incidenceList.push_back(label); log2 cerr<<"E"; ret.codimensionOneCones.back().incidencePermutationList.push_back(labelPermutation); log2 cerr<<"F"; } } // else // numberOfAlreadyMarkedFacets++; } else { assert(0); } } // equalitySet[I]=0; // i++; //assert(0);//for timing purposes } log1 fprintf(Stderr,"Done processing this orbit - Number of valid facets: %i Number of already marked facets: %i\n",numberOfValidFacets,numberOfAlreadyMarkedFacets); ret.cones.push_back(BergmanFan::MaximalCone(current.coneGroebnerBasis,current.idealGroebnerBasis,false,current.label,numberOfValidFacets)); active.pop_front(); } ret.setSimplicial(isSimplicial); return ret; } //-------------------------------------- // BergmanFan //-------------------------------------- BergmanFan::MaximalCone::MaximalCone(PolynomialSet const &coneGroebnerBasis_, PolynomialSet const &idealGroebnerBasis_, bool storeIdealBasis, int label_, int numberOfFacets_): idealBasisStored(storeIdealBasis), coneGroebnerBasis(coneGroebnerBasis_), idealGroebnerBasis(idealGroebnerBasis_), label(label_), numberOfFacets(numberOfFacets_), multiplicity(-1), theCone(fastNormals(wallInequalities(idealGroebnerBasis_)), wallInequalities(coneGroebnerBasis_), idealGroebnerBasis_.getRing().getNumberOfVariables()) { if(!storeIdealBasis)idealGroebnerBasis=PolynomialSet(coneGroebnerBasis_.getRing()); theCone.canonicalize(); } int BergmanFan::numberOfMaximalCones()const { int ret=0;; for(MaximalConeList::const_iterator i=cones.begin();i!=cones.end();i++) { IntegerVector stableRay=PolyhedralFan::stableRay(i->theCone,&symmetryGroup); //ConeOrbit C(symmetryGroup, i->coneGroebnerBasis, i->idealGroebnerBasis, -1); ret+=symmetryGroup.orbitSize(stableRay);//C.orbitSize(); // ret+=staticOrbitSize(i->coneGroebnerBasis, symmetryGroup); } return ret; } void BergmanFan::print(Printer &p) { int numberOfMaximalCones=0; p.printString("Printing tropical variety modulo symmetry\n"); p.printString("-----------------"); p.printNewLine(); p.printString("1. Maximal cones:\n"); p.printString("-----------------"); p.printNewLine(); for(MaximalConeList::const_iterator i=cones.begin();i!=cones.end();i++) { p.printString("Orbit index: "); p.printInteger(i->label); p.printString("\n"); p.printString("Initial ideal:\n"); p.printPolynomialSet(i->coneGroebnerBasis); //p.printPolynomialSet(i->idealGroebnerBasis); int orbitSize=(symmetryGroup.sizeOfBaseSet())?staticOrbitSize(i->coneGroebnerBasis,i->coneGroebnerBasis,symmetryGroup):1; p.printString("OrbitSize:"); p.printInteger(orbitSize); p.printString("\n"); p.printString("NumberOfFacets:"); p.printInteger(i->numberOfFacets); p.printString("\n\n"); numberOfMaximalCones+=orbitSize; /* { IntegerVectorList normals=wallInequalities(i->idealGroebnerBasis); IntegerVectorList equations=wallInequalities(i->coneGroebnerBasis); PolyhedralCone c(normals,equations); c.canonicalize(); c.print(&p); } */ if(symmetryGroup.sizeOfBaseSet()) { list indices; int index=0; /* //This needs to be changed so that torus permutations are considered too. for(MaximalConeList::const_iterator j=cones.begin();j!=cones.end();j++,index++) if(staticInOrbit(j->coneGroebnerBasis,i->coneGroebnerBasis,symmetryGroup))indices.push_back(index); */ if(indices.size()>1) { fprintf(Stderr,"Conflicting orbits!!!!:"); for(list::const_iterator j=indices.begin();j!=indices.end();j++) fprintf(Stderr," %i ",*j); fprintf(Stderr,"\n"); } } } p.printString("-----------------------"); p.printNewLine(); p.printString("2. Codimension 1 cones:\n"); p.printString("-----------------------"); p.printNewLine(); for(CodimensionOneConeList::const_iterator i=codimensionOneCones.begin();i!=codimensionOneCones.end();i++) { //p.printString("----------------------"); // p.printNewLine(); p.printString("Groebner basis of initial ideal:\n"); p.printPolynomialSet(i->idealGroebnerBasis); // p.printNewLine(); p.printString("Adjacent maximal cones (orbit index, permutation):\n"); p.printString("("); IntegerVectorList::const_iterator J=i->incidencePermutationList.begin(); for(list::const_iterator j=i->incidenceList.begin();j!=i->incidenceList.end() && J!=i->incidencePermutationList.end();j++,J++) { if(j!=i->incidenceList.begin())p.printString(",\n"); p.printString("("); p.printInteger(*j); p.printString(", "); p.printVector(*J); p.printString(")"); } p.printString(")\n"); { int index=*(i->incidenceList.begin()); MaximalConeList::const_iterator j=cones.begin(); while(index>0){index--;j++;} // IntegerVectorList normals=wallInequalities(SymmetryGroup::permutePolynomialSet(j->idealGroebnerBasis,*(i->incidencePermutationList.begin()))); /* IntegerVectorList normals=wallInequalities(SymmetryGroup::permutePolynomialSet(j->idealGroebnerBasis,SymmetryGroup::inverse(*(i->incidencePermutationList.begin())))); IntegerVectorList equations=wallInequalities(i->idealGroebnerBasis); PolyhedralCone c(normals,equations); c.canonicalize(); c.print(&p); */ /* p.printString("-----------"); p.printNewLine(); PolyhedralFan F=PolyhedralFan::facetsOfCone(c); F.print(&p); p.printString("-----------"); p.printNewLine(); */ //p.printString("----------------------"); p.printNewLine(); } } p.printString("Done printing tropical variety - #maxcones="); p.printInteger(numberOfMaximalCones); p.printString(" ("); p.printInteger(cones.size()); p.printString(") #codim1cones= ? ("); p.printInteger(codimensionOneCones.size()); p.printString(")"); p.printNewLine(); } bool BergmanFan::contains(PolynomialSet const &g) { for(MaximalConeList::const_iterator i=cones.begin();i!=cones.end();i++) { if(areIdealsEqual(g,i->coneGroebnerBasis)) { return true; } } return false; } void BergmanFan::setSymmetryGroup(SymmetryGroup const &s) { symmetryGroup=s; } PolyhedralFan BergmanFan::toPolyhedralFan()const { assert(!cones.empty()); int n=cones.begin()->idealGroebnerBasis.numberOfVariablesInRing(); PolyhedralFan ret(n); for(MaximalConeList::const_iterator i=cones.begin();i!=cones.end();i++) { //PolyhedralCone c1(wallInequalities(i->idealGroebnerBasis),wallInequalities(i->coneGroebnerBasis)); // PolyhedralCone c1(wallFlipableNormals(i->idealGroebnerBasis,false),wallInequalities(i->coneGroebnerBasis),n); PolyhedralCone c1=i->theCone; log2 fprintf(Stderr,"Cononicalising...\n"); c1.canonicalize(); log2 fprintf(Stderr,"... done canonicalising...\n"); // fprintf(Stderr,"a\n"); // for(SymmetryGroup::ElementContainer::const_iterator j=symmetryGroup.elements.begin();j!=symmetryGroup.elements.end();j++) // { /* IntegerVectorList normals=wallInequalities(SymmetryGroup::permutePolynomialSet(i->idealGroebnerBasis,*j)); IntegerVectorList equations=wallInequalities(SymmetryGroup::permutePolynomialSet(i->coneGroebnerBasis,*j)); PolyhedralCone c(normals,equations); */ // PolyhedralCone c=c1.permuted(*j); // c.canonicalize(); c1.setMultiplicity(i->multiplicity); ret.insert(c1); // } } return ret; } void BergmanFan::setSimplicial(bool b) { simplicial=b; } bool BergmanFan::isSimplicial()const { return simplicial; } void BergmanFan::computeMultiplicities() { for(MaximalConeList::iterator i=cones.begin();i!=cones.end();i++) i->multiplicity=multiplicity(i->coneGroebnerBasis); //MULTIPLICITY TEST // AsciiPrinter(Stderr).printPolynomialSet(current.coneGroebnerBasis); // fprintf(Stderr,"MULTIPLICITY :%i\n",multiplicity(current.coneGroebnerBasis)); } gfan0.8beta/src/gfanlib_circuittableint.cpp0000664000175000017500000000041415177170257020544 0ustar andersanders/* * gfanlib_circuittableint.cpp * * Created on: Apr 10, 2016 * Author: anders */ #include "gfanlib_circuittableint.h" namespace gfan{ class MVMachineIntegerOverflow MVMachineIntegerOverflow; class IntegerConversionException IntegerConversionException; } gfan0.8beta/src/binomial.cpp0000664000175000017500000000202315177170257015465 0ustar andersanders#include "binomial.h" #include "field_zmodpz.h" IntegerVector binomialToIntegerVector(Polynomial const &p) { if(p.isZero()) { assert(0); // There is no way of finding the dimension!! return IntegerVector(0); } assert(p.numberOfTerms()==2); assert(p.isMarked()); IntegerVector markedExponent=p.getMarked().m.exponent; IntegerVector ret; for(TermMap::const_iterator j=p.terms.begin();j!=p.terms.end();j++) { IntegerVector dif=markedExponent-j->first.exponent; if(!dif.isZero()) { ret=dif; } } return ret; } Polynomial integerVectorToBinomial(IntegerVector const &v, PolynomialRing const &r) { IntegerVector pos=max(v,IntegerVector(v.size())); IntegerVector neg=pos-v; Field field=r.getField(); // if(!field)field=theZMod2ZField();//should this be changed to the global field?? Term a(field.zHomomorphism(1),Monomial(r,pos)); Term b(field.zHomomorphism(-1),Monomial(r,neg)); Polynomial p=Polynomial(a)+Polynomial(b); p.mark(Monomial(r,pos)); return p; } gfan0.8beta/src/app_tropicalfunction.cpp0000664000175000017500000000412415177170257020122 0ustar andersanders#include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "termorder.h" #include "ep_standard.h" #include "ep_xfig.h" #include "gfanapplication.h" #include "polyhedralcone.h" #include "polyhedralfan.h" #include "tropical.h" #include "tropical2.h" #include "symmetry.h" #include "halfopencone.h" #include "log.h" #include "field_rationals.h" class TropicalFunctionApplication : public GFanApplication { SimpleOption exponentOption; public: const char *helpText() { return "This program takes a polynomial and tropicalizes it. The output is piecewise linear function represented by a fan whose cones are the linear regions. Each ray of the fan gets the value of the tropical function assigned to it. In other words this program computes the normal fan of the Newton polytope of the input polynomial with additional information."; } TropicalFunctionApplication(): exponentOption("--exponents","Tell program to read a list of exponent vectors instead.") { registerOptions(); } const char *name() { return "_tropicalfunction"; } void inner(PolynomialSet const &f) { PolyhedralFan F=PolyhedralFan::normalFanOfNewtonPolytope(*f.begin()); { AsciiPrinter p(Stdout); PolyhedralFan a=F; a.printWithIndices(&p,FPF_default|FPF_values); } } int main() { FileParser P(Stdin); if(!exponentOption.getValue()) { PolynomialSet f=P.parsePolynomialSetWithRing(); inner(f); } else { IntegerVectorList exponents=P.parseIntegerVectorList(); assert(exponents.size()); int n=exponents.begin()->size(); PolynomialRing R(Q,n); Polynomial p(R); for(IntegerVectorList::const_iterator i=exponents.begin();i!=exponents.end();i++) { p+=Term(Q.zHomomorphism(1),Monomial(R,*i)); } PolynomialSet f(R); f.push_back(p); inner(f); } return 0; } }; static TropicalFunctionApplication theApplication; gfan0.8beta/src/polynomial.h0000664000175000017500000002714015177170257015532 0ustar andersanders#ifndef POLYNOMIAL_H_INCLUDED #define POLYNOMIAL_H_INCLUDED class Polynomial; class PolynomialSet; //class PolynomialSetList; #include #include "polynomialring.h" //#include "linalg.h" #include "term.h" #include "termorder.h" struct TermMapCompare { inline bool operator()(const Monomial &s1, const Monomial &s2) const { return LexicographicTermOrder()(s1.exponent,s2.exponent); } }; typedef std::map TermMap; class Polynomial { Term marked; bool isMarkedBool; int sugar; PolynomialRing theRing; /** * Used for splitting polynomials into two. */ Polynomial half(bool secondHalf)const; public: PolynomialRing const &getRing()const{return theRing;} TermMap terms; FieldElement coefficientOf(IntegerVector const &v)const{assert(v.size()==theRing.getNumberOfVariables());for(TermMap::const_iterator i=terms.begin();i!=terms.end();i++)if(i->first.exponent==v)return i->second;return theRing.getField().zHomomorphism(0);} Polynomial(const Term &t); Polynomial(PolynomialRing const &r); void computeInitialSugar(); int getSugar()const; void madd(const Term &m, const Polynomial &p); void operator+=(const Polynomial &p); void operator-=(const Polynomial &p); friend Polynomial operator+(const Polynomial &p, const Polynomial &q); friend Polynomial operator-(const Polynomial &p, const Polynomial &q); void operator*=(const Term &p); void operator*=(const Monomial &m); void operator*=(FieldElement const &c); void operator*=(Polynomial const &p); friend Polynomial operator*(const Polynomial &p, Term const &t); friend Polynomial operator*(const Polynomial &p, Monomial const &m); friend Polynomial operator*(const Polynomial &p, FieldElement const &c); friend Polynomial operator*(const Polynomial &p, const Polynomial &q); bool divides(const Polynomial &p, Polynomial *result=0)const; bool divides2(const Polynomial &p, Polynomial *result=0)const; Polynomial exactlyDividedBy(const Polynomial &p)const; int getNumberOfVariables()const; void changeNumberOfVariables(PolynomialRing const& r); void mark(class TermOrder const &termOrder); void mark(Monomial const &monomial); /** * Changes the marking of *this to that of p. */ void copyMarking(Polynomial const &p); void scaleMarkedCoefficientToOne(); bool isMonomial() const; const Term &getMarked()const{return marked;} bool isZero()const; bool isOne()const; int numberOfTerms()const;//linear time in worst case! IntegerVector exponentsSum()const; IntegerVectorList exponents()const; IntegerVector greatestCommonMonomialDivisor()const; IntegerVector degreeVector()const; int totalDegree()const; int lowestTotalDegree()const; int64 degree(IntegerVector const &w)const;// evaluateTropically Polynomial homogenization(PolynomialRing const &newRing, IntegerVector const *w=0)const; /** Each variable x_i in the polynomial is substituted by w_ix_i. */ Polynomial torusAct(class FieldVector const &w)const; // Polynomial derivative()const;//single variable Polynomial derivative(int j=0)const;//with respect to jth variable Polynomial deHomogenization(PolynomialRing const &r)const; Polynomial deHomogenizationInSameRing()const; int numberOfVariablesInRing()const;//by looking at just one monomial /** * Checks whether w marks the exact same term as the marked one. */ bool checkMarking(IntegerVector const &w)const; bool checkMarking(TermOrder const &termOrder)const; /** Checks wether the polynomial is homogeneous with respect to the grading given by the vector. */ bool isHomogeneous(IntegerVector const &v)const; bool isHomogeneous()const; void saturate(int variableNum=-1);//default is to saturate with respect to all variables bool isMarked()const; bool isValid(int numberOfVarialbes=-1)const; //debug testing FieldElement evaluate(const FieldElement &x)const;//single variable /** * This routine returns a vector with one entry for each variable in the ring. The entry is 1 * if the variable is used in the polynomial - 0 otherwise. */ IntegerVector usedVariables()const; int maximalIndexOfVariableInSupport()const; /* Creates a polynomial in r2 by extending or truncating the exponent vectors of the current polynomial appropriately. In particular this method can be used for dehomogenization */ Polynomial embeddedInto(PolynomialRing const &r2, list const *chosenVariables=0)const; Polynomial embeddedInto2(PolynomialRing const &r2, vector const &positionOfVariables)const; Polynomial withRestrictedVariables(IntegerVector const &keepVariable, PolynomialRing const &r2)const; Polynomial withExpandedVariables(IntegerVector const &wasKeptVariables, PolynomialRing const &r1)const; /** * Returns the index of the last variable used in this polynomial +1. */ int numberOfVariablesInUseConsecutive()const; string toString(bool latex/*, bool mathMode*/)const; /** * For debugging */ bool checkExponentVectors()const; double evaluateFloat(FloatVector const &x)const; ComplexNumber evaluateComplex(ComplexVector const &x)const; Polynomial withIthVariableSubstituted(PolynomialRing const &r2, int i, FieldElement const &v)const; /** * theRing must be a polynomial ring over the rationals. * r2 must be a polynomial ring with the same number of variables over ZModPZ. * *this must have only integer coefficients. * The returned polynomial is the representative modulo P. */ Polynomial modularRepresentative(PolynomialRing const &r2)const; /** * theRing must be a polynomial ring over ZModPZ. * r2 must be a polynomial ring over rationals. * The returned polynomial is a representative of *this in r2. */ Polynomial integralRepresentative(PolynomialRing const &r2)const; /* Only works for ordered coefficient fields at the moment!!!!!!!!!!!!!!!!!!!!!! * */ bool operator==(Polynomial const &q)const; }; class PolynomialCompare { public: bool operator()(const Polynomial &a, const Polynomial &b)const; }; class PolynomialCompareMarkedTerms { TermOrder const &termOrder; public: PolynomialCompareMarkedTerms(TermOrder const &termOrder_); bool operator()(const Polynomial &a, const Polynomial &b)const; }; class PolynomialCompareMarkedTermsReverse { TermOrder const &termOrder; public: PolynomialCompareMarkedTermsReverse(TermOrder const &termOrder_); bool operator()(const Polynomial &a, const Polynomial &b)const; }; /** * Used for sorting according to number of terms without removing duplicates. */ class PolynomialCompareNumberOfTermsStable { public: bool operator()(const Polynomial &a, const Polynomial &b)const; }; class PolynomialSet : public list { PolynomialRing theRing; public: PolynomialSet(PolynomialRing const &r):theRing(r){} PolynomialRing const &getRing()const { return theRing; } /** * Returns the index of the last variable used in an element of the set +1. */ int numberOfVariablesInUseConsecutive()const; void changeNumberOfVariables(PolynomialRing const &r); int numberOfVariablesInRing()const;//by looking at just one monomial // Field & void scaleMarkedCoefficientsToOne(); void mark(class TermOrder const &termOrder); void markAndScale(TermOrder const &termOrder); /** * Changes the markings of *this to that of g. */ void copyMarkings(PolynomialSet const &g); /** * Checks whether w marks the exact same terms as the marked ones. */ bool checkMarkings(IntegerVector const &w)const; bool checkMarkings(TermOrder const &termOrder)const; /** The set of vectors inducing the markings of the polynomials in the set is an open polyhedral cone (assuming that the markings are consistent). This function checks if the vector v is contained in the closure of that cone. */ bool containsInClosedGroebnerCone(IntegerVector const &v)const; /** Checks whether the polynomials are homogeneous with respect to the grading given by the vector. */ bool isHomogeneous(IntegerVector const &v)const; bool isHomogeneous()const; void unionPolynomial(const Polynomial &p); void unionSet(const PolynomialSet &s); int totalDegree()const; IntegerVector exponentsSum()const; void sort_(); /** * This routine reorders the polynomials such that polynomials with few terms go first. Duplicates are not removed. */ void simplestPolynomialsFirst(); friend bool operator==(PolynomialSet const &a, PolynomialSet const &b); //remember to call sort_ before calling this procedure bool isEqualTo(PolynomialSet const &b)const; //remember to call sort_ before calling this procedure /** * Assuming that the set is a Groebner basis routine tests if its ideal equals <1>. */ bool isUnitIdeal()const; PolynomialSet markedTermIdeal()const; void computeInitialSugar(); bool isMarked()const; PolynomialSet homogenization(PolynomialRing const &newRing, IntegerVector const *w=0)const; PolynomialSet torusAct(FieldVector const &w)const; /** * This routine computes a homogeneity space of the polynomial set (not the ideal) and based on this * substitutes 1 for certain variables to make polynomial set non-homogeneous in any grading. The returned * ideal sits inside new ring. */ PolynomialSet multiDeHomogenization()const; list multiDeHomogenizationToKeep()const; PolynomialSet deHomogenization()const; PolynomialSet deHomogenizationInSameRing()const; /** * This function intersects the list of polynomials with a subpolynomial ring newRing. * The ring newRing is embedded into the current polynomial ring as the polynomial ring * on the first n variables if the chosenVariables list is not specified. Otherwise it is embedded * as the polynomial ring on the chosenVariables given in the list. */ PolynomialSet polynomialRingIntersection(PolynomialRing const &newRing, list const *chosenVariables=0)const; bool isValid()const; //debug testing /** * Factors out common monomial factors of the elements in the set. This does not saturate the ideal * generated by the polynomials! */ void saturate(int variableNum=-1);//default is to saturate with respect to all variables PolynomialSet embeddedInto(PolynomialRing const &r2, list const *chosenVariables=0)const; PolynomialSet embeddedInto2(PolynomialRing const &r2, vector const &positionsOfVariables)const; // Here are two new functions for moving polynomials between polynomial rings PolynomialSet withRestrictedVariables(IntegerVector const &keepVariable, PolynomialRing const &r2)const; PolynomialSet withExpandedVariables(IntegerVector const &wasKeptVariables, PolynomialRing const &r1)const; int totalNumberOfTerms()const; list exponents()const; FloatVector evaluateFloat(FloatVector const &x)const; ComplexVector evaluateComplex(ComplexVector const &x)const; PolynomialSet withIthVariableSubstituted(PolynomialRing const &r2, int i, FieldElement const &v)const; /** * This function removes all zero polynomials from the set. */ void removeZeros(); /** * This function removes duplicates from the set by first sorting. */ void removeDuplicates(); bool containsMonomialGenerator()const{for(const_iterator i=begin();i!=end();i++)if(i->isMonomial())return true;return false;} /** * theRing must be a polynomial ring over the rationals. * r2 must be a polynomial ring with the same number of variables over ZModPZ. * *this must have only integer coefficients in its polynomials. * The returned polynomial is the representative modulo P. */ PolynomialSet modularRepresentative(PolynomialRing const &r2)const; }; typedef list PolynomialSetList; /*class PolynomialSetList : public list { };*/ #endif gfan0.8beta/src/gfanlib_vector.h0000664000175000017500000004125715177170257016340 0ustar andersanders/* * lib_zvector.h * * Created on: Sep 6, 2010 * Author: anders */ #ifndef GFANLIB_ZVECTOR_H_INCLUDED #define GFANLIB_ZVECTOR_H_INCLUDED #include #include #include #include #include #include #include #include #include "gfanlib_memoryresource.h" #include "gfanlib_z.h" #include "gfanlib_q.h" namespace gfan{ class SequenceStreamIterator { std::istream &s; std::vector stack; bool allowEarlyDesctruction; void toNextNonSpace() { char c; do { if(s.eof())break; s.get(c); } while(c==' '||c=='\n'||c=='\t'); assert(!s.eof()); s.unget(); } public: SequenceStreamIterator(std::istream &s_, bool allowEarlyDestruction_=false): s(s_), allowEarlyDesctruction(allowEarlyDestruction_) { toNextNonSpace(); assert(!s.eof()); char c; s.get(c); assert(c=='(' || c=='{'); stack.push_back(c); } ~SequenceStreamIterator() { toNextNonSpace(); char c; s.get(c); if(!allowEarlyDesctruction) { assert(stack.size()>=1); assert(stack.back()=='(' && c==')' || stack.back()=='{' && c=='}'); stack.pop_back(); } } bool eof() { toNextNonSpace(); assert(!s.eof()); char c; s.get(c); s.unget(); if(c==')' ||c=='}') { return true; } return false; } std::string getNextString() { std::stringstream ret; char c; s.get(c); assert(stack.size()==1); while(1) { if(c=='('||c=='{') { stack.push_back(c); } if(stack.size()>1) { if(c==')' || c=='}') { assert(stack.size()>=2); assert(stack.back()=='(' && c==')' || stack.back()=='{' && c=='}'); stack.pop_back(); } ret.put(c); } else { assert(stack.size()==1); if(c==',' || c==')' || c=='}') break; ret.put(c); } s.get(c); } if(c!=',') s.unget(); return ret.str(); } }; class ThreadSafeSequenceStreamIterator { SequenceStreamIterator s; std::mutex m; int64_t index; public: ThreadSafeSequenceStreamIterator(std::istream &s_, bool allowEarlyDestruction_=false): s(s_,allowEarlyDestruction_), index(0) { } std::optional> getNextString() { std::scoped_lock l(m); if(s.eof()) return {}; else return make_pair(index++,s.getNextString()); } bool eof() { std::scoped_lock l(m); return s.eof(); } }; static std::vector parseSequence(std::istream &s) { std::vector ret; SequenceStreamIterator i(s); while(!i.eof())ret.push_back(i.getNextString()); return ret; } // The function below is equivalent. It should be deleted. static std::vector parseSequence2(std::istream &s) { bool doLog=false; // std::cerr<<"\n"; // s>>std::noskipws; std::vector ret; std::vector stack; int state=0; std::string currentString; while(!s.eof()) { // std::cerr<<"Current string:"<>c; // std::cerr<<"PARSED::"<1)currentString.push_back(c); } else if(c==',' && stack.size()==1) { // ret.push_back(currentString.str()); // currentString=std::stringstream(""); std::string t; std::swap(t,currentString); ret.emplace_back(std::move(t)); } else if(c==')' || c=='}') { if(stack.size()>1)currentString.push_back(c); // assert(stack.size()); stack.pop_back(); if(stack.size()==0) { if(currentString.size())ret.push_back(std::move(currentString)); break; } } else { if(stack.size()) currentString.push_back(c); else if(doLog)std::cerr<<"IGNORED:\""<::const_iterator j=q.v.begin();for(typename pmrvector::const_iterator i=p.v.begin();i!=p.v.end();++i,++j)s+=(*i)*(*j);return s;} // inline friend int64 dotLong(const Vektor& p, const Vektor& q){assert(p.size()==q.size());int64 s=0;for(int i=0;i::const_iterator j=q.v.begin();for(typename pmrvector::const_iterator i=v.begin();i!=v.end();++i,++j)if(!((*i)==(*j)))return false;return true;} bool operator!=(const Vector & q)const {return !(operator==(q));} bool isZero() const { for(typename pmrvector::const_iterator i=v.begin();i!=v.end();++i)if(!(*i).isZero())return false; return true; } bool isPositive() const { for(typename pmrvector::const_iterator i=v.begin();i!=v.end();++i)if((*i).sign()<=0)return false; return true; } bool isNonNegative() const { for(typename pmrvector::const_iterator i=v.begin();i!=v.end();++i)if(i->sign()<0)return false; return true; } /* int max()const { int ret=-0x7fffffff; //not completely correct, but kind of works for 64bit for(int i=0;iv[i])ret=v[i]; return ret; } */ friend bool dependent(const Vector& p, const Vector& q) { /* typ pp=dot(p,p); typ qq=dot(q,q); typ pq=dot(p,q); return pq*pq==pp*qq; */ unsigned n=p.size(); assert(n==q.size()); unsigned i; for(i=0;iq[i])p1[i]=q[i];return p1;} friend Vector operator-(const Vector &b) { Vector ret(b.size()); for(unsigned i=0;i0)if(q.v[i]0)&&(q[t]>0)) return false; return true; } Vektor supportVector()const { Vektor r(v.size()); for(int i=0;i=0); assert(end<=(int)size()); assert(end>=begin); Vector ret(end-begin,mr); for(int i=0;i const &chosenIndices)const { Vektor ret(chosenIndices.size()); int I=0; for(list::const_iterator i=chosenIndices.begin();i!=chosenIndices.end();i++,I++)ret[I]=v[*i]; return ret; } */ friend Vector concatenation(Vector const &a, Vector const &b, MR *mr=get_default_resource()) { Vector ret(a.size()+b.size(),mr); for(int i=0;i0)==true)&1); } */ friend std::ostream &operator<<(std::ostream &f, Vector const &a) { f<<"("; for(typename pmrvector::const_iterator i=a.v.begin();i!=a.v.end();i++) { if(i!=a.v.begin()) f<<","; f<<*i; } return f<<")"; } friend std::istream &operator>>(std::istream &f, Vector &a) { auto v=parseSequence(f); a.resize(v.size()); int i=0; for(auto c:v) a[i++]=typ(c); return f; } std::string toString()const { std::stringstream f; f<<*this; return f.str(); } typ gcd()const { // typ temp1,temp2; typ ret(int(0)); // std::cerr<<"gcd1\n"; for(unsigned i=0;i ZVector; typedef Vector QVector; typedef Vector IntVector; inline QVector ZToQVector(ZVector const &v) { QVector ret(v.size()); for(unsigned i=0;i>::value,"Not move constructible!" ); static_assert(std::is_move_assignable>::value,"Not move assignable!" ); static_assert(std::is_nothrow_move_assignable>::value,"Not nothrow move assignable!" ); static_assert(std::is_nothrow_move_constructible>::value,"Not nothrow move constructible!" ); static_assert(std::is_nothrow_destructible>::value,"Not nothrow destructible!" ); } #endif /* LIB_ZVECTOR_H_ */ gfan0.8beta/src/timer.h0000664000175000017500000000121615177170257014463 0ustar andersanders#ifndef TIMER_H_INCLUDED #define TIMER_H_INCLUDED #include class Timer { static class Timer *timers; class Timer *next; const char *s; int skip; int ons; int n; double total; int timerStart; int timerStartSec; bool doTimingThisTime(); public: Timer(const char* s, int skip=10); void on(); void off(); void print(FILE *f); static void printList(FILE *f=stderr); }; #if 1 class TimerScope { Timer *timer; public: TimerScope(Timer *timer){this->timer=timer;timer->on();} ~TimerScope(){timer->off();} }; #else class TimerScope { public: TimerScope(Timer *timer){} ~TimerScope(){} }; #endif #endif gfan0.8beta/src/app_link.cpp0000664000175000017500000000513215177170257015474 0ustar andersanders#include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "lp.h" #include "gfanapplication.h" #include "polyhedralcone.h" #include "polyhedralfan.h" #include "symmetry.h" #include "polymakefile.h" class LinkApplication : public GFanApplication { // FieldOption theFieldOption; StringOption inputOption; SimpleOption optionSymmetry; SimpleOption optionConeIndices; SimpleOption optionNonMaximal; SimpleOption optionStar; public: const char *helpText() { return "This program takes a polyhedral fan and a vector and computes the link of the polyhedral fan around that vertex. The link will have lineality space dimension equal to the dimension of the relative open polyhedral cone of the original fan containing the vector.\n"; } LinkApplication(): inputOption("-i","Specify the name of the input file.","polymake.out"), optionSymmetry("--symmetry", "Reads in a fan stored with symmetry. The generators of the symmetry group must be given on the standard input.\n"), optionConeIndices("--coneIndices","Restrict the fan to a set of cones. The indices of the cones are given on the input."), optionNonMaximal("--nonMaximal","Tells the program that the cone indices are with respect to the non maximal cone list."), optionStar("--star","Computes the star instead. The star is defined as the smallest polyhedral fan containing all cones of the original fan containing the vector.") { registerOptions(); optionConeIndices.hide(); optionNonMaximal.hide(); } const char *name() { return "_fanlink"; } int main() { IntegerVector v=FileParser(Stdin).parseIntegerVector(); int n=v.size(); SymmetryGroup s(n); if(optionSymmetry.getValue()) { IntegerVectorList generators=FileParser(Stdin).parseIntegerVectorList(); s.computeClosure(generators); } PolyhedralFan f(n); if(optionConeIndices.getValue()) { IntegerVector temp=FileParser(Stdin).parseIntegerVector(); set coneIndices; for(int i=0;i #include "wallideal.h" #include "tropical2.h" #include "log.h" Triangulation2 triangulationWithFullDimensionalIntersection(Triangulation2 g, PolyhedralCone const &c) { // debug<<"A\n"; PolyhedralCone A=intersection(c,g.secondaryFanSupport()); // debug<<"B\n"; IntegerVector v=A.getRelativeInteriorPoint(); IntegerVectorList l=c.generatorsOfSpan(); l.push_front(v); MatrixTermOrder T(l); //debug<-D to end.\n"; } LexicographicTermOrder myOrder; PolynomialSet g=FileParser(Stdin).parsePolynomialSetWithRing(); if(optionParameters.getValue())g=makeVariablesParameters(makeVariablesParameters(g.getRing(),optionParameters.getValue()),g); log3 AsciiPrinter(Stderr).printPolynomialSet(g); AsciiPrinter(Stdout).printPolynomialRing(g.getRing()); printf("\n"); EnumerationFilePrinter *ep; { ep=new StandardEnumerationPrinter(); } bool outputLatex=true; Printer *P; LatexPrinter *Q; FILE *latexFile; globalTimer.on(); { if(optionInputIsGroebnerBasis.getValue()) { log1 fprintf(Stderr,"Minimizing and autoreducing input...\n"); minimize(&g); autoReduce(&g, LexicographicTermOrder()); } else { log1 fprintf(Stderr,"Computing Groebner Basis...\n"); buchberger(&g,StandardGradedLexicographicTermOrder()); log2 AsciiPrinter(Stderr).printPolynomialSet(g); } log1 fprintf(Stderr,"A reduced Groebner basis has been computed\n"); } SymmetryGroup s(g.numberOfVariablesInRing()); IntegerVectorList generators; { EnumerationAlgorithm *rs; if(optionSymmetry.getValue()) { generators=FileParser(Stdin).parseIntegerVectorList(); if(!optionDisableSymmetryTest.getValue()) { for(IntegerVectorList::iterator i=generators.begin();i!=generators.end();i++) { // fprintf(Stderr,"testing\n"); assert(areIdealsEqual(g,SymmetryGroup::permutePolynomialSet(g,*i))); } } s.computeClosure(generators); log1 s.print(Stderr); if(0) {//using old breadth first traversal BreadthFirstSearch *bs=new BreadthFirstSearch(s,/*minkowski*/0); /* if(optionSubspace.getValue()) bs->setSubspace(FileParser(Stdin).parseIntegerVectorList()); */ rs=bs; if(optionEchoSymmetry.getValue())AsciiPrinter(Stdout).printVectorList(generators); ep->open(Stdout); rs->setEnumerationTarget(ep); rs->enumerate(g); delete rs; //<--- In next release, make the class virtual } else {//using new traversal GroebnerFanTraverser traverser(g); TargetGlue target(*ep); if(optionEchoSymmetry.getValue())AsciiPrinter(Stdout).printVectorList(generators); ep->open(Stdout); SymmetricTargetCounterInterrupted target2(target,optionInterrupt.getValue()); symmetricTraverse(traverser,target2,&s); } } else { rs=new ReverseSearch(myOrder); ep->open(Stdout); rs->setEnumerationTarget(ep); rs->enumerate(g); delete rs;//<--- In next release, make the class virtual } } ep->close(); delete ep;//<--- In next release, make the class virtual printf("\n"); globalTimer.off(); // if(optionPerformanceTimer.getValue())Timer::printList(); return 0; } }; static GCats theApplication("_bases"); static GCats theApplication2(""); gfan0.8beta/src/triangulation.cpp0000664000175000017500000002443415177170257016565 0ustar andersanders#include "triangulation.h" #include #include #include "polyhedralcone.h" #include "determinant.h" #include "lp.h" #include "linalg.h" #include "log.h" //--------------------------------------- // Printing routines //--------------------------------------- void printIntList(list const &v) { FILE *f=Stderr; fprintf(f,"{"); for(list::const_iterator i=v.begin();i!=v.end();i++) { if(i!=v.begin())fprintf(f," "); fprintf(f,"%i",*i); } fprintf(f,"}\n"); } static void printCone(Triangulation::Cone const &c) { FILE *f=Stderr; fprintf(f,"{"); for(list::const_iterator i=c.begin();i!=c.end();i++) { if(i!=c.begin())fprintf(f," "); fprintf(f,"%i",*i); } fprintf(f,"} %i",c.changeSign); } void printIntListList(list > const &l) { for(list >::const_iterator i=l.begin();i!=l.end();i++) printIntList(*i); } void printIntListList(list const &l) { cerr<<"{"; for(list::const_iterator i=l.begin();i!=l.end();i++) { if(i!=l.begin())cerr<<",\n"; printCone(*i); } cerr<<"}\n"; } //--------------------------------------- // //--------------------------------------- static int signSwaps(list const &c) { int ret=1; for(list::const_iterator i=c.begin();i!=c.end();i++) for(list::const_iterator j=i;j!=c.end();j++) if(*j<*i)ret=-ret; return ret; } void Triangulation::coneSort(Triangulation::Cone &c) { c.changeSign*=signSwaps(c); c.sort(); } IntegerVectorList Triangulation::coneToVectorList(Cone2 const &c, IntegerMatrix const &rays) { IntegerVectorList ret; for(Cone::const_iterator i=c.begin();i!=c.end();i++) ret.push_back(rays[*i]); return ret; } int Triangulation::coneDim(Cone2 const &c, IntegerMatrix const &rays) { return rankOfMatrix(coneToVectorList(c,rays)); } Triangulation::Cone Triangulation::firstSimplex(Cone const &c, IntegerMatrix const &rays) { Cone ret; int d=0; for(Cone::const_iterator i=c.begin();i!=c.end();i++) { ret.push_back(*i); if(coneDim(ret,rays)!=ret.size())ret.pop_back(); } return ret; } IntegerVectorList Triangulation::coneComplement(Cone c, IntegerMatrix const &rays)//returns generators of orth. complement. { IntegerVectorList equations=coneToVectorList(c,rays); IntegerVectorList empty; return PolyhedralCone(empty,equations,rays.getWidth()).dualCone().getEquations(); } int Triangulation::signVisible(int v, Cone const &c, IntegerVectorList const &complement, IntegerMatrix const &rays) { IntegerVectorList l1=coneToVectorList(c,rays); l1.push_back(rays[v]); for(IntegerVectorList::const_iterator i=complement.begin();i!=complement.end();i++) { l1.push_back(*i); } return determinantSign(l1)*c.changeSign; } list Triangulation::triangulateRek(int d, Cone2 const &c, IntegerMatrix const &rays, bool revlex, bool ignoreContainedRays) { int revlexSignChange=(revlex?-1:1); list ret; if(d==0) { ret.push_back(Cone()); return ret; } // log0 cerr<<"recursing"< boundary; /* Make two copies of the lower dimensional triangulation one for each orientation */ for(list::iterator i2=ret.begin();i2!=ret.end();i2++) { coneSort(*i2); boundary.push_back(*i2); i2->changeSign*=-1; boundary.push_back(*i2); } /* Build up the triangulation in new dimension */ ret = list(); for(;i!=c.end();i++) { // log0 cerr << "progress\n"; {//We are done if we leave the subspace we are working in: bool done=false; for(IntegerVectorList::const_iterator j=complement.begin();j!=complement.end();j++) if(dotLong(*j,rays[*i])!=0) { done=true; break; } if(done)break; } if(revlex)ret = list(); // list newBoundary; set newBoundary; /* Run through old boundary */ for(list::iterator j=boundary.begin();j!=boundary.end();) { /* For every visible triangle in the boundary */ if(signVisible(*i,*j,complement,rays)==1*revlexSignChange) { Cone b=*j; /* remove the boundary triangle */ list::iterator tempj=j; j++; if(!revlex)boundary.erase(tempj); /* xor all other facets of the new higher dimensional simplex into the new boundary set */ for(Cone::const_iterator k=b.begin();k!=b.end();k++) { Cone temp; for(Cone::const_iterator l=b.begin();l!=b.end();l++) if(l!=k) temp.push_back(*l); else temp.push_back(*i); { temp.changeSign=b.changeSign; if(revlex)temp.changeSign=-b.changeSign; coneSort(temp); bool found=false; /* for(list::iterator l=newBoundary.begin();l!=newBoundary.end();l++) if(*l==temp) { newBoundary.erase(l); found=true; break; } if(!found)newBoundary.push_back(temp); */ if(newBoundary.count(temp))newBoundary.erase(temp);else newBoundary.insert(temp); } } /* build higher dimensional triangle and add it to the triangulation */ b.push_back(*i); b.changeSign=-b.changeSign; coneSort(b); ret.push_back(b); } else { /* remove the boundary triangle */ list::iterator tempj=j; j++; if(revlex)boundary.erase(tempj); } } // boundary.splice(boundary.begin(),newBoundary); for(set::const_iterator i=newBoundary.begin();i!=newBoundary.end();i++)boundary.push_back(*i); //log0 cerr<< "ret.size:"< Triangulation::triangulate(Cone2 c, IntegerMatrix const &rays, bool revlex) //computes a lexicographic triangulation { // coneSort(c); c.sort(); return triangulateRek(coneDim(c,rays),c,rays,revlex); } list Triangulation::triangulate(IntegerMatrix const &rays, bool revlex) { /* Reduce to subspace. Could this change orientation??? */ FieldMatrix R=integerMatrixToFieldMatrix(rays,Q).transposed(); R.reduce(); R.removeZeroRows(); IntegerMatrix rays2=fieldMatrixToIntegerMatrixPrimitive(R.transposed()); Cone c; for(int i=0;i Triangulation::boundary(list cones) { set ret; // printIntListList(cones); for(list::const_iterator i=cones.begin();i!=cones.end();i++) { Cone c=*i; // coneSort(c); int doSwap=-1; for(Cone::iterator j=c.begin();j!=c.end();j++) { doSwap=-doSwap; Cone c2; for(Cone::iterator k=c.begin();k!=c.end();k++) if(k!=j)c2.push_back(*k); c2.changeSign=doSwap*c.changeSign; coneSort(c2); for(set::iterator l=ret.begin();l!=ret.end();l++) { Cone a=*l; Cone b=c2; coneSort(a); coneSort(b); if((!(a ret2; for(set::const_iterator i=ret.begin();i!=ret.end();i++)ret2.push_back(*i); return ret2; } IntegerVectorList Triangulation::normals(IntegerMatrix &rays) { list b=boundary(triangulate(rays)); FieldMatrix raySpan=integerMatrixToFieldMatrix(rays,Q); FieldMatrix rayKernel=raySpan.reduceAndComputeKernel(); rayKernel.reduce(); // fprintf(Stderr,"RESULT\n"); // printIntListList(b); // AsciiPrinter P(Stderr); // fprintf(Stderr,"Reducer:\n"); // rayKernel.print(P); //P.printVectorList(rays.getRows()); //raySpan.printMatrix(P); set ret2; for(list::const_iterator i=b.begin();i!=b.end();i++) { // fprintf(Stderr,"HEJ!!\n"); //AsciiPrinter P(Stderr); IntegerVectorList temp; for(Cone::const_iterator j=i->begin();j!=i->end();j++) temp.push_back(rays[*j]); //printIntList(*i); //fprintf(Stderr,"test\n"); FieldMatrix raySpan2=integerMatrixToFieldMatrix(rowsToIntegerMatrix(temp),Q); FieldMatrix raySpan3=combineOnTop(raySpan2,rayKernel); // raySpan3.printMatrix(P); //fprintf(Stderr,"test2\n"); FieldMatrix rayKernel2=raySpan3.reduceAndComputeKernel(); //fprintf(Stderr,"RaySpan2:\n"); //raySpan2.printMatrix(P); //rayKernel2.printMatrix(P); //fprintf(Stderr,"test3\n"); assert(rayKernel2.getHeight()==1); FieldVector v=rayKernel2[0]; int swaps=0; //fprintf(Stderr,"test4\n"); for(int j=0;j::const_iterator i=ret2.begin();i!=ret2.end();i++) ret.push_back(*i); return ret; } vector > Triangulation::removeOrientation(list const &triangulation) { vector > ret(triangulation.size()); int I=0; for(list::const_iterator i=triangulation.begin();i!=triangulation.end();i++,I++) ret[I]=*i; return ret; } vector > Triangulation::removeOrientation(vector const &triangulation) { vector > ret(triangulation.size()); int I=0; for(vector::const_iterator i=triangulation.begin();i!=triangulation.end();i++,I++) ret[I]=*i; return ret; } gfan0.8beta/src/matrix.h0000664000175000017500000003167215177170257014660 0ustar andersanders#ifndef MATRIX_H_INCLUDED #define MATRIX_H_INCLUDED #include #include #include #include #include "vektor.h" #include "printer.h" using namespace std; template class Matrix{ //public: int width,height; // vector > rows; vector data; public: inline int getHeight()const{return height;}; inline int getWidth()const{return width;}; Matrix(const Matrix &a):data(a.data),width(a.getWidth()),height(a.getHeight()){ } Matrix(int height_, int width_):data(height_*width_),height(height_),width(width_){ assert(height>=0); assert(width>=0); for(int i=0;i column(int i)const { assert(i>=0); assert(i ret(getHeight()); for(int j=0;j const &r) { assert(r.size()==width); int oldsize=data.size(); data.resize(data.size()+width); for(int i=0;i const &r) { assert(r.size()==width); rows.front_back(r); height++; }*/ void setRow(int i,IntegerVector const &v) { assert(v.size()==getWidth()); assert(i>=0 && isum)sum=a[i][k]+b[k][j]; } ret[i][j]=sum; } return ret; } friend Matrix operator*(const Matrix& a, const Matrix& b) { assert(a.width==b.height); Matrix ret(b.width,a.height); for(int i=0;i Matrix(const Matrix& c):v(c.size()){ for(int i=0;i=0); assert(startColumn>=0); assert(endRow>=startRow); assert(endColumn>=startColumn); assert(endRow<=height); assert(endColumn<=width); Matrix ret(endRow-startRow,endColumn-startColumn); for(int i=startRow;igetWidth()); Matrix ret(getHeight(),subset.sum()); for(int i=0;i=0); assert(j toVector()const { Vektor ret(matrix.width); for(int j=0;j()const { return toVector(); } bool operator==(Vektor const &b)const { return toVector()==b; } typ dot(Vektor const &b)const { return dot(toVector(),b); } Vektor operator-()const { return -toVector(); } /* bool isZero()const { for(int j=0;j=0); assert(j const &v) { assert(v.size()==matrix.width); for(int j=0;j const &v) { assert(v.size()==matrix.width); for(int j=0;j toVector()const { Vektor ret(matrix.width); for(int j=0;j()const { return toVector(); } typ dot(Vektor const &b)const { return dot(toVector(),b); } /* Vector toVector() { Vector ret(matrix.width); for(int j=0;j& operator[](int n)const{assert(n>=0 && n& operator[](int n){assert(n>=0 && n& operator[](int n){if(!(n>=0 && n*)(this))[n];return (rows[n]);} inline RowRef operator[](int i) { assert(i>=0); assert(i=0); assert(i widths(m.getWidth()); for(int i=0;iwidths[j])widths[j]=s.str().length(); } stringstream s; s<<"{"; for(int i=0;i=0); assert(i=0); assert(j=0); assert(i=0); assert(j IntegerMatrix; typedef Matrix FloatMatrix; IntegerMatrix rowsToIntegerMatrix(IntegerVectorList const &rows, int width=-1);//width specifies the matrix width. If no width is specied the width is found by looking at the length of the rows. The function "asserts" if the length of the rows does not match the matrix size or if the width was not specified and could not be read off from the rows. IntegerMatrix rowToIntegerMatrix(IntegerVector const &row); FloatMatrix integerToFloatMatrix(IntegerMatrix const &m); IntegerVector flattenMatrix(IntegerMatrix const &m); int rank(IntegerMatrix const &m); #endif gfan0.8beta/src/tropicaltraverse.cpp0000664000175000017500000003621415177170257017275 0ustar andersanders#include "tropicaltraverse.h" #include "bergman.h" #include "enumeration.h" #include "reversesearch.h" #include "tropical.h" #include "buchberger.h" #include "division.h" #include "dimension.h" #include "wallideal.h" #include "lp.h" #include "subspace.h" #include "symmetry.h" #include "tropical2.h" #include "tropicalbasis.h" #include "polyhedralcone.h" #include "polyhedralfan.h" #include "multiplicity.h" #include "log.h" #include "restrictedautoreduction.h" #include "groebnerengine.h" #include /* Faster version of the code in bergman.cpp. */ /** The hypergraph of ridges and facets can be considered as a usual bipartite graph where the right nodes are the ridges and the left nodes are the facets. We wish to make a traversal of this bipartite graph keeping track of the boundary edges of the traversed set. The ConeOrbit object represents the orbit of a ridge. The edges of the ridge are listed but only those which belong to the boundary of the set of ridges seen so far. When a ridge is discovered the ConeOrbit object will be created with all its edges present (except the one it was reached by). As progress in the computation is made these edges will be deleted. */ class Boundary2 { typedef pair EFirst; typedef pair ESecond; SymmetryGroup const &sym; map theSet; int theSetSize; public: Boundary2(SymmetryGroup const &sym_): sym(sym_), theSetSize(0) { } int size()const { return theSetSize; } pair normalForm(IntegerVector const &ridge, IntegerVector const &ray)const { pair ret; IntegerVector perm; ret.first=sym.orbitRepresentative(ridge,&perm); ret.second=sym.orbitRepresentativeFixing(SymmetryGroup::compose(perm,ray),ret.first); return ret; } bool containsFlip(IntegerVector const &ridge, IntegerVector const &ray, IntegerVectorList *storedInList_, IntegerVectorList::iterator listIterator_) { assert(ridge.size()==ray.size()); EFirst p=normalForm(ridge,ray); if(theSet.count(p)==1) { theSet[p].first->erase(theSet[p].second); theSet.erase(p); theSetSize--; return true; } theSet[p]=ESecond(storedInList_,listIterator_); theSetSize++; return false; } void removeDuplicates(IntegerVector const &ridge, IntegerVectorList &rays)const { IntegerVectorList ret; set representatives; for(IntegerVectorList::const_iterator i=rays.begin();i!=rays.end();i++) { IntegerVector rep=sym.orbitRepresentativeFixing(*i,ridge); if(representatives.count(rep)==0) { representatives.insert(rep); ret.push_back(*i); } } rays=ret; } void print()const { cerr<< "Boundary" <::const_iterator i=theSet.begin();i!=theSet.end();i++) { AsciiPrinter P(Stderr); P << i->first.first << i->first.second; cerr << endl; } cerr<getMarked().m.exponent==B->getMarked().m.exponent); } static void printMarkedTermIdeal(PolynomialSet const &g, string const &s) { PolynomialSet a=g.markedTermIdeal(); PolynomialSet b=a; minimize(&b); cerr << "Printing marked termideal. "<getMarked(); P.printPolynomial(m); if(division(m,temp,T).isZero()){cerr<<"YES";} cerr< const &facetStack, list const &ridgeStack) { list::const_iterator i=facetStack.begin(); list::const_iterator j=ridgeStack.begin(); AsciiPrinter P(Stderr); cerr<<"STACK:"<ridgeStack.size())goto entry; do { cerr<<"RIDGE:"<parentRidge<rays<parentRay; cerr<ridges; cerr<> a; } PolyhedralFan tropicalTraverse(PolynomialSet coneGroebnerBasis, PolynomialSet idealGroebnerBasis, SymmetryGroup const *symmetryGroup) { PolynomialSet ideal=idealGroebnerBasis; PolynomialRing theRing=coneGroebnerBasis.getRing(); assert(coneGroebnerBasis.numberOfVariablesInRing()==idealGroebnerBasis.numberOfVariablesInRing()); int n=coneGroebnerBasis.numberOfVariablesInRing(); PolyhedralFan ret(n); PolyhedralCone homogeneitySpac=homogeneitySpace(coneGroebnerBasis); int d=homogeneitySpac.dimensionOfLinealitySpace(); SymmetryGroup localSymmetryGroup(n); if(!symmetryGroup)symmetryGroup=&localSymmetryGroup; Boundary2 boundary(*symmetryGroup); list facetStack; list ridgeStack; int numberOfCompletedFacets=0; int numberOfCompletedRidges=0; int stackSize=0; PolyhedralCone currentFacet(n); IntegerVector facetUniqueVector; goto entry; while(1) { L1: // boundary.print(); //printStack(facetStack,ridgeStack); if(!facetStack.front().ridges.empty()) { cerr<<"1"; pathStepRidge top; PolyhedralCone link=currentFacet.link(facetStack.front().ridges.front()); link.canonicalize(); cerr<<"2"; top.parentRidge=facetStack.front().ridges.front(); top.parentRay=link.getUniquePoint(); cerr<<"3"; AsciiPrinter P(Stderr); // P<<"Cone groebner basis"<theCone; rayCone.canonicalize(); { if(rayCone.getUniquePoint().isZero())trouble=true; } rays.push_back(rayCone.getUniquePoint()); } if(trouble) { b.print(P); P< #include #include #include "printer.h" #include "log.h" #include "polynomial.h" #define plog1 if(0) static int log10(int x) { if(x>=10000)return 5; if(x>=1000)return 4; if(x>=100)return 3; if(x>=10)return 2; if(x>=1)return 1; return 0; } PolynomialRing::PolynomialRing(Field const &f, int numberOfVariables) { vector names; for(int i=0;irefCount++; plog1 fprintf(Stderr,"Constructing PolynomialRing\n"); } PolynomialRing::PolynomialRing(Field const &f, vector const &variables) { implementingObject= new PolynomialRingImplementation(f,variables.size(),variables); implementingObject->refCount++; plog1 fprintf(Stderr,"Constructing PolynomialRing\n"); } PolynomialRing PolynomialRing::withVariablesAppended(string variableNames)const { vector names2=implementingObject->variableNames; names2.push_back(variableNames);///!!!!!!! return PolynomialRing(implementingObject->theField,names2); } PolynomialRing PolynomialRing::subRing(IntegerVector const &keepVariable, bool getNamesFromOldRing)const { assert(keepVariable.size()==getNumberOfVariables()); if(!getNamesFromOldRing)return PolynomialRing(implementingObject->theField,keepVariable.sum()); vector names2(keepVariable.sum()); int j=0; for(int i=0;ivariableNames[i]; return PolynomialRing(implementingObject->theField,names2); } int PolynomialRing::variableIndex(string const &name)const { for(int i=0;ivariableNames.size();i++) { if(implementingObject->variableNames[i]==name)return i; } return -1; } string const &PolynomialRing::getVariableName(int i)const { assert(implementingObject); assert(i>=0); assert(ivariableNames.size()); return implementingObject->variableNames[i]; } vector PolynomialRing::getVariableNames()const { return implementingObject->variableNames; } string PolynomialRing::toStringVariableNames()const { stringstream s; for(int i=0;irefCount--; assert(implementingObject->refCount>=0); if(implementingObject->refCount==0) { plog1 fprintf(Stderr,"Deleting implementing object\n"); delete implementingObject; } implementingObject=0; plog1 fprintf(Stderr,"Destructing PolynomialRing\n"); } PolynomialRing::PolynomialRing(PolynomialRing const &a) :implementingObject(a.implementingObject) { implementingObject->refCount++; plog1 fprintf(Stderr,"Copying PolynomialRing\n"); } PolynomialRing& PolynomialRing::operator=(const PolynomialRing& a) { plog1 fprintf(Stderr,"Assigning Field\n"); if(this==&a) { plog1 fprintf(Stderr,"---selfassigning\n"); return *this; } if(implementingObject&& 0==(--(implementingObject->refCount)))delete implementingObject; //assert(a.implementingObject); if(a.implementingObject) { implementingObject=a.implementingObject; implementingObject->refCount++; } else implementingObject=0; return *this; } vector matrixVariableNames(string base, int height, int width) { vector ret; for(int i=0;i vectorVariableNames(string base, int n) { vector ret; for(int i=0;i subsetVariableNames(string base, int n, int choose, bool M2Convention) { vector ret; vector I; if(M2Convention) { for(int i=0;i const &s, int n, int choose, bool M2Convention) { int ret=0; vector I; if(M2Convention) { for(int i=0;i::const_iterator i=s.begin();i!=s.end();i++) { if(I[*i]!=1)isRightSet=false; } if(isRightSet)break; ret++; } while(M2Convention?next_permutation(I.begin(),I.end()):prev_permutation(I.begin(),I.end())); return ret; } Polynomial PolynomialRing::one()const { return Polynomial(Term(getField().zHomomorphism(1),Monomial(*this,IntegerVector(getNumberOfVariables())))); } Polynomial PolynomialRing::zero()const { return Polynomial(*this); } Polynomial PolynomialRing::monomialFromExponentVector(IntegerVector const &v)const { return Polynomial(Term(getField().zHomomorphism(1),Monomial(*this,v))); } Polynomial PolynomialRing::ithVariable(int i, int power)const { if(power==1) return Polynomial(Term(getField().zHomomorphism(1),Monomial(*this,IntegerVector::standardVector(getNumberOfVariables(),i)))); return Polynomial(Term(getField().zHomomorphism(1),Monomial(*this,power*IntegerVector::standardVector(getNumberOfVariables(),i)))); } Polynomial PolynomialRing::polynomialFromField(FieldElement const &c)const { return Polynomial(Term(c,Monomial(*this,IntegerVector(getNumberOfVariables())))); } gfan0.8beta/src/app_groebnercone.cpp0000664000175000017500000001107615177170257017213 0ustar andersanders#include "parser.h" #include "printer.h" #include "polynomial.h" #include "wallideal.h" #include "lp.h" #include "polyhedralcone.h" #include "gfanapplication.h" #include "polyhedralfan.h" #include "halfopencone.h" #include "linalg.h" #include "log.h" class GroebnerConeApplication : public GFanApplication { SimpleOption optionRestrict; SimpleOption optionPair; SimpleOption optionAsFan; SimpleOption optionVectorInput; public: const char *helpText() { return "This program computes a Groebner cone. Three different cases are handled. The input may be a marked reduced Groebner basis in which case its Groebner cone is computed. The input may be just a marked minimal basis in which case the cone computed is not a Groebner cone in the usual sense but smaller. (These cones are described in [Fukuda, Jensen, Lauritzen, Thomas]). The third possible case is that the Groebner cone is possibly lower dimensional and given by a pair of Groebner bases as it is useful to do for tropical varieties, see option --pair. The facets of the cone can be read off in section FACETS and the equations in section IMPLIED_EQUATIONS.\n"; } GroebnerConeApplication(): optionRestrict("--restrict","Add an inequality for each coordinate, so that the the cone is restricted to the non-negative orthant."), optionPair("--pair","The Groebner cone is given by a pair of compatible Groebner bases. The first basis is for the initial ideal and the second for the ideal itself. See the tropical section of the manual."), optionAsFan("--asfan","Writes the cone as a polyhedral fan with all its faces instead. In this way the extreme rays of the cone are also computed."), optionVectorInput("--vectorinput","Compute a cone given list of inequalities rather than a Groebner cone. The input is an integer which specifies the dimension of the ambient space, a list of inequalities given as vectors and a list of equations.") { registerOptions(); } const char *name() { return "_groebnercone"; } int main() { IntegerVectorList equalities; IntegerVectorList normals; int n; if(optionVectorInput.getValue()) { FileParser P(Stdin); n=P.parseInt(); normals=P.parseIntegerVectorList(); equalities=P.parseIntegerVectorList(); } else { PolynomialSet m=FileParser(Stdin).parsePolynomialSetWithRing(); PolynomialSet g(m.getRing()); if(optionPair.getValue()) { g=FileParser(Stdin).parsePolynomialSet(m.getRing()); } else { g=m; m=g.markedTermIdeal(); } { //Check that markings are consistent PolynomialSet M1=g.markedTermIdeal(); PolynomialSet M2=m.markedTermIdeal(); assert(M1.size()==M2.size()); PolynomialSet::const_iterator i1=M1.begin(); for(PolynomialSet::const_iterator i2=M2.begin();i2!=M2.end();i1++,i2++) { assert((*i1-*i2).isZero()); } } n=g.getRing().getNumberOfVariables(); equalities=wallInequalities(m); normals=(wallInequalities(g)); if(optionRestrict.getValue()) { for(int i=0;i newInequalities; for(IntegerVectorList::const_iterator i=normals.begin();i!=normals.end();i++) newInequalities.insert(A.canonicalize(integerVectorToFieldVector(*i,Q)).primitive()); normals=IntegerVectorList(); for(set::const_iterator i=newInequalities.begin();i!=newInequalities.end();i++) normals.push_back(*i); } log1 fprintf(Stderr,"Inequalities"); log1 AsciiPrinter(Stderr).printVectorList(normals); log1 fprintf(Stderr,"Equations"); log1 AsciiPrinter(Stderr).printVectorList(equalities); PolyhedralCone c(normals,equalities,n); c.canonicalize(); if(!optionAsFan.getValue()) AsciiPrinter(Stdout).printPolyhedralCone(c); else { AsciiPrinter P(Stdout); IntegerVectorList empty; HalfOpenCone C(n,c.getEquations(),c.getHalfSpaces(),empty,true); // PolyhedralFan F=faceComplexOfCone(C); PolyhedralCone C2=C.closure(); C2.canonicalize(); PolyhedralFan F(n);F.insert(C2); F.printWithIndices(&P,FPF_default); // F.printWithIndices(&P,false,0,false,false,optionXml.getValue()); } return 0; } }; static GroebnerConeApplication theApplication; gfan0.8beta/src/app_pointconfiguration.cpp0000664000175000017500000000326415177170257020464 0ustar andersanders#include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "termorder.h" #include "gfanapplication.h" #include "wallideal.h" class PointConfigurationApplication : public GFanApplication { IntegerOption dimension1Option; IntegerOption dimension2Option; public: bool includeInDefaultInstallation() { return false; } const char *helpText() { return "This program produces the point configuration of the product of two standard simplices together with their symmetries.\n"; } PointConfigurationApplication(): dimension1Option("-d1","Number of vertices in the first simplex.",2), dimension2Option("-d2","Number of vertices in the second simplex.",2) { registerOptions(); } const char *name() { return "_pointconfiguration"; } int main() { int d1=dimension1Option.getValue(); int d2=dimension2Option.getValue(); assert(d1>=2); assert(d2>=2); IntegerMatrix A(d1*d2,d1+d2); IntegerVector p1(d1*d2); IntegerVector p2(d1*d2); IntegerVector p3(d1*d2); IntegerVector p4(d1*d2); for(int b=0;b class XfigEnumerationPrinter: public EnumerationFilePrinter { int basisCounter; bool largerTriangle; int variableShift; class XFig *xfig; public: XfigEnumerationPrinter(bool _largerTriangle=false); bool basis(const PolynomialSet &groebnerBasis); string extension(); void beginEnumeration(const PolynomialSet &groebnerBasis); void endEnumeration(); void onOpened(); void onClose(); void onClosed(); void setVariableShift(int shift); }; #endif gfan0.8beta/src/app_secondaryfan.cpp0000664000175000017500000002766515177170257017232 0ustar andersanders#include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "breadthfirstsearch.h" #include "termorder.h" #include "ep_standard.h" #include "ep_xfig.h" #include "gfanapplication.h" #include "timer.h" #include "log.h" #include "matrix.h" #include "lll.h" #include "polyhedralfan.h" #include "linalg.h" #include "determinant.h" #include "triangulation.h" #include "intsinpolytope.h" #include "graph.h" #include "triangulation2.h" #include "traverser_secondaryfan.h" #include "symmetrictraversal.h" #include #include #define NOOUTPUT 0 class SecondaryFanApplication : public GFanApplication { SimpleOption hirschOption; SimpleOption searchOption; IntegerOption scaleOption; StringOption optionRestrictingFan; SimpleOption symmetryOption; SimpleOption optionIgnoreCones; InterruptOption optionInterrupt; public: const char *helpText() { return "This program computes the secondary fan of a vector configuration. The configuration is given as an ordered list of vectors. In order to compute the secondary fan of a point configuration an additional coordinate of ones must be added. For example {(1,0),(1,1),(1,2),(1,3)}.\n"; } SecondaryFanApplication(): searchOption("--unimodular","Use heuristics to search for unimodular triangulation rather than computing the complete secondary fan"), scaleOption("--scale","Assuming that the first coordinate of each vector is 1, this option will take the polytope in the 1 plane and scale it. The point configuration will be all lattice points in that scaled polytope. The polytope must have maximal dimension. When this option is used the vector configuration must have full rank. This option may be removed in the future."), symmetryOption("--symmetry","Tells the program to read in generators for a group of symmetries (subgroup of $S_n$) after having read in the vector configuration. The program checks that the configuration stays fixed when permuting the variables with respect to elements in the group. The output is grouped according to the symmetry.\n"), optionRestrictingFan("--restrictingfan","Specify the name of a file containing a polyhedral fan in Polymake format. The computation of the Secondary fan will be restricted to this fan. If the --symmetry option is used then this restricting fan must be invariant under the symmetry and the orbits in the file must be with respect to the specified group of symmetries. The orbits of maximal cones of the file are then read in rather than the maximal cones.\n",0), optionIgnoreCones("--nocones","Tells the program not to output the CONES and MAXIMAL_CONES sections, but still output CONES_COMPRESSED and MAXIMAL_CONES_COMPRESSED if --symmetry is used."), hirschOption("--hirsch","") { hirschOption.hide(); registerOptions(); } const char *name() { return "_secondaryfan"; } PolyhedralFan enumerate(Triangulation2 const &t) { PolyhedralFan ret(t.getN()); list active; active.push_back(t); IntegerVectorList interiorPoints; interiorPoints.push_back(t.interiorPoint()); while(!active.empty()) { Triangulation2 a=active.front(); PolyhedralCone C=a.secondaryCone(); // if(active.size()>100)break;//SLETMIGGGGG //log0 fprintf(stderr,"a\n"); /* { PolyhedralCone C2=C; C2.canonicalize(); }*/ C.canonicalize(); //log0 fprintf(stderr,"b\n"); ret.insert(C); AsciiPrinter P(Stderr); // C.print(&P); active.pop_front(); // fprintf(stderr,"pop\n"); IntegerVectorList flips=a.facets(); for(IntegerVectorList::const_iterator i=flips.begin();i!=flips.end();i++) { { IntegerVectorList t=C.getEquations(); t.push_back(*i); PolyhedralCone CF(C.getHalfSpaces(),t); CF.findFacets(); // CF.canonicalize(); } if(!i->isNonNegative()) //is this the right condition or should i be negated? // if(!(-*i).isNonNegative()) //is this the right condition or should i be negated? { Triangulation2 b=a; log1 AsciiPrinter(Stderr)<<*i; /*fprintf(stderr,"Before:"); b.print(P);*/ // b.flip(*i); b.flipNew(-*i); /*fprintf(stderr,"After:"); b.print(P);*/ if(!b.isEmpty()) { IntegerVectorList inequalities=b.inequalities(); bool isKnown=false; for(IntegerVectorList::const_iterator j=interiorPoints.begin();j!=interiorPoints.end();j++) { bool match=true; for(IntegerVectorList::const_iterator k=inequalities.begin();k!=inequalities.end();k++) { if(dotLong(-*k,*j)<0) { match=false; break; } } if(match)isKnown=true; } if(!isKnown) { active.push_back(b); interiorPoints.push_back(b.interiorPoint()); } } } } } return ret; } PolyhedralFan interactive(Triangulation2 const &t) { Triangulation2 a=t; while(1) { fprintf(stdout,"Triangles in current triangulation:%i\n",(int)a.bases.size()); PolyhedralCone C=a.secondaryCone(); C.canonicalize(); AsciiPrinter Pstd(Stderr); IntegerVectorList flips=a.facets(); int I=0; for(IntegerVectorList::const_iterator i=flips.begin();i!=flips.end();i++,I++) { fprintf(stdout,"%i:\n",I); Pstd.printVector(*i); if(!i->isNonNegative()) { Triangulation2 b=a; //fprintf(stderr,"Before:"); //b.print(P); // b.flip(*i); /* b.flipNew(*i); //fprintf(stderr,"After:"); //b.print(P); fprintf(stdout,"Triangles in new triangulation:%i\n",b.bases.size()); */ } fprintf(stdout,"\n"); } int s; //cin >> s; int err=fscanf(stdin,"%i",&s); assert(err==1); if((s>=0)&&(sisNonNegative()) { Triangulation2 b=a; b.flipNew(-*i); fprintf(stdout,"Triangles in new triangulation:%i\n",(int)b.bases.size()); if(b.bases.size()==abortAtSize) { b.print(Pstd); exit(0); } if((b.bases.size()>a.bases.size())||((rand()&127)==0)) { a=b; break; } } } } PolyhedralFan ret(0); return ret; } PolyhedralFan automaticHirsch(Triangulation2 const &t) { Triangulation2 a=t; while(1) { int nVertices=a.bases.size(); int nEdges=a.coDimensionOneTriangles().size(); int diameter=a.edgeGraph().diameter(); int dimension=a.getD(); int nFacets=a.usedRays().size(); fprintf(stdout,"NVER: %i NEDGES: %i DIAMETER:%i DIMENSION:%i NFACETS:%i\n",nVertices,nEdges,diameter,dimension,nFacets); AsciiPrinter Pstd(Stderr); IntegerVectorList flips=a.facets(); int I=0; float currentScore=a.hirschScore(); cerr << "Current score: " << currentScore <isNonNegative()) { Triangulation2 b=a; b.flipNew(-*i); float bScore=b.hirschScore(); fprintf(stdout,"New score:%f\n",bScore); if((bScore>currentScore)||((rand()&31)==0)) { a=b; break; } } } } PolyhedralFan ret(0); return ret; } int main() { // debug<<(int)sizeof(SymmetricComplex::Cone); // debug<<(int)sizeof(IntegerVector); // debug<<(int)sizeof(vector); IntegerMatrix A=rowsToIntegerMatrix(FileParser(Stdin).parseIntegerVectorList()).transposed(); int n=A.getWidth(); SymmetryGroup s(n); if(symmetryOption.getValue()) { IntegerVectorList generators=FileParser(Stdin).parseIntegerVectorList(); for(IntegerVectorList::const_iterator i=generators.begin();i!=generators.end();i++) { assert(i->size()==n); FieldMatrix M1=integerMatrixToFieldMatrix(A,Q); FieldMatrix M2=integerMatrixToFieldMatrix(rowsToIntegerMatrix(SymmetryGroup::permuteIntegerVectorList(A.getRows(),*i)),Q); M1.reduce(); M1.REformToRREform(true); M2.reduce(); M2.REformToRREform(true); if(!(M1==M2)) { AsciiPrinter(Stderr) << "Permutation "<< *i << " does not keep the configuration fixed.\n"; assert(0); } } s.computeClosure(generators); s.createTrie(); } if(scaleOption.getValue()) { if(::rank(A)!=A.getHeight()) { cerr << "The vector configuration must have full rank in order to use the scale option.\n"; assert(0); } int s=scaleOption.getValue(); cout << "Input configuration:" << endl; AsciiPrinter(Stdout)<dimension()< class EvaluationApplication : public GFanApplication { SimpleOption optionComplex; public: bool includeInDefaultInstallation() { return false; } const char *helpText() { return "This program evaluates a list of polynomials in a point.\n"; } EvaluationApplication(): optionComplex("--complex","Read and evaluate using complex numbers rather than real numbers.") { registerOptions(); } const char *name() { return "_evaluation"; } int main() { FileParser P(Stdin); PolynomialSet g=P.parsePolynomialSetWithRing(); if(0){ for(int i1=1;i1<20;i1++) for(int i2=1;i2<20;i2++) for(int i3=1;i3<20;i3++) { FloatVector v(4); v[0]=i1/20.0; v[1]=i2/20.0; v[2]=i3/20.0; v[3]=1-v[1]-v[2]-v[0]; pout.printFloatVector(g.evaluateFloat(v)); } } if(optionComplex.getValue()) { ComplexVector x=P.parseComplexVector(); pout.printComplexVector(g.evaluateComplex(x)); } else { FloatVector x=P.parseFloatVector(); pout.printFloatVector(g.evaluateFloat(x)); } pout<<"\n"; return 0; } }; static EvaluationApplication theApplication; gfan0.8beta/src/polynomialring.h0000664000175000017500000000457715177170257016423 0ustar andersanders#ifndef POLYNOMIALRING_H_INCLUDED #define POLYNOMIALRING_H_INCLUDED #include #include #include #include "field.h" #include "vektor.h" using namespace std; class PolynomialRingImplementation { public: int refCount; Field theField; int n; vector variableNames; PolynomialRingImplementation(Field const &f, int numberOfVariables, vector const &variableNames_): theField(f), n(numberOfVariables), refCount(0), variableNames(variableNames_) { } }; class PolynomialRing { PolynomialRingImplementation *implementingObject; public: inline int getNumberOfVariables()const{return implementingObject->n;} inline Field const&getField()const{return implementingObject->theField;} /** * Returns a new polynomial ring, the same as *this, except that some variables have been added. * The variables to append are given in a comma separated string. */ PolynomialRing withVariablesAppended(string variableNames)const; PolynomialRing subRing(IntegerVector const &keepVariable, bool getNamesFromOldRing=true)const; int variableIndex(string const &name)const;//returns -1 if no match string const &getVariableName(int i)const; vector getVariableNames()const; /** * Returns a string with comma separated of variable names used for printing. */ string toStringVariableNames()const; class Polynomial one()const; class Polynomial zero()const; class Polynomial monomialFromExponentVector(IntegerVector const &v)const; class Polynomial ithVariable(int i, int power=1)const; class Polynomial polynomialFromField(FieldElement const &c)const; //construtors PolynomialRing(Field const &f, int numberOfVariables); PolynomialRing(Field const &f, vector const &variables); ~PolynomialRing(); PolynomialRing(PolynomialRing const &a);//copy constructor PolynomialRing& operator=(const PolynomialRing& a);//assignment //comparison -- added in 2016. We for now just test if the implementing objects are the same bool operator==(PolynomialRing const &b)const{return implementingObject==b.implementingObject;} }; vector matrixVariableNames(string base, int height, int width); vector vectorVariableNames(string base, int n); vector subsetVariableNames(string base, int n, int choose, bool M2Convention); int subsetToVariableIndex(set const &s, int n, int choose, bool M2Convention); #endif gfan0.8beta/src/app_filter.cpp0000664000175000017500000000231215177170257016021 0ustar andersanders/* * app_filter.cpp * * Created on: Sep 26, 2025 * Author: anders */ #include #include #include #include #include "gfanlib_tableau.h" #include "gfanapplication.h" #include "printer.h" #include "log.h" using namespace std; using namespace gfan; class FilterApplication : public GFanApplication { IntegerOption optionFirstN; public: bool includeInDefaultInstallation() { return false; } const char *helpText() { return "This program is used for filtering various sorts of input.\n"; } FilterApplication(): optionFirstN("--firstn","Output the number of cones in input") { registerOptions(); } const char *name() { return "_filter"; } int main() { if(optionFirstN.getValue()) { SequenceStreamIterator i(std::cin,true); int64_t I=0; std::cout<<"{"; bool first=true; while(!i.eof()) { if(I>=optionFirstN.getValue())break; if(!first)std::cout<<",\n"; auto s=i.getNextString(); std::cout< class MinorsApplication : public GFanApplication { IntegerOption rOption; IntegerOption dOption; IntegerOption nOption; SimpleOption M2Option; SimpleOption optionWithNames; SimpleOption dressianOption; SimpleOption pluckerSymmetriesOption; SimpleOption grassmannNormalizOption; SimpleOption symmetryOption; SimpleOption parametrizeOption; SimpleOption ultraMetricOption; // SimpleOption threeTermOption; public: const char *helpText() { return "This program will generate the r*r minors of a d*n matrix of indeterminates.\n"; } MinorsApplication(): rOption("-r","Specify r.",1), dOption("-d","Specify d.",1), nOption("-n","Specify n.",1), M2Option("-M2","Use Macaulay2 conventions for order of variables."), dressianOption("--dressian","Produce tropical defining the Dressian(3,n) instead. (The signs may not be correct, that is the equations may not be Pluecker relations.)"), optionWithNames("--names","Assign names to the minors."), pluckerSymmetriesOption("--pluckersymmetries","Do nothing but produce symmetry generators for the Pluecker ideal."), grassmannNormalizOption("--grassmannnormalize","Produce polynomials describing the tropical polynomial map taking a plucker vector to a plucker vector where the leaf edges have length one."), symmetryOption("--symmetry","Produces a list of generators for the group of symmetries keeping the set of minors fixed. (Only without --names)."), parametrizeOption("--parametrize","Parametrize the set of d times n matrices of Barvinok rank less than or equal to r-1 by a list of tropical polynomials."), ultraMetricOption("--ultrametric","Produce tropical equations cutting out the ultrametrics.") /*, threeTermOption("--threeTerm","Do nothing but output the three term Plucker relations.")*/ { registerOptions(); grassmannNormalizOption.hide(); } const char *name() { return "_minors"; } IntegerVectorList symmetries(int r, int d, int n) { IntegerVectorList ret; { IntegerVector v1(d*n); IntegerVector v2(d*n); IntegerVector v3(d*n); IntegerVector v4(d*n); for(unsigned int i=0;i const &v, int i) { for(int j=0;j pnames=subsetVariableNames("p",n,d,M2); vector qnames=subsetVariableNames("q",n,d,M2); vector names(pnames.size()*2); for(int i=0;i I; for(int i=0;i setkl; setkl.insert(k); setkl.insert(l); Polynomial f(R); Polynomial g(R); vector J; for(int i=0;i setij; setij.insert(i); setij.insert(j); set setik; setik.insert(i); setik.insert(k); set setjk; setjk.insert(j); setjk.insert(k); set setil; setil.insert(i); setil.insert(l); set setjl; setjl.insert(j); setjl.insert(l); if((J[l]==0)) { IntegerVector v=w; v[subsetToVariableIndex(setil,n,d,M2)]+=-1; v[subsetToVariableIndex(setjl,n,d,M2)]+=-1; v[subsetToVariableIndex(setij,n,d,M2)]+=1; v[subsetToVariableIndex(setkl,n,d,M2)]+=1; f+=Polynomial(Term(R.getField().zHomomorphism(1),Monomial(R,v))); } if((J[k]==0)) { IntegerVector v=w; v[subsetToVariableIndex(setik,n,d,M2)]+=-1; v[subsetToVariableIndex(setjk,n,d,M2)]+=-1; v[subsetToVariableIndex(setij,n,d,M2)]+=1; v[subsetToVariableIndex(setkl,n,d,M2)]+=1; g+=Polynomial(Term(R.getField().zHomomorphism(1),Monomial(R,v))); } } while(next_permutation(J.begin(),J.end())); IntegerVector v(names.size()); v[pnames.size()+subsetToVariableIndex(setkl,n,d,M2)]=1; ret.push_back(Polynomial(Term(R.getField().zHomomorphism(-1),Monomial(R,v)))+f*g); } while(next_permutation(I.begin(),I.end())); return ret; } int main() { FileParser P(Stdin); int d=dOption.getValue(); int n=nOption.getValue(); int r=rOption.getValue(); bool M2=M2Option.getValue(); assert(r<=d); assert(r<=n); PolynomialRing R(Q,matrixVariableNames("m",d,n)); if(parametrizeOption.getValue()) { vector A=matrixVariableNames("a",d,r-1); vector B=matrixVariableNames("b",r-1,n); A.insert(A.end(),B.begin(),B.end()); PolynomialRing R2(Q,A); PolynomialSet s(R2); for(int i=0;i=3) { vector v(n); for(int i=0;i<3;i++) v[n-1-i]=1; do { vector indices; for(int i=0;i varIndices({ subsetToVariableIndex(set({indices[0],indices[1]}),n,2,M2), subsetToVariableIndex(set({indices[1],indices[2]}),n,2,M2), subsetToVariableIndex(set({indices[2],indices[0]}),n,2,M2)}); Polynomial p=R.zero(); for(auto i:varIndices) p+=Term( R.getField().zHomomorphism(1), Monomial(R,IntegerVector::standardVector(R.getNumberOfVariables(), i))); g.push_back(p); } while(next_permutation(v.begin(),v.end())); } AsciiPrinter(Stdout).printPolynomialRing(g.getRing()); AsciiPrinter(Stdout).printPolynomialSet(g); } else if(dressianOption.getValue()) { // int d=3; PolynomialRing R(Q,subsetVariableNames("p",n,d,M2)); PolynomialSet g(R); vector I; if(n-d-2>=0)if(d-2>=0) for(int i=0;i ijkl; set S; int m=32873; for(int i=0;i s=S;s.insert(i);s.insert(j);//s.insert(m); pA[subsetToVariableIndex(s,n,d,M2)]=1; } { set s=S;s.insert(k);s.insert(l);//s.insert(m); pA[subsetToVariableIndex(s,n,d,M2)]=1; } { set s=S;s.insert(i);s.insert(k);//s.insert(m); pB[subsetToVariableIndex(s,n,d,M2)]=1; } { set s=S;s.insert(j);s.insert(l);//s.insert(m); pB[subsetToVariableIndex(s,n,d,M2)]=1; } { set s=S;s.insert(i);s.insert(l);//s.insert(m); pC[subsetToVariableIndex(s,n,d,M2)]=1; } { set s=S;s.insert(j);s.insert(k);//s.insert(m); pC[subsetToVariableIndex(s,n,d,M2)]=1; } Polynomial p= Polynomial(Term(R.getField().zHomomorphism(1),Monomial(R,pA))) -Polynomial(Term(R.getField().zHomomorphism(1),Monomial(R,pB))) +Polynomial(Term(R.getField().zHomomorphism(1),Monomial(R,pC))); g.push_back(p); } } while(next_permutation(I.begin(),I.end())); AsciiPrinter(Stdout).printPolynomialRing(R); AsciiPrinter(Stdout).printNewLine(); AsciiPrinter(stdout).printPolynomialSet(g); } else if(pluckerSymmetriesOption.getValue()) { int N=subsetVariableNames("p",n,d,M2).size(); IntegerVectorList permutations1; { IntegerVector p1(n); IntegerVector p2(n); for(int i=0;i2) { p2[0]=1; p2[1]=0; } permutations1.push_back(p1); permutations1.push_back(p2); } IntegerVectorList permutations2; IntegerVectorList signs2; for(IntegerVectorList::const_iterator k=permutations1.begin();k!=permutations1.end();k++) { IntegerVector p(N); IntegerVector signs(N); vector I; for(int i=0;i indexSet1; set indexSet2; list indexSet2List; for(int i=0;i::const_iterator i=indexSet2List.begin();i!=indexSet2List.end();i++) for(list::const_iterator j=indexSet2List.begin();j!=i;j++) if(*i<*j)permSign*=-1; p[subsetToVariableIndex(indexSet1,n,r,M2)]=subsetToVariableIndex(indexSet2,n,r,M2); signs[subsetToVariableIndex(indexSet2,n,r,M2)]=permSign; } while(next_permutation(I.begin(),I.end())); signs2.push_back(signs); permutations2.push_back(p); } AsciiPrinter(Stdout).printVectorList(permutations2); AsciiPrinter(Stdout).printVectorList(signs2); } /* else if(threeTermOption.getValue()) { for(int i=0;i S; vector ijkl; list indexSet2List; for(int i=0;i a=matrixVariableNames("m",d,n); vector b=subsetVariableNames("p",n,d,M2); for(vector::const_iterator i=b.begin();i!=b.end();i++)a.push_back(*i); R=PolynomialRing(Q,a); } PolynomialSet p=minors(R,r,d,n,optionWithNames.getValue(),M2); AsciiPrinter(Stdout).printPolynomialRing(p.getRing()); AsciiPrinter(Stdout).printNewLine(); AsciiPrinter(Stdout).printPolynomialSet(p); } if(symmetryOption.getValue()) { AsciiPrinter(Stdout)<dimension()==d); PolyhedralCone multiplicityCone(IntegerVectorList(),equations.getRows(),numberOfFacets/*+ridges.size()*(d-1)*/); // multiplicityCone=intersection(multiplicityCone,/*product(*/PolyhedralCone::positiveOrthant(numberOfFacets)/*,PolyhedralCone(ridges.size()*(d-1)))*/); multiplicityCone.printAsFan(&pout); return 0; } if(makeBalancedOption.getValue()) { PolyhedralFan f=PolyhedralFan::readFan(inputOption.getValue(),true,0,0,0); if(facetComplexOption.getValue())f=f.facetComplex(); int n=f.getAmbientDimension(); IntegerMatrix equations=f.balancingEquations(); #if 0 { IntegerMatrix temp=equations.transposed(); temp.prependRow(IntegerVector/*::allOnes*/(equations.getHeight())); IntegerMatrix temp2=IntegerMatrix::identity(numberOfFacets); temp2.prependRow(IntegerVector::allOnes(numberOfFacets)); bool temp3=hasHomogeneousSolution(numberOfFacets+1,temp2.transposed().getRows(),temp.transposed().getRows()); debug<<"hasHomogeneousSolution"<dimension()==d); PolyhedralCone multiplicityCone(IntegerVectorList(),equations.getRows(),numberOfFacets/*+ridges.size()*(d-1)*/); multiplicityCone=intersection(multiplicityCone,/*product(*/PolyhedralCone::positiveOrthant(numberOfFacets)/*,PolyhedralCone(ridges.size()*(d-1)))*/); IntegerVector solution=multiplicityCone.getRelativeInteriorPoint().subvector(0,numberOfFacets); debug<<"SOLUTION"<getRelativeInteriorPoint()); int d=L.getMaxDimension(); IntegerVector sum(L.getAmbientDimension()); for(PolyhedralFan::coneIterator j=L.conesBegin();j!=L.conesEnd();j++) sum=sum+(j->getMultiplicity()*(j->semiGroupGeneratorOfRay())); if(!L.conesBegin()->linealitySpace().contains(sum)) { log1 debug<<"Not balanced at:"<getRelativeInteriorPoint()<<"\n"; log1 for(PolyhedralFan::coneIterator j=L.conesBegin();j!=L.conesEnd();j++) debug<getMultiplicity()<<(j->semiGroupGeneratorOfRay())<<"\n"; log1 debug<<"Sum"<=0)return int(f); return int(f-1); } void calcmy(IntegerMatrix const &b, FloatMatrix &my, Vektor &B) { FloatMatrix bs=integerToFloatMatrix(b); for(int k=0;k(b[k].toVector()),bs[j])/B[j]; bs[k]=bs[k].toVector()-my[k][j]*bs[j].toVector(); } B[k]=dot(bs[k].toVector(),bs[k].toVector()); } } /*void calclambda(IntegerMatrix const &b, FloatMatrix &lambda) { for(int k=0;k B(n); IntegerMatrix M=IntegerMatrix::identity(n);//n*n; IntegerMatrix MInverseTransposed=M; calcmy(b,my,B); while(k=0;l--) { // calclambda(b,lambda); int q=down(my[k][l]+0.5); if(q) { b[k]=b[k].toVector()-q*b[l].toVector(); M[k]=M[k].toVector()-q*M[l].toVector(); IntegerVector temp=q*MInverseTransposed[k].toVector(); MInverseTransposed[l]+=temp; calcmy(b,my,B); } } // calcmy(b,my,B); // calclambda(b,lambda); //test Lovasz' condition if(B[k]<(0.75-my[k][k-1]*my[k][k-1])*B[k-1]) { Vektor temp=b[k].toVector();b[k]=b[k-1];b[k-1]=temp; Vektor temp1=M[k].toVector();M[k]=M[k-1];M[k-1]=temp1; temp1=MInverseTransposed[k].toVector();MInverseTransposed[k]=MInverseTransposed[k-1].toVector();MInverseTransposed[k-1]=temp1; calcmy(b,my,B); k--; if(k<1)k=1; } else k++; } if(inverseTransposedM)*inverseTransposedM=MInverseTransposed; return M; } /*int rank(basis_i B) { int n=B.size(); basis_i M=mlll(B); int kerdim=0; while((kerdim #include #include using namespace std; static mutex imutex; static set thePointers; void registerBoolForInterrupt(boolPointer p) { // std::cerr<<"Register\n"; scoped_lock L(imutex); thePointers.insert(p); } void unregisterBoolForInterrupt(boolPointer p) { // std::cerr<<"UnRegister\n"; scoped_lock L(imutex); thePointers.erase(p); } void setRegisteredBools() { scoped_lock L(imutex); for(auto p:thePointers) { // std::cerr<<"SETTING to true\n"; *p=true; } } // This part is platform specific and probably not correct #if 1 #include #include #include class InterruptHandler { static void handler(int sig) { std::cerr<<"INTERRUPT\n"; setRegisteredBools(); //Deadlock if interrupt happens while imutex is locked /* To avoid deadlock, one could make a thread whose only job was to once in a while check if a bool had been set by an interrupt handler. In that case the thread should call setRegisteredBools. */ /* It not safe to call printf from a signal handler. It should be checked that using std::cerr in an interrupt handler is also not ok.*/ } public: InterruptHandler() { signal(SIGTERM, handler); } }; static InterruptHandler theHandler; #endif gfan0.8beta/src/app_initialdeterminant.cpp0000664000175000017500000001436415177170257020432 0ustar andersanders#include #include "parser.h" #include "printer.h" #include "polynomial.h" #include "buchberger.h" #include "wallideal.h" #include "termorder.h" #include "gfanapplication.h" #include "determinantpoly.h" #include "log.h" using namespace std; class InitialDeterminantApplication : public GFanApplication { public: bool includeInDefaultInstallation() { return false; } SimpleOption optionTakeDerivatives; const char *helpText() { return "This program \n"; } InitialDeterminantApplication(): optionTakeDerivatives("-j","Take derivatives of input vector.") { registerOptions(); } const char *name() { return "_initialdeterminant"; } int main() { FileParser P(Stdin); PolynomialSet g=P.parsePolynomialSetWithRing(); if(optionTakeDerivatives.getValue()) { PolynomialSet G=P.parsePolynomialSet(g.getRing()); G.markAndScale(LexicographicTermOrder()); PolynomialSet::iterator I=g.begin(); for(PolynomialSet::const_iterator i=G.begin();i!=G.end();i++,I++) { *I=Term(i->getMarked().c,Monomial(g.getRing(),-(i->getMarked().m.exponent)))**I; } debug< rows=interval(g.size(),!optionTakeDerivatives.getValue()); list columns=interval(g.size(),!optionTakeDerivatives.getValue()); cerr< #include "parser.h" #include "printer.h" #include "polynomial.h" #include "buchberger.h" #include "wallideal.h" #include "termorder.h" #include "gfanapplication.h" #include "tropical2.h" #include "tropicaldeterminant.h" #include "log.h" using namespace std; class PolyMatrix { public: class PolyMatrixEntry { public: bool isZero; Polynomial p; int maxDegree,minDegree; vector forms; PolyMatrixEntry(Polynomial const &p_, IntegerVector const &w): p(p_), isZero(p_.isZero()) { if(p.isZero()) { maxDegree=-1; minDegree=0; return; } maxDegree=p_.degree(w); minDegree=-p_.degree(-w); // debug<first.exponent,w)]+=Term(i->second,i->first); } } }; list::iterator indexOfSparsestRow(list &rows, list const &columns) { list::iterator ret=rows.end(); int bestNumberOfZeros=-1; for(list::iterator i=rows.begin();i!=rows.end();i++) { int numberOfZeros=0; for(list::const_iterator j=columns.begin();j!=columns.end();j++)numberOfZeros+=data[*i][*j].isZero; if(numberOfZeros>bestNumberOfZeros) { bestNumberOfZeros=numberOfZeros; ret=i; } } // cerr<<":"< > data; PolynomialRing theRing; //constructor for Jacobi matrix PolyMatrix(PolynomialSet const &generators, IntegerVector const &w): theRing(generators.getRing()) { int n=generators.size(); PolynomialSet::const_iterator I=generators.begin(); for(int i=0;i row; for(int j=0;jderivative(j); // debug< l) { cerr<<"{"; for(list::const_iterator i=l.begin();i!=l.end();i++) cerr<<*i<<","; cerr<<"}\n"; } Polynomial determinantForm(list rows, list columns, int degree, int level) { Polynomial ret(theRing); if(rows.size()==1)return data[rows.front()][columns.front()].p; list::iterator chosenRowIterator=indexOfSparsestRow(rows, columns);//rows.begin(); int chosenrow=*chosenRowIterator; { list::iterator temp=chosenRowIterator;temp++; rows.erase(chosenRowIterator); //no need to update rows afterwards since it is stored on the stack } if(level==0)cerr<<"-"<::iterator i=columns.begin();i!=columns.end();i++) { int chosencol=*i; if(!data[chosenrow][chosencol].isZero) { list::iterator temp=i;temp++; columns.erase(i); i=temp; ret+=data[chosenrow][chosencol].p*determinantForm(rows,columns,degree,level+1)*theRing.getField().zHomomorphism(sign); columns.insert(i,chosencol); i--; } sign*=-1; } rows.push_front(chosenrow); return ret; } }; class InitialDeterminantApplication : public GFanApplication { public: const char *helpText() { return "This program \n"; } InitialDeterminantApplication() { registerOptions(); } char *name() { return "_initialdeterminant"; } list interval(int n) { list ret; for(int i=0;i rows=interval(g.size()); list columns=interval(g.size()); pout< #define OM_NDEBUG #define NDEBUG #include "singular/mod2.h" #include "singular/structs.h" // Singular structs #include "singular/ring.h" #include "singular/numbers.h" #include "singular/polys.h" #include "singular/longrat.h" #include "singular/ideals.h" #include "singular/kstd1.h" #include "singular/options.h" //#include #undef NDEBUG #include "polynomialring.h" #include "polynomial.h" #include "field_rationals.h" #include "printer.h" #include "log.h" #include ring singularRing(PolynomialRing const &r); void freeSingularRing(ring R); poly singularPolynomial(Polynomial const &p); ideal singularPolynomialSet(PolynomialSet const &g); FieldElement fromSingularCoefficient(PolynomialRing const &r, number c, const ring rSing); Polynomial fromSingularPolynomial(PolynomialRing const &r, poly &p, const ring rSing); PolynomialSet fromSingularIdeal(PolynomialRing const &r, ideal i, const ring rSing); #endif gfan0.8beta/src/app_combinerays.cpp0000664000175000017500000000512315177170257017052 0ustar andersanders#include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "lp.h" #include "gfanapplication.h" #include "polyhedralcone.h" #include "polymakefile.h" #include "determinant.h" #include "subspace.h" #include "symmetry.h" class CombineRaysApplication : public GFanApplication { StringOption inputOption; StringOption sectionOption; SimpleOption dumpOption; IntegerOption dumpHeightOption; IntegerOption dumpWidthOption; public: const char *helpText() { return "This program combines rays from the specified polymake file by adding according to a list of vectors of indices given on the standard input.\n"; } CombineRaysApplication(): inputOption("-i","Specify the name of the input file.","examples/grassmann3_7.out"), sectionOption("--section","Specify a section of the polymake file to use as input, rather than standard input.",0), dumpOption("--dump","Dump specified section as a matrix rather than combining the rays"), dumpHeightOption("--dheight","Specify height of matrix to be dumped.",1), dumpWidthOption("--dwidth","Specify width of matrix to be dumped.",1) { dumpOption.hide(); dumpHeightOption.hide(); dumpWidthOption.hide(); registerOptions(); } const char *name() { return "_combinerays"; } int main() { PolymakeFile inFile; inFile.open(inputOption.getValue()); if(dumpOption.getValue()) { pout< > l=inFile.readMatrixIncidenceProperty(sectionOption.getValue()); for(vector >::const_iterator i=l.begin();i!=l.end();i++) { IntegerVector temp(i->size()); int J=0; for(list::const_iterator j=i->begin();j!=i->end();j++,J++)temp[J]=*j; comb.push_back(temp); } } else comb=P.parseIntegerVectorList(); IntegerVectorList result; for(IntegerVectorList::const_iterator j=comb.begin();j!=comb.end();j++) { IntegerVector interiorPoint(N); for(int i=0;isize();i++) { interiorPoint+=rays[(*j)[i]]; } result.push_back(interiorPoint); } AsciiPrinter(Stdout).printVectorList(result); fprintf(Stdout,"\n"); return 0; } }; static CombineRaysApplication theApplication; gfan0.8beta/src/singularconversion.cpp0000664000175000017500000000712515177170257017635 0ustar andersanders#include "singularconversion.h" #include const char *singular_date=__DATE__" "__TIME__; ring singularRing(PolynomialRing const &r) { // FieldRationalsImplementation *q=dynamic_castr.getField().implementingObject; ring ret=(ring)omAlloc0(sizeof(sip_sring)); if(r.getField().isRationals()) { ret->ch=0; } else { assert(0); } ret->N=r.getNumberOfVariables(); ret->names=(char**) omAlloc(ret->N*sizeof(char*)); for(int i=0;iN;i++) ret->names[i]=omStrDup(r.getVariableName(i).c_str()); ret->order=(int*)omAlloc0(3*sizeof(int)); ret->block0=(int*)omAlloc0(3*sizeof(int)); ret->block1=(int*)omAlloc0(3*sizeof(int)); // ret->order[0]=ringorder_wp;//degree revlex ret->order[0]=ringorder_Wp;//degree lex ret->block0[0]=1;ret->block1[0]=ret->N; ret->order[1]=ringorder_C; ret->wvhdl=(int**)omAlloc0(3*sizeof(int*)); ret->wvhdl[0]=(int*)omAlloc(ret->N*sizeof(int)); for(int i=0;iN;i++) ret->wvhdl[0][i]=1; rComplete(ret); rChangeCurrRing(ret); return ret; } void freeSingularRing(ring R) { rKill(R); } poly singularPolynomial(Polynomial const &p) { int n=p.getRing().getNumberOfVariables(); poly r=NULL; for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++) { poly p=pInit(); FieldElement c=i->second; mpq_t *C=fieldElementToGmp(c); number n2=nlRInit(0); // assert(0);//The following two lines used to compile // mpz_init_set(&(n2)->z,mpq_numref(*C)); // mpz_init_set(&(n2)->n,mpq_denref(*C)); mpz_init_set(&(n2)->z[0],mpq_numref(*C)); mpz_init_set(&(n2)->n[0],mpq_denref(*C)); n2->s=0; nNormalize(n2); pSetCoeff0(p,n2); for(int j=0;jfirst.exponent[j]); pSetComp(p,0); pSetm(p); r=pAdd(r,p); } return r; } ideal singularPolynomialSet(PolynomialSet const &g) { int m=g.size(); ideal i=idInit(m,1); int J=0; for(PolynomialSet::const_iterator j=g.begin();j!=g.end();j++,J++) { i->m[J]=singularPolynomial(*j); } return i; } //FieldElement fromSingularCoefficient(PolynomialRing const &r, number c) FieldElement fromSingularCoefficient(PolynomialRing const &r, number c, const ring rSing) { FieldElement C(r.getField()); // if((nInt(c)==0) && ((SR_HDL(c) & SR_INT)==0)) if(((SR_HDL(c) & SR_INT)==0)) { mpq_t value; mpq_init(value); mpz_set(mpq_numref(value), &(c->z)[0]); if (c->s <3) mpz_set(mpq_denref(value), &(c->n)[0]); else mpz_set_si(mpq_denref(value),1); C=fieldElementFromGmp(&value); } else { // assert(0);//The following line used to compile, in 2009?? // C=r.getField().zHomomorphism(nInt(c)); C=r.getField().zHomomorphism(n_Int(c,rSing)); } return C; } Polynomial fromSingularPolynomial(PolynomialRing const &r, poly &p, const ring rSing) { int n=r.getNumberOfVariables(); Polynomial ret(r); poly q=p; while(p) { IntegerVector v(n); for(int i=0;im[j]!=NULL) ret.push_back(fromSingularPolynomial(r,i->m[j],rSing)); // AsciiPrinter(Stderr).printPolynomialSet(ret); return ret; } gfan0.8beta/src/latticeideal.cpp0000664000175000017500000000143515177170257016325 0ustar andersanders#include "latticeideal.h" #include "binomial.h" #include "buchberger.h" #include "printer.h" #include "field_rationals.h" IntegerVectorList latticeIdealRevLex(IntegerMatrix const &lattice) { PolynomialRing theRing(Q,lattice.getHeight()); IntegerMatrix L=lattice.transposed(); PolynomialSet g(theRing); for(int i=0;isaturate(); } IntegerVectorList ret; for(PolynomialSet::const_iterator j=g.begin();j!=g.end();j++) ret.push_back(binomialToIntegerVector(*j)); return ret; } gfan0.8beta/src/traverser_secondaryfan.h0000664000175000017500000000156015177170257020116 0ustar andersanders#ifndef TRAVERSER_SECONDARYFAN_H_INCLUDED #define TRAVERSER_SECONDARYFAN_H_INCLUDED #include "symmetrictraversal.h" #include "triangulation2.h" Triangulation2 triangulationWithFullDimensionalIntersection(Triangulation2 g, PolyhedralCone const &c); class SecondaryFanTraverser: public ConeTraverser { Triangulation2 theTriangulation; PolyhedralCone theCone; PolyhedralCone theRestrictingCone; // bool isHomogeneous; bool isSecondaryFanComplete; int n,d; void updatePolyhedralCone(); public: SecondaryFanTraverser(Triangulation2 const &triangulation_); SecondaryFanTraverser(Triangulation2 const &triangulation_, PolyhedralCone const &restrictingCone); virtual void changeCone(IntegerVector const &ridgeVector, IntegerVector const &rayVector); virtual IntegerVectorList link(IntegerVector const &ridgeVector); PolyhedralCone & refToPolyhedralCone(); }; #endif gfan0.8beta/src/app_tropicalhomotopy.cpp0000664000175000017500000002031115177170257020147 0ustar andersanders/* * app_tropicalhomotopy.cpp * * Created on: Jan 16, 2015 * Author: anders */ #include #include "gfanlib_circuittableint.h" #include "parser.h" #include "printer.h" #include "gfanapplication.h" #include "log.h" #include "myassert.h" typedef gfan::CircuitTableInt32 mvtyp; #include "gfanlib_tropicalhomotopy.h" #include "gfanlib_mixedvolume.h" #include #include #include #include using namespace gfan; using namespace gfan::MixedVolumeExamples; class TimingResult{ string name; string mixedVolume; map timings; bool isHLine; bool done; long long int n; public: TimingResult(string name_, int n_=0): name(name_), n(n_), done(0) { isHLine=name=="hline"; } void time(int j) { if(!isHLine) { string jOption=j?"-j16":""; string s=string("/usr/bin/time -o gfantimingtemp -f \"%e\" ./gfan _tropicalhomotopy > gfanmvtemp ")+jOption+" --"+name; cerr<<"Running:\n"<>a; } long long int mv; { ifstream f("gfanmvtemp"); f>>mv; } mixedVolume=to_string(mv); timings[j]=a; } } void doTime(bool doSingleThreaded) { if(!done) { if(doSingleThreaded)time(0); time(1); done=true; } } string floatToString(double a) { stringstream s; s.precision(1); s.setf(std::ios::fixed,std::ios::floatfield); s< &results) { for(int i=0;i results; int leaveout=0;//0; results.push_back(TimingResult("hline")); for(int i=12;i<=18-leaveout;i++) results.push_back(TimingResult(string("cyclic")+to_string((long long int)i),i)); results.push_back(TimingResult("hline")); dumpTable(results); for(int i=18;i<=26-leaveout;i++) results.push_back(TimingResult(string("noon")+to_string((long long int)i),i)); results.push_back(TimingResult("hline")); dumpTable(results); for(int i=18;i<=26-leaveout;i++) results.push_back(TimingResult(string("chandra")+to_string((long long int)i),i)); results.push_back(TimingResult("hline")); dumpTable(results); for(int i=15;i<=26-leaveout;i++) results.push_back(TimingResult(string("katsura")+to_string((long long int)i),i+1)); results.push_back(TimingResult("hline")); dumpTable(results); for(int i=5;i<=10-leaveout;i++) results.push_back(TimingResult(string("gaukwa")+to_string((long long int)i),2*i)); results.push_back(TimingResult("hline")); dumpTable(results); for(int i=19;i<=28-leaveout;i++) results.push_back(TimingResult(string("eco")+to_string((long long int)i),i)); results.push_back(TimingResult("hline")); dumpTable(results); } class TropicalHomotopyApplication : public GFanApplication { SimpleOption optionProduceTable; SimpleOption optionVectorInput; IntegerOption optionCyclic; IntegerOption optionNoon; IntegerOption optionChandra; IntegerOption optionKatsura; IntegerOption optionGaukwa; IntegerOption optionEco; IntegerOption optionLoadFlow; IntegerOption optionNThreads; IntegerOption optionSteps; SimpleOption optionIEEE14; public: const char *helpText() { return "In the future this program will compute do tropical homotopy.\n"; } TropicalHomotopyApplication(): optionProduceTable("--table","Produces table for paper."), optionVectorInput("--vectorinput","Read in a list of point configurations instead of a polynomial ring and a list of polynomials."), optionCyclic("--cyclic","Use cyclic-n example instead of reading input."), optionNoon("--noon","Use Noonburg-n example instead of reading input."), optionChandra("--chandra","Use Chandrasekhar-n example instead of reading input."), optionKatsura("--katsura","Use Katsura-n example instead of reading input."),/* Note that Verschelde's mixed volumes for the Katsura examples do not match those produced by gfan. The configurations do not seem to be identical for all n. */ optionGaukwa("--gaukwa","Use Gaukwa-n example instead of reading input."), optionEco("--eco","Use Eco-n example instead of reading input."), optionLoadFlow("--loadflow","Load flow equations of a graph being cycle with n vertices."), optionIEEE14("--ieee14","Load flow equations for the IEEE 14-bus system."), optionNThreads("-j","Number of threads"), optionSteps("-s","Number of steps", 500) { optionProduceTable.hide(); optionLoadFlow.hide(); optionIEEE14.hide(); registerOptions(); } const char *name() { return "_tropicalhomotopy"; } virtual bool includeInDefaultInstallation(){return false;} IntMatrix rowsToIntegerMatrix(IntegerVectorList const &l) { assert(l.size()); IntMatrix ret(l.size(),l.front().size()); IntegerVectorList::const_iterator I=l.begin(); for(int i=0;i edgeFlow(int n, bool special) { vector tuple; if(special)assert(n==14); n--; #if 1 for(int swap=0;swap<2;swap++) for(int i=0;i tuple; if(optionIEEE14.getValue()) tuple=edgeFlow(14,1); else if(optionLoadFlow.getValue()) tuple=edgeFlow(optionLoadFlow.getValue(),0); else if(optionCyclic.getValue()) tuple=cyclic(optionCyclic.getValue()); else if(optionNoon.getValue()) tuple=noon(optionNoon.getValue()); else if(optionChandra.getValue()) tuple=chandra(optionChandra.getValue()); else if(optionKatsura.getValue()) tuple=katsura(optionKatsura.getValue()); else if(optionGaukwa.getValue()) tuple=gaukwa(optionGaukwa.getValue()); else if(optionEco.getValue()) tuple=eco(optionEco.getValue()); else { IntegerVectorListList tuple1; if(optionVectorInput.getValue()) { tuple1=FileParser(Stdin).parseIntegerVectorListList(); } else { PolynomialSet g=FileParser(Stdin).parsePolynomialSetWithRing(); tuple1=g.exponents(); } for(IntegerVectorListList::const_iterator i=tuple1.begin();i!=tuple1.end();i++) tuple.push_back(rowsToIntegerMatrix(*i).transposed()); } log1 for(auto i=tuple.begin();i!=tuple.end();i++)std::cerr<<*i; cout< > cones=inFile.readMatrixIncidenceProperty("MAXIMAL_CONES"); IntegerMatrix multiplicities; if(readMultiplicities) multiplicities=inFile.readMatrixProperty("MULTIPLICITIES",cones.size(),1); PolyhedralFan ret(n); IntegerVectorList equations=inFile.readMatrixProperty("LINEALITY_SPACE",lindim,n).getRows(); IntegerMatrix linearForms(cones.size(),n); if(readLinearForms)linearForms=inFile.readMatrixProperty("LINEAR_FORMS",cones.size(),n); IntegerMatrix rayValues(nRays,1); if(readRayValues)rayValues=inFile.readMatrixProperty("RAY_VALUES",nRays,1); IntegerMatrix linealityValues(lindim,1); if(readRayValues)linealityValues=inFile.readMatrixProperty("LINEALITY_VALUES",lindim,1); int I=0; for(vector >::const_iterator i=cones.begin();i!=cones.end();i++,I++) { IntegerVectorList coneGenerators; FieldMatrix LFA(Q,lindim+i->size(),n); FieldVector LFB(Q,lindim+i->size()+n); int J=0; for(list::const_iterator j=i->begin();j!=i->end();j++,J++) { coneGenerators.push_back(rays[*j]); LFA[J]=integerVectorToFieldVector(rays[*j],Q); LFB[J]=Q.zHomomorphism(rayValues[*j][0]); } int K=0; for(IntegerVectorList::const_iterator j=equations.begin();j!=equations.end();j++,J++,K++) { LFA[J]=integerVectorToFieldVector(*j,Q); LFB[J]=Q.zHomomorphism(linealityValues[K][0]); } if(readRayValues) { AsciiPrinter P(Stderr);//log0 P< comments=f.renamingStrings(divisor.getRaysInPrintingOrder(&sym),originalRays,linealitySpace,&sym); // divisor.printWithIndices(&Q,true,0,false,false,false,false,&comments); divisor.printWithIndices(&Q,FPF_default|FPF_multiplicities,0,&comments); /* FileParser P(Stdin); PolynomialRing R=P.parsePolynomialRing(); PolynomialSet s=P.parsePolynomialSet(R); Polynomial sum(R); for(PolynomialSet::const_iterator i=s.begin();i!=s.end();i++) sum+=*i; AsciiPrinter(Stdout).printPolynomial(sum); */ return 0; } }; static TropicalWeilDivisorApplication theApplication; gfan0.8beta/src/app_stats.cpp0000664000175000017500000000452315177170257015700 0ustar andersanders#include "parser.h" #include "printer.h" #include "polynomial.h" #include "division.h" #include "buchberger.h" #include "wallideal.h" #include "lp.h" #include "reversesearch.h" #include "polyhedralfan.h" #include "breadthfirstsearch.h" #include "termorder.h" #include "ep_standard.h" #include "ep_xfig.h" #include "gfanapplication.h" #include "timer.h" class StatsApplication : public GFanApplication { public: const char *helpText() { return "This program takes a list of reduced Groebner bases for the same ideal and computes various statistics. The following information is listed: the number of bases in the input, the number of variables, the dimension of the homogeneity space, the maximal total degree of any polynomial in the input and the minimal total degree of any basis in the input, the maximal number of polynomials and terms in a basis in the input.\n"; } StatsApplication() { registerOptions(); } const char *name() { return "_stats"; } int main() { FileParser p(Stdin); PolynomialRing theRing=p.parsePolynomialRing(); int c=p.nextNonBlank(); int dmin=-1; int dmax=-1; int homog=-1; int n=-1; int maxNumberOfTerms=-1; int maxNumberOfPolynomials=-1; int counter=0; assert(p.isLeftBracket(c)); do { PolynomialSet g=p.parsePolynomialSet(theRing); if(homog==-1) { n=g.numberOfVariablesInRing(); homog=dimensionOfHomogeneitySpace(g); } int d=g.totalDegree(); if(dmin==-1 || ddmax)dmax=d; if(maxNumberOfTerms<(int)g.totalNumberOfTerms())maxNumberOfTerms=(int)g.totalNumberOfTerms(); if(maxNumberOfPolynomials<(int)g.size())maxNumberOfPolynomials=(int)g.size(); counter++; } while((c=p.nextNonBlank())==','); assert(p.isRightBracket(c)); fprintf(Stdout,"Number of reduced Groebner bases: %i\n",counter); fprintf(Stdout,"Number of variables: %i\n",n); fprintf(Stdout,"Dimension of homogeneity space: %i\n",homog); fprintf(Stdout,"Maximal total degree of a Groebner basis: %i\n",dmax); fprintf(Stdout,"Minimal total degree of a Groebner basis: %i\n",dmin); pout<<"Maximal number of polynomials in Groebner basis: "< #include // A general application. // This could solve several problems: // - the help text could be automatically generated // - duplicate main code could be removed // - it would be easy to parse options // - all applications could be linked to a single file thereby saving disk-space /** @brief A command line application. The class Application describes the general command line application. The compiled Gfan executable consists of several command line applications. When the static main() is run it is decided which application to invoke by investigating argv[0] and other command line options. A command line application will register itself during construction. Typically the Appliction is a static object. Therefore the Application has been registered when main() is executed. The static main() is a friend of Application which makes it possible for main() to search through the linked list of Applications. The Application::next member is used as a next pointer in the linked list of registered Application s. An Application can have a set of associated Option s. When an Option is constructed it is put into a static temporary linked list. When an Application has constructed all its Options it should call registerOptions() to move the linked list of Options into the Application s linked lists of Option s. */ class Application{ // Nested Option Classes /** The general commmand line option. */ protected: /** This abstract superclass describes the general Option. An Option object is intended to be part of an Application object. Before the Application::main() is run the command line is parsed by matching argv[1], argv[2]... with the Option s of the Application in question. The matches() method is called with argv[i] and by the return value the Option tells if it matches the argv[i] string. If this is the case then the parseValue() method will be called to let the Option take values from argv[i+1], argv[i+2]... as it likes. All this has already been taken care of in the code of the subclasses of this class. These subclasses can be used without worrying about the implementation details. See the documentation for the respective subclasses. */ class Option{ bool hidden; protected: /** The base pointer for a temporary linked list of Option s. When an Option is created it is added to the list by its constructor. The content of this list is later moved to a linked list for the Application of which the Option is a part. */ static Option *constructionList; public: Option(); /** An Option can be hidden which means that it does not show up in the help text of the Application. This function tells whether the Option is hidden or not. */ bool isHidden()const; /** This method hides the Option. See isHidden(). */ void hide(bool b=true); /** This method tells whether the Option matches a given string or not. Notice that a Option may match more than a single string allowing command line parameters such as -n2 and -n7 to match the same Option. @param s The string to be matched. */ virtual bool matches(const char *s)=0; /** @todo document this method */ virtual void onOptionsParsed(); /** This function returns a string that will be used in the documentation to denote the Option. */ virtual std::string documentationMatchString()=0; /** This function returns the a string describing the Option to be used for documentation. */ virtual std::string documentationDescription()=0; /** When this method is called the Option has the possibility to read off its value from the command line through argv[]. This only happens if the Option already accepted the argv[t] string as a match through matches(). How many additional strings the Option reads its value from is written to *numberOfArguments. @param t the index of the matching command line string. @param argv the command line strings. @param ok is considered to be a return value telling whether the commandline strings were parsed correctly. The pointer is not allowed to be null. @param numberOfArguments is considered to be return value telling how many additional (besides argv[t]) command line strings the method parsed. This allows each option to "eat" a different number of command line strings. The pointer is not allowed to be null. */ virtual void parseValue(int t, char **argv, bool *ok, int *numberOfArgumentsParsed)=0; static Option *getOptionList(); Option *next; }; class StringMatchingOption: public Option { protected: const char *matchString; const char *description; bool isExactMatch(const char *s); public: virtual std::string documentationMatchString(); virtual std::string documentationDescription(); StringMatchingOption(const char *s, const char *description_=""); bool matches(const char *s); }; class SimpleOption: public StringMatchingOption{ bool value; public: SimpleOption(const char *s, const char *description); void parseValue(int t, char **argv, bool *ok, int *numberOfArgumentsParsed); bool getValue(); }; class ValueOption: public StringMatchingOption{ public: virtual std::string documentationMatchString(); virtual void assignValue(const char *s)=0; ValueOption(const char *s, const char *description); void parseValue(int t, char **argv, bool *ok, int *numberOfArgumentsParsed); }; class StringOption: public ValueOption{ const char *value; public: StringOption(const char *s, const char *description, const char *initialValue=0); void assignValue(const char *s); const char *getValue(); }; class IntegerOption: public ValueOption{ int value; bool hasRange; int lower,upper; public: IntegerOption(const char *s, const char *description, int initialValue=0); IntegerOption(const char *s, const char *description, int initialValue, int lower, int upper); void assignValue(const char *s); int getValue(); }; class ZeroOneOption: public IntegerOption{ public: ZeroOneOption(const char *s, const char *description, int initialValue=0); }; // Application members private: static class Application *applicationList; static class Application *findApplication(char *name); protected: static std::list getSortedApplicationList(); /** This static procedure makes a symbolic link (on the file system) for registered Application s to the Gfan executable in the specified path. This procedure is supposed to be called during the installation of Gfan. @param name The name of the Gfan executable. @param all If false an Application only gets a symbolic link if its includeInDefaultInstallation() returns true. @param path The path to the Gfan executable and directory of the symbolic links. Must be terminated by a '/'. */ static void makeSymbolicLinks(const char *name, bool all, const char *path); /** This procedure produces the list of Gfan Application s in the appendix of the Gfan user's manual. The contents is written as LaTeX to stdout. The output contains one subsection for each Application. An application is not included in the list if its includeInDefaultInstallation() returns false. @param all Forces all Application s to be documented. */ static void produceLatexDocumentation(bool all); /** The base pointer for a the linked list of the Option s of the Application. */ class Application::Option* optionList; public: /** Superconstructor. Adds the Application to the static linked list of Application s. */ Application(); /** The next pointer for the linked list of existing Application s. */ class Application *next; /** This procedure parses the arguments for the static main() and assigns values of the appropriate Option s of the Application. @param argc The number of arguments on the command line (including the name of the command). See K&R:"The C Programming Language". @param argv The arguments. See K&R:"The C Programming Language". @param argumentsToSkip The number of arguments to skip (excluding the name of the executable). Usually no options are skipped, but if the program is not invoked using a symbolic link, the first (index 0) argument is the executable name and the second (index 1) argument is the Application name which should be skipped when parsing Option s. */ bool parseOptions(int argc, char **argv, int argumentsToSkip); /** @return true if the Application should appear in the documentation / be installed during default installation of Gfan. */ virtual bool includeInDefaultInstallation(); /** After construction of its Application::Option s an Application should call this procedure to collect the Option s in the optionList. */ void registerOptions(); /** This procedure writes the help text of the Application to stderr and lists the Option s. */ virtual void printHelp(); /** This virtual method contains the code to be executed when the Application is run. @return The value to be passed to the shell when the program finishes execution. */ virtual int main()=0; virtual void onExit(); /** @return The help text for the documentation. The format is usual ASCII. */ virtual const char *helpText()=0; friend int main(int argc, char *argv[]); /** This function returns the name of the Application. This name is used for matching with arg[0] and other options to decide which application to run. */ virtual const char *name()=0; }; #endif gfan0.8beta/src/symmetrictraversal.cpp0000664000175000017500000004735515177170257017654 0ustar andersanders#include "symmetrictraversal.h" #include #include #include #include "log.h" using namespace std; bool ConeTraverser::hasNoState()const { return false; } void ConeTraverser::walkTo(IntegerVector const &target) { while(!refToPolyhedralCone().contains(target)) { // TODO: make a straight line walk - the current implementation might cycle!!!! refToPolyhedralCone().canonicalize(); IntegerVectorList ineqs=refToPolyhedralCone().getHalfSpaces(); IntegerVector v; for(IntegerVectorList::const_iterator i=ineqs.begin();i!=ineqs.end();i++) if(dotLong(*i,target)<0) { v=*i; break; } IntegerVectorList temp=refToPolyhedralCone().getEquations();temp.push_back(v); PolyhedralCone facet(refToPolyhedralCone().getHalfSpaces(),temp,n); changeCone(facet.getRelativeInteriorPoint(),-v); } } void ConeTraverser::orthantCalibrate() { IntegerVector s=refToPolyhedralCone().getRelativeInteriorPoint(); for(int i=0;i EFirst; #if 0 typedef pair ESecond; #else struct ESecond{// L2 maybe zero, in that case i1==i2 IntegerVectorList* L1; IntegerVectorList::iterator i1; IntegerVectorList *L2; IntegerVectorList::iterator i2; ESecond():L1(0),L2(0){}; ESecond(IntegerVectorList* L1_,IntegerVectorList::iterator i1_,IntegerVectorList* L2_,IntegerVectorList::iterator i2_): L1(L1_), i1(i1_), L2(L2_), i2(i2_) { } }; #endif SymmetryGroup const &sym; map theSet; int theSetSize; public: Boundary(SymmetryGroup const &sym_): sym(sym_), theSetSize(0) { } int size()const { return theSetSize; } pair normalForm(IntegerVector const &ridge, IntegerVector const &ray)const { pair ret; IntegerVector perm; ret.first=sym.orbitRepresentative(ridge,&perm); ret.second=sym.orbitRepresentativeFixing(SymmetryGroup::compose(perm,ray),ret.first); return ret; } bool containsFlip(IntegerVector const &ridge, IntegerVector const &ray, IntegerVectorList *storedInList_, IntegerVectorList::iterator listIterator_, IntegerVectorList *storedInList2_, IntegerVectorList::iterator listIterator2_) { // debug<<"F\n"; assert(ridge.size()==ray.size()); EFirst p=normalForm(ridge,ray); // debug<erase(theSet[p].second); #else // debug<<"F3\n"; theSet[p].L1->erase(theSet[p].i1); if(theSet[p].L2)theSet[p].L2->erase(theSet[p].i2); #endif theSet.erase(p); theSetSize--; // debug<<"G\n"; return true; } // debug<<"P\n"; #if 0 theSet[p]=ESecond(storedInList_,listIterator_); #else // fprintf(stderr,"%x\n",storedInList_); // fprintf(stderr,"%x\n",storedInList2_); // debug<<*listIterator_<<*listIterator2_<<"\n"; ESecond a(storedInList_,listIterator_,storedInList2_,listIterator2_); // debug<<"TEST\n"; // debug<<*listIterator_<<*listIterator2_<<"\n"; // debug< representatives; IntegerVectorList::const_iterator I; if(normals)I=normals->begin(); for(IntegerVectorList::const_iterator i=rays.begin();i!=rays.end();i++) { IntegerVector rep=sym.orbitRepresentativeFixing(*i,ridge); if(representatives.count(rep)==0) { representatives.insert(rep); ret.push_back(*i); if(normals)normalsRet.push_back(*I); } if(normals)I++; } rays=ret; if(normals)*normals=normalsRet; } void print()const { cerr<< "Boundary" <::const_iterator i=theSet.begin();i!=theSet.end();i++) { AsciiPrinter P(Stderr); P << i->first.first << i->first.second; cerr << endl; } cerr<getMarked().m.exponent==B->getMarked().m.exponent); } /*static void printMarkedTermIdeal(PolynomialSet const &g, string const &s) { PolynomialSet a=g.markedTermIdeal(); PolynomialSet b=a; minimize(&b); cerr << "Printing marked termideal. "< const &facetStack, list const &ridgeStack) { list::const_iterator i=facetStack.begin(); list::const_iterator j=ridgeStack.begin(); AsciiPrinter P(Stderr); cerr<<"STACK:"<ridgeStack.size())goto entry; do { cerr<<"RIDGE:"<parentRidge<rays<parentRay; cerr<ridges; cerr<> a; } void symmetricTraverse(ConeTraverser &traverser, SymmetricTarget &target, SymmetryGroup const *symmetryGroup) { //TO DO: at the moment a conetraverser can only report that it has no state if it is traversing a complete fan. //This is because symmetricTraverse needs go BACK to compute the links of previously seen facets. //Alternative the links should be computed and stored the first time a facet is seen. //Or the conetraverse should be given more info about the ridge to make computations quicker. int lastNumberOfEdges=0; float averageEdge=0; int n=traverser.refToPolyhedralCone().ambientDimension();//symmetryGroup->sizeOfBaseSet(); SymmetryGroup localSymmetryGroup(n); if(!symmetryGroup)symmetryGroup=&localSymmetryGroup; // IntegerVectorList coordinatesStack;coordinatesStack.push_back(IntegerVector(n)); IntegerVectorList linealitySpaceGenerators=traverser.refToPolyhedralCone().generatorsOfLinealitySpace(); int d=traverser.refToPolyhedralCone().dimension(); Boundary boundary(*symmetryGroup); list facetStack; list ridgeStack; int numberOfCompletedFacets=0; int numberOfCompletedRidges=0; int stackSize=0; IntegerVector facetUniqueVector; bool firstStep=true; // goto entry; while(1) { L2: // printStack(facetStack,ridgeStack); //check if ProcessRidge needs to make more ProcessFacet calls if((!firstStep) && ridgeStack.front().rays.empty()) { //ProcessRidge is done making its calls to ProcessFacet so we can return from ProcessRidge // cerr<<"BACK"< class RenderApplication : public GFanApplication { SimpleOption optionLargerTriangle; IntegerOption optionShiftVariablesWhenDrawing; public: const char *helpText() { return "This program renders a Groebner fan as an xfig file. To be more precise, the input is the list of all reduced Groebner bases of an ideal. The output is a drawing of the Groebner fan intersected with a triangle. The corners of the triangle are (1,0,0) to the right, (0,1,0) to the left and (0,0,1) at the top. If there are more than three variables in the ring these coordinates are extended with zeros. It is possible to shift the 1 entry cyclic with the option --shiftVariables.\n"; } RenderApplication(): optionLargerTriangle("-L", "Make the triangle larger so that the shape of the Groebner region appears."), optionShiftVariablesWhenDrawing("--shiftVariables", "Shift the positions of the variables in the drawing. For example with the value equal to 1 the corners will be right: (0,1,0,0,...), left: (0,0,1,0,...) and top: (0,0,0,1,...). The shifting is done modulo the number of variables in the polynomial ring. The default value is 0.") { registerOptions(); } const char *name() { return "_render"; } int main() { FileParser P(Stdin); PolynomialSetList l; l=P.parsePolynomialSetListWithRing(); XfigEnumerationPrinter ep(optionLargerTriangle.getValue()); ep.setVariableShift(optionShiftVariablesWhenDrawing.getValue()); ep.open(Stdout); if(l.size()) { ep.beginEnumeration(*l.begin()); for(PolynomialSetList::const_iterator i=l.begin();i!=l.end();i++)ep.basis(*i); ep.endEnumeration(); } ep.close(); return 0; } }; static RenderApplication theApplication; gfan0.8beta/src/lp_cdd.h0000664000175000017500000000327315177170257014575 0ustar andersanders#ifndef LP_CDD_H_INCLUDED #define LP_CDD_H_INCLUDED #include "lp.h" #include /* Always include cstdio before gmp.h.*/ #include //SHOULD BE REMOVED IntegerVector arrayToIntegerVector(mpq_t *point, int n); void scaleToIntegerVector(mpq_t *point, int n); class LpSolverCdd : public LpSolver { public: const char *name(){return "cdd";} bool isFacet(const IntegerVectorList &g, IntegerVectorList::const_iterator i); }; class LpSolverCddGmp : public LpSolver { public: virtual const char *name(){return "cddgmp";} bool isFacet(const IntegerVectorList &g, IntegerVectorList::const_iterator i); bool interiorPoint(const IntegerVectorList &g, IntegerVector &result, bool strictlyPositive, IntegerVector const *equalitySet=0); bool hasInteriorPoint(const IntegerVectorList &g, bool strictlyPositive, IntegerVector const *equalitySet); IntegerVectorList::const_iterator shoot(const IntegerVectorList &g); bool positiveVectorInKernel(const IntegerVectorList &g, IntegerVector *result); int rankOfMatrix(const IntegerVectorList &g); IntegerVectorList extremeRaysInequalityIndices(const IntegerVectorList &inequalityList); void removeRedundantRows(IntegerVectorList *inequalities, IntegerVectorList *equalities, bool removeInequalityRedundancies); IntegerVector relativeInteriorPoint(int n, const IntegerVectorList &g, IntegerVector const *equalitySet); void dual(int n, const IntegerVectorList &inequalities, const IntegerVectorList &equations, IntegerVectorList *dualInequalities, IntegerVectorList *dualEquations);//lineality space have been computed virtual bool hasHomogeneousSolution(int n, const IntegerVectorList &inequalities, const IntegerVectorList &equations); }; #endif gfan0.8beta/src/gfanlib_paralleltraverser.h0000664000175000017500000000730515177170257020564 0ustar andersanders// Parallel abstract graph traverser. Contributed by Bjarne Knudsen. // Interrupt-and-resume functionality added by Anders Nedergaard Jensen. #ifndef __traverser_h__ #define __traverser_h__ #include /* This file defines a Traverser interface. A Traverser can be used for going through an underlying structure of states. At each state, there is a number of next states. Moving the traverser to a next state changes its internal state. When constructing a Traverser, it should be in the start state (i.e. it should have no previous states). The traversal is over when there are no more next states. The state space should be a directed acyclic graph, so several previous states to a given state are allowed. There may be any number of end points, but only one start point. When traversing in a multi threaded fashion, each Traverser receives some of the collected information. It is up to the user of this interface to join that information when the traversal is done. */ namespace gfan{ class Traverser { public: bool aborting; // Added by Anders void abort(){aborting=true;} // Added by Anders Traverser():aborting(false){} // Added by Anders // Virtual destructor virtual ~Traverser( void ) {}; // Get the number of next states. virtual int getEdgeCountNext( void ) = 0; // The return value is the index for moving to the same previous // state again. The indexing of the previous state can be arbitrary, // but zero should be one of the previous index values. The // collect_info parameter will be true once for every edge in the // state graph during the traversal. This allows te traverser to // collect information along its edges. virtual int moveToNext( int index, bool collect_info ) = 0; // Go back to a previous state. Due to the return value of // moveToNext(), the state will be unchanged after calling // movetoPrev(moveToNext(index)) with a legal next index. virtual void moveToPrev( int index ) = 0; // This function will be called once for every state in a traversal. virtual void collectInfo( void ) = 0; // Function for printing the state to cout for debug purposes. virtual void printState( void ) = 0; }; // Traverse a structure in a single threaded way. The traverser should // be in the start state. The traverser may not be in the start state // when this function returns. void traverse_simple( Traverser* traverser ); // Traverse a structure using several traversers in several // threads. The traversers should all be in the start state. Several // traversers may go through the same state, but collectInfo() is only // called once for each state. The traversers may not be in the start // state when this function returns. /*void traverse_threaded( Traverser** traverser, int count, int step_count, bool stack_printing=false, std::vector>> *resumeData=0 ); // stack_printing added by Anders*/ //template //template class A;//std::pair; //template class B; //template