From 752f516167203db2298b30b3ab94003769dbd8f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9cile=20An=C3=A9?= Date: Wed, 20 Nov 2024 13:46:27 -0500 Subject: [PATCH] v0.17.0: splintering and migration of specialized functionalities to new packages (#218) * some new features, e.g. traversal routines, getting node heights, check for time-consistency * internal field names modified * many function names were modified: older exported names are deprecated * new packages: SNaQ.jl, PhyloTraits, PhyLiNC. * function to search for most parsimony network left in (not exported), but not working (was limited to level-1 networks) * nj: swap in-place instead of taking views (which became slow under julia v1.11) --------- Co-authored-by: Josh Justison, Jingcheng Xu, Claudia Solis-Lemus, Paul Bastide --- .github/dependabot.yml | 7 + .github/workflows/ci.yml | 3 +- .github/workflows/documentation.yml | 1 + CITATION.bib | 43 +- CONTRIBUTING.md | 16 +- LICENSE.md | 44 +- Project.toml | 17 +- README.md | 111 +- appveyor.yml | 35 - benchmark/README.md | 32 - benchmark/REQUIRE | 3 - benchmark/benchmarks.jl | 56 - benchmark/compareCommits.sh | 18 - benchmark/runBenchmark.jl | 6 - docs/Project.toml | 3 +- docs/make.jl | 34 +- docs/src/assets/logo-dark.png | Bin 0 -> 3346 bytes docs/src/index.md | 99 +- docs/src/lib/internals.md | 34 +- docs/src/lib/public.md | 164 +- docs/src/logo_text_darkmode.png | Bin 0 -> 7809 bytes docs/src/man/dist_reroot.md | 140 +- docs/src/man/expectedCFs.md | 110 - docs/src/man/fitDiscrete.md | 232 -- docs/src/man/fitdiscreteDNA.md | 78 - docs/src/man/fixednetworkoptim.md | 182 - docs/src/man/inputdata.md | 187 - docs/src/man/installation.md | 140 +- docs/src/man/multiplealleles.md | 147 - docs/src/man/net_plot.md | 163 + docs/src/man/netmanipulation.md | 162 +- .../man/{bootstrap.md => network_support.md} | 185 +- docs/src/man/parsimony.md | 32 +- docs/src/man/snaq_plot.md | 389 -- docs/src/man/ticr_howtogetQuartetCFs.md | 260 -- docs/src/man/trait_tree.md | 545 --- examples/Ae_bicornis_8_withrepeatingsites.aln | 22 +- examples/Ae_bicornis_8repeatingsites.aln | 22 +- examples/Ae_bicornis_8sites.aln | 88 +- examples/Ae_bicornis_Tr406_Contig10132.aln | 88 +- examples/Ae_bicornis_Tr406_Contig10722.aln | 176 +- examples/Swadesh.csv | 12 +- examples/astral.tre | 204 +- examples/bootsnaq.out | 200 +- examples/bootstrapNets_h1.tre | 20 +- examples/buckyCF.csv | 32 +- examples/carnivores_trait.txt | 34 +- examples/carnivores_tree.txt | 2 +- examples/case_f_example.jl | 63 - examples/case_g_example.jl | 11 - examples/case_i_example.jl | 11 - examples/caudata_Phytools.txt | 394 +- examples/caudata_Rphylopars.txt | 788 ++-- examples/caudata_dist.txt | 396 +- examples/caudata_dist_nj.txt | 2 +- examples/caudata_shared_paths.txt | 788 ++-- examples/caudata_trait.txt | 396 +- examples/caudata_tree.txt | 1 - examples/fish2hyb.net | 2 +- examples/fish3hyb_20boostrap.net | 40 +- examples/genetrees_alleletips.tre | 32 +- examples/graph.dot | 18 +- examples/individuals.aln | 40 +- examples/lizard_trait.txt | 202 +- examples/lizard_tree.txt | 2 +- examples/mappingIndividuals.csv | 8 +- examples/multitrees.newick | 50 +- examples/net0.out | 32 +- examples/net1.networks | 10 +- examples/net1.out | 32 +- examples/net1_snaq.out | 32 +- examples/net2.out | 32 +- examples/net3.out | 32 +- examples/raxmltrees.tre | 60 +- examples/simple.aln | 16 +- examples/simple_missingone.aln | 12 +- examples/swadesh.out | 22 +- examples/tableCF.txt | 32 +- examples/tableCFCI.csv | 32 +- examples/test.nex | 36 +- examples/test_8_withrepeatingsites.aln | 22 +- examples/test_reticulatetreeblock.nex | 64 +- examples/treefile.txt | 20 +- examples/treefilelist.txt | 4 +- src/PhyloNetworks.jl | 177 +- src/addHybrid.jl | 231 +- src/addHybrid_snaq.jl | 476 --- src/auxiliary.jl | 1373 ++++--- src/bootstrap.jl | 603 +-- src/compareNetworks.jl | 328 +- src/deleteHybrid.jl | 458 --- src/deprecated.jl | 68 +- src/descriptive.jl | 178 +- src/generate_topology.jl | 6 +- src/graph_components.jl | 181 +- src/interop.jl | 40 +- src/manipulateNet.jl | 734 ++-- src/moves_semidirected.jl | 252 +- src/moves_snaq.jl | 1356 ------ src/multipleAlleles.jl | 300 -- src/nj.jl | 93 +- src/nloptsummary.jl | 69 - src/pairwiseDistanceLS.jl | 360 +- src/parsimony.jl | 406 +- src/phyLiNCoptimization.jl | 1869 --------- src/pseudolik.jl | 1390 ------- src/readData.jl | 1339 ------ src/readwrite.jl | 1002 ++--- src/recursion_matrices.jl | 317 ++ src/recursion_routines.jl | 185 + src/snaq_optimization.jl | 1992 --------- src/substitutionModels.jl | 1430 ------- src/traits.jl | 3661 ----------------- src/traitsLikDiscrete.jl | 1254 ------ src/types.jl | 538 +-- src/undo.jl | 94 - src/update.jl | 378 -- test/1.ms | 32 - test/allQuartets.txt | 15 - test/prueba_tree.txt | 1 - test/readme.md | 69 +- test/runtests.jl | 102 +- test/tableCF.txt | 16 - test/tableCFbad.txt | 16 - test/test_5taxon_readTopology.jl | 140 - test/test_add2hyb.jl | 31 - test/test_addHybrid.jl | 42 +- test/test_auxiliary.jl | 151 + test/test_auxillary.jl | 85 - test/test_badDiamII.jl | 88 - test/test_bootstrap.jl | 53 +- test/test_calculateExpCF.jl | 446 -- test/test_calculateExpCF2.jl | 36 - test/test_calibratePairwise.jl | 73 +- test/test_compareNetworks.jl | 477 ++- test/test_correctLik.jl | 100 - test/test_deleteHybridizationUpdate.jl | 84 - test/test_functions_5taxon_read.jl | 183 - test/test_graph_components.jl | 82 +- test/test_hasEdge.jl | 135 - test/test_interop.jl | 14 +- test/test_isMajor.jl | 58 +- test/test_lm.jl | 737 ---- test/test_lm_tree.jl | 502 --- test/test_lm_withinspecies.jl | 616 --- test/test_manipulateNet.jl | 238 +- test/test_moves_semidirected.jl | 277 +- test/test_multipleAlleles.jl | 153 - test/test_nj.jl | 15 +- test/test_optBLparts.jl | 387 -- test/test_parameters.jl | 82 - test/test_parsimony.jl | 82 +- test/test_partition.jl | 35 - test/test_partition2.jl | 114 - test/test_perfectData.jl | 1381 ------- test/test_phyLiNCoptimization.jl | 392 -- test/test_readInputData.jl | 199 - ...t_traits.jl => test_recursion_matrices.jl} | 25 +- test/test_relaxed_reading.jl | 110 +- test/test_simulate.jl | 154 - test/test_simulate_mbd.jl | 207 - test/test_traitLikDiscrete.jl | 753 ---- test/test_undirectedOtherNetworks.jl | 95 - 163 files changed, 7309 insertions(+), 33224 deletions(-) create mode 100644 .github/dependabot.yml delete mode 100644 appveyor.yml delete mode 100644 benchmark/README.md delete mode 100644 benchmark/REQUIRE delete mode 100644 benchmark/benchmarks.jl delete mode 100644 benchmark/compareCommits.sh delete mode 100755 benchmark/runBenchmark.jl create mode 100644 docs/src/assets/logo-dark.png create mode 100644 docs/src/logo_text_darkmode.png delete mode 100644 docs/src/man/expectedCFs.md delete mode 100644 docs/src/man/fitDiscrete.md delete mode 100644 docs/src/man/fitdiscreteDNA.md delete mode 100644 docs/src/man/fixednetworkoptim.md delete mode 100644 docs/src/man/inputdata.md delete mode 100644 docs/src/man/multiplealleles.md create mode 100644 docs/src/man/net_plot.md rename docs/src/man/{bootstrap.md => network_support.md} (57%) delete mode 100644 docs/src/man/snaq_plot.md delete mode 100644 docs/src/man/ticr_howtogetQuartetCFs.md delete mode 100644 docs/src/man/trait_tree.md delete mode 100644 examples/case_f_example.jl delete mode 100644 examples/case_g_example.jl delete mode 100644 examples/case_i_example.jl delete mode 100644 examples/caudata_tree.txt delete mode 100644 src/addHybrid_snaq.jl delete mode 100644 src/deleteHybrid.jl delete mode 100644 src/moves_snaq.jl delete mode 100644 src/multipleAlleles.jl delete mode 100644 src/nloptsummary.jl delete mode 100644 src/phyLiNCoptimization.jl delete mode 100644 src/pseudolik.jl delete mode 100644 src/readData.jl create mode 100644 src/recursion_matrices.jl create mode 100644 src/recursion_routines.jl delete mode 100644 src/snaq_optimization.jl delete mode 100644 src/substitutionModels.jl delete mode 100644 src/traits.jl delete mode 100644 src/traitsLikDiscrete.jl delete mode 100644 src/undo.jl delete mode 100644 src/update.jl delete mode 100644 test/1.ms delete mode 100644 test/allQuartets.txt delete mode 100644 test/prueba_tree.txt delete mode 100644 test/tableCF.txt delete mode 100644 test/tableCFbad.txt delete mode 100644 test/test_5taxon_readTopology.jl delete mode 100644 test/test_add2hyb.jl create mode 100644 test/test_auxiliary.jl delete mode 100644 test/test_auxillary.jl delete mode 100644 test/test_badDiamII.jl delete mode 100644 test/test_calculateExpCF.jl delete mode 100644 test/test_calculateExpCF2.jl delete mode 100644 test/test_correctLik.jl delete mode 100644 test/test_deleteHybridizationUpdate.jl delete mode 100644 test/test_functions_5taxon_read.jl delete mode 100644 test/test_hasEdge.jl delete mode 100644 test/test_lm.jl delete mode 100644 test/test_lm_tree.jl delete mode 100644 test/test_lm_withinspecies.jl delete mode 100644 test/test_multipleAlleles.jl delete mode 100644 test/test_optBLparts.jl delete mode 100644 test/test_parameters.jl delete mode 100644 test/test_partition.jl delete mode 100644 test/test_partition2.jl delete mode 100644 test/test_perfectData.jl delete mode 100644 test/test_phyLiNCoptimization.jl delete mode 100644 test/test_readInputData.jl rename test/{test_traits.jl => test_recursion_matrices.jl} (85%) delete mode 100644 test/test_simulate.jl delete mode 100644 test/test_simulate_mbd.jl delete mode 100644 test/test_traitLikDiscrete.jl delete mode 100644 test/test_undirectedOtherNetworks.jl diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..700707ced --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" # Location of package manifests + schedule: + interval: "weekly" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df9c0a7e1..e2b6c303d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,6 +8,7 @@ on: branches: - master tags: ['*'] + workflow_dispatch: concurrency: # Skip intermediate builds: always. @@ -40,7 +41,7 @@ jobs: - uses: julia-actions/julia-buildpkg@v1 - uses: julia-actions/julia-runtest@v1 - uses: julia-actions/julia-processcoverage@v1 - - uses: codecov/codecov-action@v4 + - uses: codecov/codecov-action@v5 with: files: lcov.info token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 8c39bbaf3..82214b521 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -6,6 +6,7 @@ on: - master tags: '*' pull_request: + workflow_dispatch: jobs: Documenter: diff --git a/CITATION.bib b/CITATION.bib index 967cba38d..ab4721a9d 100644 --- a/CITATION.bib +++ b/CITATION.bib @@ -9,30 +9,7 @@ @article{2017SolislemusBastideAne_PhyloNetworks pages = {3292-3298}, doi = {10.1093/molbev/msx235}, } - -% paper on the SNaQ method -@article{2016SolislemusAne_SNaQ, - author = {Sol{\'\i}s-Lemus, Claudia and An{\'e}, C{\'e}cile}, - title = {Inferring Phylogenetic Networks with Maximum Pseudolikelihood under Incomplete Lineage Sorting}, - journal = {PLOS Genetics}, - year = {2016}, - volume = {12}, - number = {3}, - pages = {1-21}, - doi = {10.1371/journal.pgen.1005896}, -} -% paper on phylogenetic comparative methods for continuous traits on networks -@article{2018Bastide_continuoustraitevolution, - author = {Bastide, Paul and Sol{\'\i}s-Lemus, Claudia and Kriebel, Ricardo and William Sparks, K and An{\'e}, C{\'e}cile}, - title = {Phylogenetic Comparative Methods on Phylogenetic Networks with Reticulations}, - journal = {Systematic Biology}, - year = {2018}, - volume = {67}, - number = {5}, - pages = {800-820}, - doi = {10.1093/sysbio/syy033}, -} -% paper on phylogenetic comparative methods for discrete traits on networks +% paper describing network calibration, based on genetic distances estimated from gene trees @article{2020Karimi_baobab_discretetraitevolution, author = {Karimi, Nisa and Grover, Corrinne E and Gallagher, Joseph P and Wendel, Jonathan F and An{\'e}, C{\'e}cile and Baum, David A}, title = {Reticulate Evolution Helps Explain Apparent Homoplasy in Floral Biology and Pollination in Baobabs (\textit{{Adansonia}}; {Bombacoideae}; {Malvaceae})}, @@ -43,12 +20,14 @@ @article{2020Karimi_baobab_discretetraitevolution pages = {462-478}, doi = {10.1093/sysbio/syz073}, } -% paper on continuous traits with intraspecific variation -@article{2022Teo_intraspeciesvariation, - author = {Teo, Benjamin and Rose, Jeffrey P. and Bastide, Paul and An{\'e}, C{\'e}cile}, - title = {Accounting for intraspecific variation in continuous trait evolution on a reticulate phylogeny}, - journal = {bioRxiv}, - year = {2022}, - doi = {10.1101/2022.05.12.490814}, - publisher = {Cold Spring Harbor Laboratory}, +% dissertation describing semidirected NNI (nearest neighbor interchange) +% to modify a semidirected network: in Chapter 4 +@phdthesis{2020AllenSavietta-Ane, + author = {Allen-Savietta, Cora}, + title = {Estimating Phylogenetic Networks from Concatenated Sequence Alignments}, + school = {The University of Wisconsin - Madison}, + year = 2020, + note = {Ph.D. dissertation, advised by Cécile Ané, ProQuest Dissertations & Theses 28263540}, + url = {https://www.proquest.com/docview/2476856270/}, + pages = 165, } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a65b2fb06..dd4c3214e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,15 +4,16 @@ The following guidelines are designed for contributors of `PhyloNetworks`. ## Reporting Issues and Questions -For reporting a bug, a failed function or requesting a new feature, you can simply open an issue in [the issue tracker](https://github.com/juliaphylo/PhyloNetworks.jl/issues). -First, seach through existing issues (open or closed) that might have the answer to your question. +For reporting a bug, a failed function or requesting a new feature, +please open an issue in [the issue tracker](https://github.com/juliaphylo/PhyloNetworks.jl/issues). +First, search through existing issues (open or closed) that might have the answer to your question. If you are reporting a bug, please also include a minimal code example or all relevant information for us to replicate the issue. For general questions, make sure to check out the [google user group](https://groups.google.com/g/phylonetworks-users). If you cannot find answers to your question, please post a new question. We do our best to reply in a timely fashion, but we are undermanned so we appreciate your patience. ## Contributing Code -To make contributions to `PhyloNetworks`, you need to set up your [GitHub](https://github.com/) account (if you do not have one) and request your change(s) or contribution(s) via a pull request against the `master` branch of `PhyloNetworks` from a non-master branch in your fork. +To make contributions to `PhyloNetworks`, you need to set up a [GitHub](https://github.com/) account (if you do not have one) and request your change(s) or contribution(s) via a pull request against the `master` branch of `PhyloNetworks` from a non-master branch in your fork. Using a non-master branch on your end will give developers push access to your branch to make edits to it (in case we want to work collaboratively on the new code). @@ -20,9 +21,12 @@ Please use the following steps: 1. Fork the `PhyloNetworks` repository to your GitHub account 2. Clone your fork locally with `git clone` -3. Create a new branch with a name that describes your contribution. For example, if your contribution is fixing a bug in `readTopology`, your new branch can be named `fix-bug-readTopology`. You can create it and switch with: +3. Create a new branch with a name that describes your contribution. + For example, if your contribution is fixing a bug in `readnewick`, + your new branch can be named `fix-bug-readnewick`. + You can create it and switch with: ``` - git checkout -b fix-bug-readTopology + git checkout -b fix-bug-readnewick ``` 4. Make your changes on this new branch. Write a [docstring](https://docs.julialang.org/en/v1/manual/documentation/) @@ -32,7 +36,7 @@ Please use the following steps: 5. Push your changes to your fork 6. [Submit a pull request](https://github.com/juliaphylo/PhyloNetworks.jl/pulls) against the `master` branch in `PhyloNetworks`. Make sure that your code passes all the automatic tests and that it is not in conflict with the current status of `master` -Please make sure to follow the Julia package guidelines and conventions on your code. `PhyloNetworks` was created before these conventions were catalyzed, but we are attempting to follow them going forward. +Please make sure to follow the Julia package guidelines and conventions on your code. `PhyloNetworks` was created before these conventions were catalyzed, but we are attempting to follow them going forward. To learn more about the Julia conventions, check out the following links: diff --git a/LICENSE.md b/LICENSE.md index fc414cb92..b89e67db7 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,22 +1,22 @@ -The PhyloNetworks.jl package is licensed under the MIT "Expat" License: - -> Copyright (c) 2014-2018: Claudia Solis-Lemus and Cecile Ane. -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. -> +The PhyloNetworks.jl package is licensed under the MIT "Expat" License: + +> Copyright (c) 2014-2018: Claudia Solis-Lemus and Cecile Ane. +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> SOFTWARE. +> diff --git a/Project.toml b/Project.toml index 15ef386d5..1d3f55959 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "PhyloNetworks" uuid = "33ad39ac-ed31-50eb-9b15-43d0656eaa72" license = "MIT" -version = "0.16.4" +version = "0.17.0" [deps] BioSequences = "7e6ae17a-c86d-528c-b3b9-7f778a29fe59" @@ -15,16 +15,12 @@ Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" FASTX = "c2308a5c-f048-11e8-3e8a-31650f418d12" Functors = "d9f16b24-f501-4c13-a1f2-28368ffc5196" -GLM = "38e38edf-8417-5370-95a0-9cbb8c7f171a" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" NLopt = "76087f3c-5699-56af-9a33-bf431cd00edd" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" -StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -StatsFuns = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -StatsModels = "3eaba693-59b7-5ba5-a881-562e759f1c8d" [compat] BioSequences = "2.0, 3" @@ -35,17 +31,14 @@ DataFrames = "1.3" DataStructures = "0.9, 0.10, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18" Distributions = "0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22, 0.23, 0.24, 0.25" FASTX = "1.1, 2" -Functors = "0.2, 0.3, 0.4" -GLM = "1.1, 1.2, 1.3, 1.4" +Functors = "0.2, 0.3, 0.4, 0.5" NLopt = "0.5.1, 0.6, 1" -StaticArrays = "0.8.3, 0.9, 0.10, 0.11, 0.12, 1.0" StatsBase = "0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34" -StatsFuns = "0.7, 0.8, 0.9, 1" -StatsModels = "0.6, 0.7" -julia = "1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7" +julia = "1.5, 1.6, 1.7" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" [targets] -test = ["Test"] +test = ["Test", "StableRNGs"] diff --git a/README.md b/README.md index eb276b1c3..44a1531b6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# PhyloNetworks: analysis for phylogenetic networks - [![doc stable](https://img.shields.io/badge/docs-stable-blue.svg)](https://juliaphylo.github.io/PhyloNetworks.jl/stable) [![doc dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://juliaphylo.github.io/PhyloNetworks.jl/dev) [![Build status](https://github.com/juliaphylo/PhyloNetworks.jl/workflows/CI/badge.svg?branch=master)](https://github.com/juliaphylo/PhyloNetworks.jl/actions/workflows/ci.yml) @@ -8,37 +6,58 @@ [![ColPrac: Contributor's Guide on Collaborative Practices for Community Packages](https://img.shields.io/badge/ColPrac-Contributor's%20Guide-blueviolet)](https://github.com/SciML/ColPrac) [![PkgEval](https://JuliaCI.github.io/NanosoldierReports/pkgeval_badges/P/PhyloNetworks.svg)](https://JuliaCI.github.io/NanosoldierReports/pkgeval_badges/report.html) +
+ + ![logo dark](docs/src/logo_text_darkmode.png#gh-dark-mode-only) + ![logo light](docs/src/logo_text.png#gh-light-mode-only) + +
+ ## Overview -PhyloNetworks is a [Julia](http://julialang.org) package with utilities to: -- read / write phylogenetic trees and networks, - in (extended) Newick format. - Networks are considered explicit: nodes represent ancestral species. - They can be rooted or unrooted. +PhyloNetworks is a [Julia](http://julialang.org) package with utilities to +to handle phylogenetic trees and networks. +It serves as a core package that other packages can depend on, such as +[PhyloPlots](https://github.com/JuliaPhylo/PhyloPlots.jl) +to visualize phylogenies, +[SNaQ](https://github.com/JuliaPhylo/PhyloPlots.jl) +to infer phylogenies from genetic data, +[PhyloTraits](https://github.com/JuliaPhylo/PhyloTraits.jl) +to analyze the evolution of traits along phylogenies. + +Phylogenetic networks represent the evolutionary relationships between a set +of organisms, e.g. populations, species, languages, cultures etc. +They are also called *admixture graphs* when their leaves are populations +of the same or closely related species. +They are *explicit* graph representations, in which nodes represent +ancestral populations / species, and edge lengths represent evolutionary time. + +Utilities in this core package include: +- read / write phylogenies in (extended) Newick format - manipulate networks: re-root, prune taxa, remove hybrid edges, + transform a network with a semidirected nearest-neighbor interchange (sNNI), extract the major tree from a network, extract displayed networks / trees -- compare networks / trees with dissimilarity measures - (Robinson-Foulds distance on trees) -- summarize samples of bootstrap networks (or trees) - with edge and node support -- estimate species networks from multilocus data: SNaQ -- phylogenetic comparative methods for continuous trait evolution - on species networks / trees -- plot networks (and trees), via the companion package - [PhyloPlots](https://github.com/juliaphylo/PhyloPlots.jl) +- compare networks with dissimilarity measures + (e.g. the Robinson-Foulds distance on trees) +- summarize samples of networks with support for local features + (edges and clades of hybrid origin or sister to a hybrid clade) +- fit edges lengths from average pairwise distances between leaves, + using least-squares +- network traversal routines To get help, check - the [latest documentation](https://juliaphylo.github.io/PhyloNetworks.jl/dev) -- the [wiki](https://github.com/juliaphylo/PhyloNetworks.jl/wiki) for a step-by-step tutorial - with background on networks (last revised 2022) +- the [wiki](https://github.com/juliaphylo/PhyloNetworks.jl/wiki) for a + step-by-step tutorial with background on networks (last revised 2022) - [tutorial](https://cecileane.github.io/networkPCM-workshop/) for comparative methods, including network calibration (2023 workshop) - the [google group](https://groups.google.com/forum/#!forum/phylonetworks-users) for common questions. Join the group to post/email your questions, or to receive information on new versions, bugs fixed, etc. -If you use the package, please cite ([bibtex format here](CITATION.bib)) +If you use the package, please cite ([bibtex format here](CITATION.bib)). +For the PhyloNetworks package in particular, please cite: - Claudia Solís-Lemus, Paul Bastide and Cécile Ané (2017). PhyloNetworks: a package for phylogenetic networks. @@ -46,50 +65,10 @@ If you use the package, please cite ([bibtex format here](CITATION.bib)) 34(12):3292–3298. [doi:10.1093/molbev/msx235](https://doi.org/10.1093/molbev/msx235) -## Maximum pseudolikelihood estimation of species network: SNaQ - - -SNaQ implements the statistical inference method in Solís-Lemus and Ané -[(2016)](http://journals.plos.org/plosgenetics/article?id=10.1371/journal.pgen.1005896). -The procedure involves a -numerical optimization of branch lengths and inheritance probabilities -and a heuristic search in the space of phylogenetic -networks. - -If you use SNaQ, please cite - -- Claudia Solís-Lemus and Cécile Ané (2016). - Inferring Phylogenetic Networks with Maximum Pseudolikelihood under Incomplete Lineage Sorting. - [PLoS Genet](http://journals.plos.org/plosgenetics/article?id=10.1371/journal.pgen.1005896) - 12(3):e1005896. - [doi:10.1371/journal.pgen.1005896](https://doi.org/10.1371/journal.pgen.1005896) - -## Phylogenetic comparative methods for trait evolution - -For continuous traits, study based on the Brownian motion process, -with or without transgressive evolution after reticulations: - -- Bastide, Solís-Lemus, Kriebel, Sparks, Ané (2018). - Phylogenetic Comparative Methods for Phylogenetic Networks with Reticulations. - Systematic Biology, 67(5):800–820. - [doi:10.1093/sysbio/syy033](https://doi.org/10.1093/sysbio/syy033). - SI on [dryad](http://dx.doi.org/10.5061/dryad.nt2g6) - including a tutorial for trait evolution - and a tutorial for network calibration. - -Continuous traits, accounting for within-species variation: - -- Benjamin Teo, Jeffrey P. Rose, Paul Bastide & Cécile Ané (2022). - Accounting for intraspecific variation in continuous trait evolution - on a reticulate phylogeny. - [bioRxiv](https://doi.org/10.1101/2022.05.12.490814) - -For a discrete trait (influence of gene flow on the trait, -ancestral state reconstruction, rates): - -- Karimi, Grover, Gallagher, Wendel, Ané & Baum (2020). Reticulate evolution - helps explain apparent homoplasy in floral biology and pollination in baobabs - (*Adansonia*; Bombacoideae; Malvaceae). - Systematic Biology, - 69(3):462-478. doi: [10.1093/sysbio/syz073](https://academic.oup.com/sysbio/advance-article/doi/10.1093/sysbio/syz073/5613901?guestAccessKey=a32e7dd3-27fd-4a13-b171-7ff5d6da0e01). +> [!NOTE] +> Version 0.17 of PhyloNetworks is a major change from version v0.16.4. Many +> functionalities were moved to other packages (e.g. SNaQ.jl and PhyloTraits.jl), +> the names of many methods were changed, and various internal functions +> were improved with breaking changes (e.g. traversal routines). +> PhyloNetworks v0.17 should serve as a better "core", used by other packages +> with more specialized functionalities. diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 23f72d500..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,35 +0,0 @@ -environment: - matrix: - - JULIA_URL: "https://julialang-s3.julialang.org/bin/winnt/x86/0.4/julia-0.4-latest-win32.exe" - - JULIA_URL: "https://julialang-s3.julialang.org/bin/winnt/x64/0.4/julia-0.4-latest-win64.exe" - - JULIA_URL: "https://julialangnightlies-s3.julialang.org/bin/winnt/x86/julia-latest-win32.exe" - - JULIA_URL: "https://julialangnightlies-s3.julialang.org/bin/winnt/x64/julia-latest-win64.exe" - -branches: - only: - - master - - /release-.*/ - -notifications: - - provider: Email - on_build_success: false - on_build_failure: false - on_build_status_changed: false - -install: - - ps: "[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12" -# Download most recent Julia Windows binary - - ps: (new-object net.webclient).DownloadFile( - $env:JULIA_URL, - "C:\projects\julia-binary.exe") -# Run installer silently, output to C:\projects\julia - - C:\projects\julia-binary.exe /S /D=C:\projects\julia - -build_script: -# Need to convert from shallow to complete for Pkg.clone to work - - IF EXIST .git\shallow (git fetch --unshallow) - - C:\projects\julia\bin\julia -e "versioninfo(); - Pkg.clone(pwd(), \"PhyloNetworks\"); Pkg.build(\"PhyloNetworks\")" - -test_script: - - C:\projects\julia\bin\julia --check-bounds=yes -e "Pkg.test(\"PhyloNetworks\")" diff --git a/benchmark/README.md b/benchmark/README.md deleted file mode 100644 index cf2f33e4c..000000000 --- a/benchmark/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# Using PkgBenchmark to Compare the Efficiency of Two Different Commits using Benchmark - -PkgBenchmarks allows us to compare the performance of a package at different branches, commits, or tags. For full documentation, see the PkgBenchmark [documentation here] (https://juliaci.github.io/PkgBenchmark.jl/stable/) - -# Comparing Two Commits on Speed using Benchmarks -This benchmark compares the speed of your current version of PhyloNetworks to the -version in a previous commit. - -To use, enter PhyloNetworks' benchmark directory and run: -```bash - bash compareCommits.sh oldCommitNumber -``` -For example, in .julia/dev/PhyloNetworks/benchmark, run: -```bash - bash compareCommits.sh oldCommitNumber -``` -variables: - oldCommitNumber: a GitHub commit number - -# Adding New Benchmarks - -To add new benchmarks, use the dictionary interface introduced by Benchmarks.jl. [docs here](https://github.com/JuliaCI/BenchmarkTools.jl/blob/master/doc/manual.md#defining-benchmark-suites) - -First, open /benchmark/benchmarks.jl. In this file, create a new suite. I've created a suite to test nucleic acid substitution models. It has two subparts, jc69 and hky85. -```julia -SUITE["nasm"] = BenchmarkGroup(["jc69", "hky85"]) -``` -We can then add to this suite: -```julia -SUITE["nasm"]["jc69"] = @benchmarkable JC69([0.5]) -``` - diff --git a/benchmark/REQUIRE b/benchmark/REQUIRE deleted file mode 100644 index ab5812f76..000000000 --- a/benchmark/REQUIRE +++ /dev/null @@ -1,3 +0,0 @@ -BenchmarkTools 0.2 -PkgBenchmark 0.2 -Logging \ No newline at end of file diff --git a/benchmark/benchmarks.jl b/benchmark/benchmarks.jl deleted file mode 100644 index 4635f295b..000000000 --- a/benchmark/benchmarks.jl +++ /dev/null @@ -1,56 +0,0 @@ -using BenchmarkTools, PhyloNetworks, DataFrames, Logging - -#suppresses @warn and @info for benchmarks -logger = SimpleLogger(stderr, Logging.Error); -old_logger = global_logger(logger); - -# Define a parent BenchmarkGroup to contain our SUITE -const SUITE = BenchmarkGroup() - -SUITE["nasm"] = BenchmarkGroup(["JC69", "HKY85"]) -SUITE["fitDiscreteFixed"] = BenchmarkGroup(["ERSM", "BTSM", "JC69", "HKY85"]) -SUITE["fitdiscrete"] = BenchmarkGroup(["ERSM", "BTSM", "JC69", "HKY85"]) - -# Add benchmarks to nasm group -SUITE["nasm"]["JC69"] = @benchmarkable JC69([0.5]) -m1 = HKY85([.5], [0.25, 0.25, 0.25, 0.25]); -SUITE["nasm"]["HKY85"] = @benchmarkable P!(P(m1, 1.0), m1, 3.0) - -# fitDiscreteFixed benchmarks -net_dat = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);") -species_alone = ["C","A","B","D"] -dat_alone = DataFrame(trait=["hi","lo","lo","hi"]) -SUITE["fitDiscreteFixed"]["ERSM"] = @benchmarkable fitdiscrete(net_dat, :ERSM, species_alone, dat_alone; optimizeQ=false, optimizeRVAS=false) -SUITE["fitDiscreteFixed"]["BTSM"] = @benchmarkable fitdiscrete(net_dat, :BTSM, species_alone, dat_alone; optimizeQ=false, optimizeRVAS=false) - -fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln") -dna_dat, dna_weights = readfastatodna(fastafile, true); -net_dna = readTopology("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); -for edge in net_dna.edge #adds branch lengths - setLength!(edge,1.0) - if edge.gamma < 0 - setGamma!(edge, 0.5) - end -end -SUITE["fitDiscreteFixed"]["JC69"] = @benchmarkable fitdiscrete(net_dna, :JC69, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false) -SUITE["fitDiscreteFixed"]["HKY85"] = @benchmarkable fitdiscrete(net_dna, :HKY85, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false) - -## fitdiscrete benchmarks -SUITE["fitdiscrete"]["ERSM"] = @benchmarkable fitdiscrete(net_dat, :ERSM, species_alone, dat_alone; optimizeQ=true, optimizeRVAS=true) -SUITE["fitdiscrete"]["BTSM"] = @benchmarkable fitdiscrete(net_dat, :BTSM, species_alone, dat_alone; optimizeQ=true, optimizeRVAS=true) -SUITE["fitdiscrete"]["JC69"] = @benchmarkable fitdiscrete(net_dna, :JC69, dna_dat, dna_weights; optimizeQ=true, optimizeRVAS=true) -SUITE["fitdiscrete"]["HKY85"] = @benchmarkable fitdiscrete(net_dna, :HKY85, dna_dat, dna_weights; optimizeQ=true, optimizeRVAS=true) - -# If a cache of tuned parameters already exists, use it, otherwise, tune and cache -# the benchmark parameters. Reusing cached parameters is faster and more reliable -# than re-tuning `SUITE` every time the file is included. -paramspath = joinpath(dirname(@__FILE__), "params.json") - -if isfile(paramspath) - loadparams!(SUITE, BenchmarkTools.load(paramspath)[1], :evals); -else - tune!(SUITE) - BenchmarkTools.save(paramspath, params(SUITE)); -end - -global_logger(old_logger) #restores typical logging at end of benchmarks diff --git a/benchmark/compareCommits.sh b/benchmark/compareCommits.sh deleted file mode 100644 index 28f04acc9..000000000 --- a/benchmark/compareCommits.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -# This benchmark compares the speed of your current version of PhyloNetworks to a -# version in a previous commit. - -# To use, enter PhyloNetworks' benchmark directory and run: -# bash compareCommits.sh oldCommitNumber - -# For example, in .julia/dev/PhyloNetworks/benchmark, run: -# bash compareCommits.sh oldCommitNumber - -# variables: -# oldCommitNumber: a GitHub commit number - -currBranch=$(git branch | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/') -git checkout $1 -julia runBenchmark.jl -git checkout $currBranch -julia runBenchmark.jl \ No newline at end of file diff --git a/benchmark/runBenchmark.jl b/benchmark/runBenchmark.jl deleted file mode 100755 index 92a0b57a9..000000000 --- a/benchmark/runBenchmark.jl +++ /dev/null @@ -1,6 +0,0 @@ -using Pkg -Pkg.activate("/Users/cora/.julia/environments/net") #sets up development environment -using PkgBenchmark -using BenchmarkTools -using PhyloNetworks -benchmarkpkg("PhyloNetworks") \ No newline at end of file diff --git a/docs/Project.toml b/docs/Project.toml index 6d939b988..44b228b58 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -3,12 +3,13 @@ BioSymbols = "3c28c6f8-a34d-59c4-9654-267d177fcfa9" CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +DocumenterInterLinks = "d12716ef-a0f6-4df4-a9f1-a5a34e75c656" PhyloNetworks = "33ad39ac-ed31-50eb-9b15-43d0656eaa72" PhyloPlots = "c0d5b6db-e3fc-52bc-a87d-1d050989ed3b" RCall = "6f49c342-dc21-5d91-9882-a32aef131414" +StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" StatsModels = "3eaba693-59b7-5ba5-a881-562e759f1c8d" [compat] Documenter = "~1" -PhyloPlots = "1" diff --git a/docs/make.jl b/docs/make.jl index 9e8ed9cf6..7ead0feac 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -1,10 +1,24 @@ using Documenter +# fixit: this installs the dev version of PhyloPlots for compatibility. +# edit back to install the "master" version of PhyloPlots using Pkg -Pkg.add(PackageSpec(name="PhyloPlots", rev="master")) +Pkg.add(PackageSpec(name="PhyloPlots", rev="dev11")) + using PhyloNetworks -DocMeta.setdocmeta!(PhyloNetworks, :DocTestSetup, :(using PhyloNetworks); recursive=true) + +# interlink with other packages, for @ref calls to become "external ref" +using DocumenterInterLinks +links = InterLinks( + "PhyloPlots" => "https://juliaphylo.github.io/PhyloPlots.jl/stable/objects.inv", + # "SNaQ" => "https://juliaphylo.github.io/SNaQ.jl/stable/objects.inv", + # "PhyloTraits"=> "https://juliaphylo.github.io/PhyloTraits.jl/stable/objects.inv", +) +# default loading of interlinked packages in all docstring examples +DocMeta.setdocmeta!(PhyloNetworks, :DocTestSetup, + :(using PhyloNetworks, PhyloPlots); # , PhyloTraits, SNaQ + recursive=true) using PhyloPlots # to trigger any precompilation warning outside jldoctests makedocs( @@ -18,8 +32,9 @@ makedocs( canonical="https://juliaphylo.github.io/PhyloNetworks.jl/stable/", edit_link="master", ), - # exception, so warning-only for :missing_docs. List all others: - warnonly = Documenter.except(:autodocs_block, :cross_references, :docs_block, + # exception, so warning-only for :cross_references. List all others: + warnonly = Documenter.except(:autodocs_block, :missing_docs, # :cross_references, + :docs_block, :doctest, :eval_block, :example_block, :footnote, :linkcheck_remotes, :linkcheck, :meta_block, :parse_error, :setup_block), pages = [ @@ -27,17 +42,10 @@ makedocs( "Manual" => [ "Installation" => "man/installation.md", "Network manipulation" => "man/netmanipulation.md", - "Input Data for SNaQ" => "man/inputdata.md", - "TICR pipeline" => "man/ticr_howtogetQuartetCFs.md", - "Network estimation and display" => "man/snaq_plot.md", + "Network visualization" => "man/net_plot.md", "Network comparison and manipulation" => "man/dist_reroot.md", - "Candidate Networks" => "man/fixednetworkoptim.md", - "Extract Expected CFs" => "man/expectedCFs.md", - "Bootstrap" => "man/bootstrap.md", - "Multiple Alleles" => "man/multiplealleles.md", - "Continuous Trait Evolution" => "man/trait_tree.md", + "Network support" => "man/network_support.md", "Parsimony on networks" => "man/parsimony.md", - "Discrete Trait Evolution" => "man/fitDiscrete.md", "Neighbour Joining" => "man/nj.md", ], "Library" => [ diff --git a/docs/src/assets/logo-dark.png b/docs/src/assets/logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba77bad50239d597fa6518690033c453d80cf38 GIT binary patch literal 3346 zcmV+t4ej!YP)QQcCi=w-DMru4b+8Hf{LoJaQTU zCYQ$33t^o(izGx&U+u>!Wlpsm@s>DrwjG26tx4l|{3%w7P%M{Vv$P4tN~zvS{$y!9 zJr%~;vq(bX^ws_`0Jtt64TaIuegt}wM;uRLdnXTT+mB$q@L2uR%+h#zjQSn0NJ2mr z2wI94J3ax&4jlD$a1_hR<~`$I338#ZNQe=U%Yr$@pg>;f`m`~%1fg6l!~ZrvRISQ| zrSbG7s&~S95_+a}3B(-Zzrm(6bH7K!hvOx&~e5bnNlQm#%Ga45vr-iBoV6_U%T_l zBH0Hd;x(agx9)euBH0I&s}<5W!6FF(Or=w@y|XQkuDyhSMM6i~99dbA(~dH}_6jx@ z2_0tnA!LhB$qs@7kt|hqX*`{BeuaNnBy?D1hU@vqWK#~-nMjaStFcIk5VfdT5I%`= zGqq4G7uAvhl0`li2`yHQ$J+MC#!c19%I2y(T864fnngm$FTeZtN1cgI;{a$)KG?`; zn|2=L9>Qj6OMYmQ>YcDi=$Jmy)qCYfufAa&0G-S`+5a{y6!dW(%fy#Yeg(es#qU`MF@+K&EJksyY^vmOuC_6iipFm-nyi$os-!h$>}5R+@mKP$}Ky4J2fj?4Ye`fd&w6=%2> zgO&yzUGzIJ&r)ZKx`Fj0VYGj;Nc2!s5pM&A!^5J3Z(6Qe^9hb~DXhjUV3BBHRIZ4( zAuTG^tZb+#lAiJ*maI4q3gm8>Z;(aO7|(U()gdi*45<h+5cDVU5fk1$xDF0@AJm zp*M<~utgwr&UEDsI#iHldSPsGR#oLaou%nR!!#GRKSn3O|e>@xKt93`QOWO-zrxtHg&+Xl! zHua3l^Df9$XA<}xFWS5&vUwA7kqGNi_rk}L?a)GHkD-*!s(&)p zLNp7-^D3^qNM{53S|8Z_Et0+onMj0VnvySkqUQ)Cjvj@Uc-;BL5@=EK_dhhOi-b<0 z)ZJTEAtORzuRSexK24UQSC<-+WSTU^SQkF|sZT=t@#DS(f}pkO=zSU5x@zuWzl~4e z7xWR{^{~u8;6otbaBf{x8_iHcm2sVv=XMl`a+7^iXN+^pLxYW6@F@>D5R9&Dm-!t? z$!(qr!wsBsQ_wCFG0nVg{vW58Mg?MmLW!fJyGu}OGA*B@4Kw0XA9PByb8cBA@_GeM z7466T?RxA63I&~CLGSX=pr5ePj9}byAQv=*t9IeKpY@+TfmV?SU&NXM5}E}9LUl4y?s8jRMyPyCu5m(6etR}}phWH~3#2b+nNjbmUaNXJ&$p88JeyL`sCbA-_mUp+M?D))Q zgAQ|@xDJ)iPVJ^aGdsdk5u)%R*{@qym?n@bcW)Z{v8MFjO#TiH7zo#cByg@8QGN2P5kja-XKSEIj5p$?fiChnk zc9Dq6cFUS<-&=)hS}8dC!AGR{Tgh*U1SBF6j-+*Q z(TUx<^M2r|2d6C*h~%uI07o0FaW#c9&!Jwd8kw~yY=jZ`3nyblpX&DfN$*8c8f6jZtC{aVkrS8 z+v3S2#M;}91wovWDusfPh{HUKSqdOQArO;Bx3*(x z{u{^bD?KnTy7(wBW~1#DUN2@O#9`->n#LDBzRr0Go-#oACL zcN72?i6{JSLy;HGD~7n^Q5J^@i^Lm#_H3OL&Tpj30i0lwc&FjrpQ8%zzUUpCcE0Ih z71{6N;GTyqiGOtNWfBS4lK980H*s4bml0e!J3lNQAN8=|U|K|3b72dHMWP2^Uuz<)#w8Cs9Ml8-oym#WkBGFIX5Lp#S zyfp@gj&;;n4mVIBPuFr#*s3W6N1+T%%#M(y|2YKKPfFxStPpwmt=lyML95a8(ji|0 z0Wl?Y9X|+%kJWTWq8R6{oSi4z7>7kdgC&$lnJoO{t@o^hpg{0O;|&i=@=!t*N! zGmC@{qtN=#Z{B)n9swOw<>m$kg>vvnQhxbsSI*9pG^n#k2*FTyef6o;tls&;frc!I z3W@}UCqZIOSR}Mq2{ioV`}IM*pjeZ06ut?IgcfVN(qw0XiMQ3Eux!#6AvI;^(T;hOv2<^(1YnHbU^#JU$97Mu}Tc<6bxx$>v3KlCPPtx z#3G?(dUx-*s(M2k2B$H_Lh%A$)DZQj))t~@O>|8=D7x%}E%~7|RdF#sJK2X@hE)jyPBH7N8*12lp0XI43!y_o^xD)E zNaMmB)`NIi05pA?I^vp{m>nT)CuNa@h!D!0y1s&IFSy)~qQS*Fvpxiqa1{)3b0xbe z>UM|_-tu~mAQEuO$4X+EOD-TX4A zKBYf6Bhvc|qEWml`<<{z7*{w1W?W&BFs`sj7*|*%j4Lb>#uXL`;|hy}afL;~xWXb~ coB@FU1E$WKKbeMJ#Q*>R07*qoM6N<$g0yfZ4gdfE literal 0 HcmV?d00001 diff --git a/docs/src/index.md b/docs/src/index.md index 1b9ec5aec..15b7568f4 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -1,74 +1,68 @@ # PhyloNetworks.jl [PhyloNetworks](https://github.com/juliaphylo/PhyloNetworks.jl) -is a [Julia](http://julialang.org) package for the -manipulation, visualization, inference of phylogenetic networks, -and their use for trait evolution. +is a [Julia](http://julialang.org) package with core utilities for +phylogenetic networks. +Phylogenetic networks represent the evolutionary relationships between a set +of organisms, e.g. populations, species, languages, cultures etc. +They provide an explicit representation of splitting events (when populations +diverge from one another) and of merging events (when populations mix together +due to migration of individuals, hybridization, polyploidization, recombination, +etc.). +Phylogenetic networks are called *admixture graphs* in population genetics, +when merging events are interpreted as admixture between populations. +They can also summarize ancestral recombination graphs. + +`PhyloNetworks` is a core package that supports reading, writing, manipulating +phylogenetic networks, and other standard tools. +It is used by other packages for more specialized tasks, such as +- [`PhyloPlots`](https://github.com/juliaphylo/PhyloPlots.jl) + to visualize phylogenetic networks, +- [`SNaQ`](https://github.com/juliaphylo/SNaQ.jl) + for the inference of phylogenetic networks from quartet concordance factors (qCF), +- [`QuartetNetworkGoodnessFit`](https://github.com/JuliaPhylo/QuartetNetworkGoodnessFit.jl) + to calculate quartet concordance factors expected from a general network + and test the adequacy of a network to qCF data, +- [`PhyloTraits`](https://github.com/juliaphylo/PhyloTraits.jl) + for the inference of trait evolution along a phylogenetic network, +- [`PhyloCoalSimulations`](https://github.com/juliaphylo/PhyloCoalSimulations.jl) + to simulate gene trees under a coalescent process along a phylogenetic networks. --- **How to get help** -- the package [wiki](https://github.com/juliaphylo/PhyloNetworks.jl/wiki) has a step-by-step - tutorial, done for the MBL workshop (last revised 2022), with background on networks and - explanations. +- the package [wiki](https://github.com/juliaphylo/PhyloNetworks.jl/wiki) has a + step-by-step tutorial, done for the MBL workshop (last revised 2022), + with background on networks and explanations. - [tutorial](https://cecileane.github.io/networkPCM-workshop/) for comparative methods, including network calibration (2023 workshop) - the [google group](https://groups.google.com/forum/#!forum/phylonetworks-users) has answers to common questions. -- the [Manual](@ref) below has a quick tutorial (navigation on the left). -- the [Library](@ref) and - and [Index](@ref main-index) further below has the full list of documented functions. +- the [Manual](@ref) and below has a quick tutorial (navigation on the left). +- the [Library](@ref) further below has the full list of documented functions. ## References See their [bibtex format](https://github.com/juliaphylo/PhyloNetworks.jl/blob/master/CITATION.bib). -for the package: +for the package in particular, please cite: - Claudia Solís-Lemus, Paul Bastide and Cécile Ané (2017). PhyloNetworks: a package for phylogenetic networks. [Molecular Biology and Evolution](https://academic.oup.com/mbe/article/doi/10.1093/molbev/msx235/4103410/PhyloNetworks-a-package-for-phylogenetic-networks?guestAccessKey=230afceb-df28-4160-832d-aa7c73f86369) 34(12):3292–3298. [doi:10.1093/molbev/msx235](https://doi.org/10.1093/molbev/msx235) -for trait evolution: -- Teo, Rose, Bastide & Ané (2022). - Accounting for intraspecific variation in continuous trait evolution - on a reticulate phylogeny. - [bioRxiv](https://doi.org/10.1101/2022.05.12.490814) -- Karimi, Grover, Gallagher, Wendel, Ané & Baum (2020). Reticulate evolution - helps explain apparent homoplasy in floral biology and pollination in baobabs - (*Adansonia*; Bombacoideae; Malvaceae). - Systematic Biology, 69(3):462-478. - [doi:10.1093/sysbio/syz073](https://academic.oup.com/sysbio/advance-article/doi/10.1093/sysbio/syz073/5613901?guestAccessKey=a32e7dd3-27fd-4a13-b171-7ff5d6da0e01). -- Bastide, Solís-Lemus, Kriebel, Sparks, Ané (2018). - Phylogenetic Comparative Methods for Phylogenetic Networks with Reticulations. - Systematic Biology, 67(5):800–820. - [doi:10.1093/sysbio/syy033](https://doi.org/10.1093/sysbio/syy033). - -for network inference: -- Claudia Solís-Lemus and Cécile Ané (2016). - Inferring Phylogenetic Networks with Maximum Pseudolikelihood under Incomplete Lineage Sorting. - [PLoS Genet](http://journals.plos.org/plosgenetics/article?id=10.1371/journal.pgen.1005896) - 12(3):e1005896. [doi:10.1371/journal.pgen.1005896](https://doi.org/10.1371/journal.pgen.1005896) - ## Manual ```@contents Pages = [ "man/installation.md", "man/netmanipulation.md", - "man/inputdata.md", - "man/ticr_howtogetQuartetCFs.md", - "man/snaq_plot.md", + "man/net_plot.md", "man/dist_reroot.md", - "man/fixednetworkoptim.md", - "man/expectedCFs.md", - "man/bootstrap.md", - "man/multiplealleles.md", - "man/trait_tree.md", + "man/network_support.md", "man/parsimony.md", - "man/fitdiscrete.md", "man/nj.md" ] Depth = 3 @@ -76,23 +70,12 @@ Depth = 3 ## Library -```@contents -Pages = ["lib/public.md", "lib/internals.md"] -Depth = 2 -``` +For help on individual functions, see the library: -## [Index](@id main-index) - -### Functions - -```@index -Pages = ["lib/public.md", "lib/internals.md"] -Order = [:function] -``` - -### Types - -```@index -Pages = ["lib/public.md", "lib/internals.md"] -Order = [:type] +```@contents +Pages = [ + "lib/public.md", + "lib/internals.md", +] +Depth = 3 ``` diff --git a/docs/src/lib/internals.md b/docs/src/lib/internals.md index 72a24f761..e100c6fad 100644 --- a/docs/src/lib/internals.md +++ b/docs/src/lib/internals.md @@ -1,33 +1,21 @@ -```@meta -CurrentModule = PhyloNetworks -``` - -# Internal Documentation +# internal documentation -## Contents +Documentation for `PhyloNetworks`'s internal functions. +These functions are not exported and their access (API) should not be +considered stable. But they can still be used, like this for example: +`PhyloNetworks.foo()` for a function named `foo()`. -```@contents -Pages = ["internals.md"] -``` -## Index - -```@index -Pages = ["internals.md"] -``` - -## types +## functions & types ```@autodocs Modules = [PhyloNetworks] -Public = false -Order = [:type] +Public = false +Order = [:type,:function,:constant] ``` -## functions +## index -```@autodocs -Modules = [PhyloNetworks] -Public = false -Order = [:function, :constant] +```@index +Pages = ["internals.md"] ``` diff --git a/docs/src/lib/public.md b/docs/src/lib/public.md index 44b507219..9d1311dd0 100644 --- a/docs/src/lib/public.md +++ b/docs/src/lib/public.md @@ -1,169 +1,17 @@ -# Public Documentation +# public documentation Documentation for `PhyloNetworks`'s public (exported) interface. -See [Internal Documentation](@ref) for documentation on internal functions. - -```@contents -Pages = ["public.md"] -``` - -## Index - -```@index -Pages = ["public.md"] -``` - -## types +## functions & types ```@autodocs Modules = [PhyloNetworks] Private = false -Order = [:type] -``` - -## basic utilities - -```@docs -tipLabels -printEdges -printNodes -getroot -isrootof -#isleaf -#isexternal -isparentof -#ischildof -hassinglechild -getchild -#getchildren -#getchildedge -getparent -#getparents -#getparentminor -#getparentedge -#getparentedgeminor -getpartneredge -getNodeAges -pairwiseTaxonDistanceMatrix -``` - -## utilities to manipulate networks - -```@docs -sorttaxa! -directEdges! -checkroot! -preorder! -cladewiseorder! -rootatnode! -rootonedge! -hybridatnode! -setLength! -setGamma! -deleteleaf! -deleteaboveLSA! -removedegree2nodes! -shrink2cycles! -shrink3cycles! -deleteHybridThreshold! -rotate! -biconnectedComponents -blobDecomposition -treeedgecomponents -nni! -``` - -## data and topology read/write - -```@docs -readfastatodna -readTopology -readTopologyLevel1 -readInputTrees -readMultiTopology -readnexus_treeblock -readSnaqNetwork -readTrees2CF -countquartetsintrees -readTableCF -readTableCF! -writeTableCF -readBootstrapTrees -writeSubTree! -writeTopology -writeMultiTopology -hybridlambdaformat -mapAllelesCFtable -``` - -## network inference - -```@docs -snaq! -topologyMaxQPseudolik! -topologyQPseudolik! -summarizeDataCF -fittedQuartetCF -bootsnaq -calibrateFromPairwiseDistances! -undirectedOtherNetworks -nj +Order = [:function,:type] ``` -## network Comparisons -```@docs -majorTree -minorTreeAt -displayedTrees -displayedNetworkAt! -hardwiredClusters -hardwiredCluster -hardwiredClusterDistance -treeEdgesBootstrap -hybridDetection -summarizeHFdf -hybridBootstrapSupport -``` - -## continuous trait evolution - -```@docs -phylolm -sigma2_phylo -sigma2_within -mu_phylo -lambda_estim -ancestralStateReconstruction -expectations -predint -expectationsPlot -predintPlot -simulate -shiftHybrid -getShiftEdgeNumber -getShiftValue -descendenceMatrix -regressorShift -regressorHybrid -sharedPathMatrix -vcv -getindex(::TraitSimulation, ::Symbol) -``` +## index -## discrete trait evolution - -```@docs -parsimonySoftwired -parsimonyGF -Q -randomTrait -randomTrait! -fitdiscrete -maxParsimonyNet -getlabels -nstates -nparams -stationary -empiricalDNAfrequencies +```@index +Pages = ["public.md"] ``` diff --git a/docs/src/logo_text_darkmode.png b/docs/src/logo_text_darkmode.png new file mode 100644 index 0000000000000000000000000000000000000000..63a44d0f5752a1c10d602c0cc4f6670176d209e3 GIT binary patch literal 7809 zcmX9@bzD?U7p80Jl$KgVz$K+iIu=lAkOnD1O1f*2mhMtPLdqqVUP2n_ZjkO~mv4Q) zKkn}R&D?utp68r1=b5?D+M3El1at&wXlO*LDhhAV(9ro%_n+`^P`_Gnqc2f^_#aga z-O=<^}Jj4fu2Udn@ydxQuV(dF#qV}?O?XSN1Hv8GCOyNEiok%asI@)u2+|zF_+bf^h zw-cfRmo$EKv?b5*oP%DS%=_|d7zG%0pql@fGztp>HiLc4=Xb`4%xU?UOpVO|YWjc- zrD9b=^~SVd^$$611e>U4kT+uiwnp(ddsl?9pwFscLjWg^@{_;xcK%h<_c2Mc{~tze$(;NG`Zyz3l4rpr^V0@t>dfeW}*IW5Q1u=+fA z=Sht3<93!?U6q-_=1PGw{GwfcR>uN)bZ<4S?pLX_8rp2yKbf!itH6H++Y4pQqLB2W zQEy)VSbGZ-LB^N&P$@u7w@4O7y_*{BSNu2DpqGlbivJKqM*tdZw?jZ%|DN^dI}P0Q z$afCdp{yZcHZ>MOzhf);Ic{g_$J0LZ=eTyLd@U7koUjFxR5#Gkm%ft zG1dE-*#CG;jeX$Dqtg;9rU>IaFoR;FsEQ{Z+5Yjb)7^UfKkAB&s(@L@K+pEAmjA!g z3lD2aT~ZL7udLT-vT{J5uoHT1k7r>2n64oB{4mw%Z0g^8MV133EvaXPwx%X1|BdW= z{`zOV$O3!|d*1$7eQw2i3!6p!MtW|cC@uQWGH&FGpjn?I zps5HdibW3SFZ|8vB+emfnLYJogeNTZKhLZNc-Fl}Cz|p0cV>b66GHvyUa(Kdsg(y# zZVTy@+ML!GEd{gj7 zJR5DesLiR_k?F($>q*24deEuXRMN%dViI(rC6a z1yNB)1m9cyzM#1jKDp^F)dL6*<}K*qCd5Hs$6my)eMFc&Tm~tcY>b9{IWKT%9k}Y` z2Aw`P+!^+brm+K{_$ys&p05Y+f{&tRrekE0sC42mdPnIDiX#dy@A9~7hK>DmdT53M z-k?T@E3*~A4r+y;X|WQtHm!kUQAkx`ha9u}7b<~67=t$=b?SKg1BA)d97Yi@2eJR_ zSRPu(Oa8b?qmz~IjV{SiL`8-DFN}MCvr6-u5+li`JNBIa zOO#oDJmTb!wX*4<0Vp2|(UD5U4dU@TM2%MSeq7-Cm)3N&Kr+e=Pez05ITr(aPr@a@ z+`C%z`NByV1hDO{2S(gn?xyeGwdbGBcGKOia>vDYl14(S&!5(sJ8Bfz(gEG=8 z0vOj$d(LUIu6Z`xAov+OOp*c;Z;RxISdY@pV)gM|Wzs?(BfT_cg}Q>$5^DV0{&p@d zar|Ac`omxj3!hI+Z-Ef#X!C@r?yuU2Y?>eCT+(>JTDv5Eqpdtk;T}LcV_4Sw`&Ot& z7~oHpsAnA3#B3&+FMnvHss{0cc^q{XYr?{1c{PgQYkbiK=Obf&tS|LRMP#^!z55*|UX+Qf(f24unj?iHm#)18XMRm?4*=?{;r z8nZ_-tM?;(57XI%vGMf}-~QMuEeAxMt~}tg9k!7rArpq&9HnyhMy_F~iqvymHh#N%+R zvcWN%?GQGkE(1^hgu6ug)P&eg+t_Kwoz-;t2r^KQvsds{S^IAsB#Z5r>`RIY(VWmDYKW4t6V5-)Oric@rCWf*yd0nMAJf zZGtc#nHn&$xDm6HJN!}CI>7=3LirbG3UJwzZ$Zhoa13L5q0!S~fvd>5aFaD<<88Qs z@2!GHgpk0Ch4o)uZcGazkWq{eoettJeWSEskEYhAUkJfqeo=nsmC1O#^3VEdb~Uc1 zJGN|Je}to^s)SQ|XHj4q0lmjb--6VxB#2g2tHQFSRgKJiZY}-}i|jJfMhl;=O_c2J zyGRyIq?wm}DMs)`S7$IS)R9dPDF9|qJ9I>Cvu<*4T}h*;UMAd!8L^7(J5py~3JZBY zzmmLr%k?IiS4RDkBSrpZD-_PHE-6*_z3-}kFSFkcU4kj&bDs@4k33}>UOg+Kq8g^v ztcv|}doxN$oY8neg}Wy&KFq1_vL!h94eF+A8H!nH*3`!xx~ad4#!immhcK@{GK(7R&8?Y>j>@52ew2TtgMs)2FDbW2*wLN)2+X~XqlzP7L0Xm?EeZ#b!ycE zqHflgUD3$z3VawYM@g2Jkq?n;{Lu&Q+4v;Su<+8T!#7`Y*|sg@(ekUCPhGJF%EMoy zh;Ea*9m=L0g+IN_Q=+apyB^H}_tBG0$MLZ4X^kDUdTINOQ{hu91XKLF`%Nx~ngQGJ zgCzKUK-%i<@RovSMEJlImquu1b-c0J7k3gSs_ItuuaLube_HX%`A&2Rdac}bs4uGO zh=yvrV}af`1kdlymodKjB$FwJQCEmcIdT6;1B?o1gg#kSF==DjtL67A&)*?)QK*c1 z>tD*Y>RBD%CLB0P>Yl|+5fjh)A#-x8+U@a;6b-~*1B*OrRZi$|0Fd;^d`KqCIoNo& z7g;p!YTlR7a-;R=Psw$2u%C5lv$Ghc+>2Vq0C@ZCM698KUhkvYkbyXyz`yF>o;;!b z?qVM7(4>J_4IUVYpP1oj@cDyFUhtMhFRk0 zf?^C6cE03-S3!RZbStncTI|rz`$q5Xa*F8-7Gj=Yf&BM#;+r9jBJ>bH3%D6i5NZoC z0k$PeUH&>Z<=jw~c4GRWlr!hL55ln4%|n>Q4W*Axd5-oW#4~+n4r7qDOD-pc)a9J; zB)YFDzX+R$%MDA*hCSVS-}ikIb@kDiI3Oc>-aw0!8%|IEO-zH>WnaHG-YY|~Zw#yg zZm{b^2Qg=T%~ZUA@t*tM%@Gzw8G2yxnrAs%L`q5@^%xv#uvUm;uEpH*S`yf{yMFJ> z6%NG>9sJSSVoT#okO;>1c~jj$HN6twP2dV49tBd&AY~I>l$S{A(5D^uU9+rVdi)^(*jU}jiO*P zL$doWucqF!)k}TiRnqr}El$h)F%zM$5vWH6gp^Yo+k~7=4bd$Qc`aO8(qA8qCn zH!4tY8&X;c7@6T46ne4CkAq{pX}`9eO4aQXPtE5A91kRk1486kuTI(@+Nn?JnAG_% zky!GaUBXwJK0lJu&Z$u>+1sl*pu4{(V$)xR$J#5fH@Y*F`SmGTuK+JxX$I?KXY-u4|^dEP@uD4Q%D+4F{ z>&t7`GyP)N!_OMofs0{o?xy|g?O3_V@02eYS9U7TYvT_U6-eg=PI1@c|SYEabkiCA%j6Ecton_-u;PFnrceGu{7okAk#~43qC@ zMS5YxWtbF3nVxeb9_9s0%8}t&QKHp3Z8^qqU?ZrV&R-C0vPJYDoO%@5FoJ}n4m>)P zZ9m!tCq=Ui7~fw##J2giI+IIQsxl7~6bbY->li|SSHiJaZjGv~y<>p&|@rIV3C^tA29 zI=t{vK&R36o1K8*ePUC%J+LMd*&$wIN)sB65OOEzdk@iq9hBmEwZ(ZHl5`2J;f`&8 zY|q1yUiZA+Oa48mpU=Yvd@AXI{Hqc)Xy!0BWq*&a-ROU*y12%r4)HB=W2S+~NCKl8 zP-?f`8_Zf!2GXwDaf|B__T`-9U$Gy zyQv~GfzOHL#7myh5q+7^VDOX8IW4-;Tntvikfsu(GGf(koEZxD#XSDZHIdxb@iadx zM@TCIHdwC?aV!)tb))vu?<8OXC!zT0kE%Eopk>_MSrU0;s;3t=Y0mtX6E{;_tbfq# zIqaEksj%|r#U}qt{C^QmIlw3qk@3fso)fU%Bdql?z^uy{_7%`8JNZqO8{A-fMx$rC z#2~mp$`=(uDM7sdV&P|SCF=_#YN&n4IaUJq&>An(h<*4BDV1H^s;PXFPV-vr=;lX7 z0C_cr!*IJ~C&njy3qvZ5_++ZtIK@dG{wfh@euNWhe=<=L{xrg7Z}Vv}8$$B_Hux;i z>MU3yy-J#ExjjHnwcoxc{~!z(`otTRMc!;qgciLCf=P(khGnP zBJsVloyfL&YM}DDkdxI^+aKrUyT>10K4)^5tYOz-I$ihZ!g!{t*xZK&dDD$t1@*qJ zC^f^dES-lP%6-g!L^6cKl-9LXu4Tj%?zN%<v0M;RZeDhM@9N za;OgC%f$xY8rU){x?ZJiG*cJD4ExMMxha04W<_*r%s~&i%h&BcHy~H)knRbHKH)F| zmC?}V2Lwu~;2=|9R3&<49o-O|5%djF@cfjs8HM@;E`KQAx^@s6Edk=FBq+Pk5nf!M zB8}xQL>%8`{gs+B1vPSnCti-{6qk{*Fwf=0KQ|TNm3esZP{$j;6NC#wRT3_gLNj!W z!ggtNu@6S^oE@;%Jm1=$=3lZrJ7jfuOR+;4A5Bkjns&jaVzPsOG-d#QEbMP`N?tm3 z-rR~xDwNjL>e>5jiD>Qgb6jM?LA6e>8!%UvxHajJ&kkumu|UTlK1Zlp8Ecr3#%H^ATv z)-9$jsf%>G%#^`T4L`+LxPSu-m00>A?c@&opr4bMIt`3>uNR?0bR`x6dZD{erK6{C}+VBfL`{iKOL_gElr*1D6 zx(t9544<|miE}%Ez}=e7W_X{naoMs5+}66pkRwaoGShqp;}?!C{Y9zbC&aP|SvIqO z$**)3>39$QpDWqipZxe5J{R~iSq0k0+DBMKuVx6p*GTt}jAGF$hd?RBlaiQw$!ptW zMK6?<@8-Bfa%$@?5(UMB4JS8_VTm=CWo*XO6*9Ch-arz)$ayTF)Ts42HkKqJ4|6C1 zvGh5B;p1`N{`~hR%h6>zdY@PgV2)Ml%*mu(?|Q$DYsnD!6~pE+)Djns?N7^Wczwy1Y3sg7NsZ|fO~69hV#sT=NkiV zFYX^+aSE*^wMM+=BehU_?%AzM$M4+8nU{pBlGD}rZZ_?EKvne+1e@oP$j;BdTCa7$j<9+N6$&$Wl`)$wR6>39Y3Ox}{QESrc9xax zTd&tG%S7k?j+{-Udk&S(%(FzTGv&b7v_M=-J&1{h4_!D-ZRV5ngdvpl^I2tc0v(_z zMTxBSx(|U5&HXX2qKA(gd|p30-I!7QJX$};bto3$hT3JOjQ<9QcjipGYlcpt?WlHY49z0(P znxG+_*3P)S&fPM7^?{DDi zLbsNOOtT|ryDoN9@9>9?b3Lj|)Z2lXThUIsx6wC>5jBxIuxEOrr9#Wi9KL29vXi-l zo!8*I;#w@P3~SQiHilt*Ld4mqtHKO7G<>Mzir&T4FjG;oO3`oB@=5bjIM!*HPIKa+ ziwJ0&3}Xj%yspywT2j?L!cuoy+XcrL+*R^i?GO)MBDt}+Sq zl};L(R4CR|6b*6s{k3@Heh(fSO9;0m z$iWBhgaYmAF5Dz1zCaCz+2Y zTHpel)(*#*VQeQPUUG1;?j;WlTA^Rxja7eS^pCtAl#FRF{{|sT+)$0CG>O&?Vg zfL_|Y82|oxpk|^G#LsC3)#1mu8XUt1g`T}3$~|F?0*|RL=(hRPyD$ecszCL2P$T86 zV^@1WUdmM`UL3Fm3-eYN`1T{Es?O1g&JFO zrQ&3`E&%CVJR~xDHS66rdfdi)PO@@zx)g(1^6|HTjg?7s>B5szUI)x0Ms1vNvssb9 zg=o{76EPS#UB18KI6W~}=*WEurAgdrJXw; zX#Z+kEhsKWv#`rF*|qiU6GM~Sr!kG+H48CcgQmTSaxYC8sL&@aL{Zx9w-GZyN|Hy# dedy-#;j`HG!7zR(>YFl}s-mXC&sXN5{{xQdP$d8W literal 0 HcmV?d00001 diff --git a/docs/src/man/dist_reroot.md b/docs/src/man/dist_reroot.md index 23a97de54..fbece8431 100644 --- a/docs/src/man/dist_reroot.md +++ b/docs/src/man/dist_reroot.md @@ -1,26 +1,37 @@ ```@setup dist_reroot using PhyloNetworks mkpath("../assets/figures") -raxmltrees = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","raxmltrees.tre") -raxmlCF = readTableCF(writeTableCF(countquartetsintrees(readMultiTopology(raxmltrees), showprogressbar=false)...)) -astralfile = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","astral.tre") -astraltree = readMultiTopology(astralfile)[102] # 102th tree = last tree here -net0 = readTopology(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net0.out")) -net1 = readTopology(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net1.out")) -net0.loglik = 53.53150526187732 -net1.loglik = 28.31506721890958 ``` # Comparing and manipulating networks -Examples below follow those in [Getting a Network](@ref). +Examples below use networks available from the package. +We can load them as follows. +`astraltree` is a tree estimated using ASTRAL, +`net0` is a network estimated using SNaQ under the constraint of 0 reticulation, +so it's also a tree, and +`net1` is a network estimated under the constraint of 1 reticulation, so not a tree. + +All of them are to be interpreted as *semidirected* networks, +because their root is not identifiable by the method used to estimate them. +This affects how we want them. -## Comparing networks / trees +```@example dist_reroot +astralfile = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","astral.tre") +astraltree = readmultinewick(astralfile)[102] # 102th tree = last tree here +net0 = readnewick(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net0.out")) +net1 = readnewick(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net1.out")) +nothing # hide +``` -Is the SNaQ tree (network with h=0) the same as the ASTRAL tree? -We can calculate their Robinson-Foulds distance: +## Robinson-Foulds distance for trees + +Do the 2 trees `astraltree` and `net0` have the same topology, unrooted? +We can calculate the Robinson-Foulds distance between them, +using a function that extends the Robinson-Foulds distance to general networks +(more on this below). ```@repl dist_reroot -hardwiredClusterDistance(astraltree, net0, false) +hardwiredclusterdistance(astraltree, net0, false) ``` The last option `false` is to consider topologies as unrooted. The RF distance is 0, so the two unrooted topologies are the same. @@ -28,7 +39,7 @@ If we had considered them as rooted, with whatever root they currently have in their internal representation, we would find a difference: ```@repl dist_reroot -hardwiredClusterDistance(astraltree, net0, true) +hardwiredclusterdistance(astraltree, net0, true) ``` ## Re-rooting trees and networks @@ -39,21 +50,22 @@ as rooted topologies (and find no difference): ```@repl dist_reroot rootatnode!(astraltree, "O") rootatnode!(net0, "O") -hardwiredClusterDistance(astraltree, net0, true) +hardwiredclusterdistance(astraltree, net0, true) ``` ```@example dist_reroot using PhyloPlots, RCall -R"name <- function(x) file.path('..', 'assets', 'figures', x)" -R"svg(name('net0_O.svg'), width=4, height=4)" +R"name <- function(x) file.path('..', 'assets', 'figures', x)" +R"svg(name('net0_O.svg'), width=4, height=4)" R"par"(mar=[0,0,0,0]) plot(net0); -R"dev.off()" +R"dev.off()" nothing # hide ``` ![net0_O](../assets/figures/net0_O.svg) -Note that, as in previous chapters, we use the possibilities of `RCall` -to save the plot. We only show this commands once, but they will be run +Note that we use the possibilities of +[`RCall`](https://juliainterop.github.io/RCall.jl/stable/gettingstarted/) +to save the plot. We only show these commands once, but they will be run behind the scene each time a plot is called. After trees/networks are rooted with a correct outgroup, @@ -61,14 +73,14 @@ their visualization is more meaningful. Networks can be re-rooted at a given node or along a given edge. Get help (type `?`) on the functions `rootatnode!` and `rootonedge!` -for more info. There are examples in the [Bootstrap](@ref) section. +for more info. There are examples in the [Network support](@ref) section. If the network is plotted with crossing edges, you may identify ways to rotate the children edges at some nodes to untangle some crossing edges. This can be done using the function `rotate!`. -See an example in the [Bootstrap](@ref) section, or type `?` then `rotate!`. +See an example in the [Network support](@ref) section, or type `?` then `rotate!`. -## What if the root conflicts with the direction of a reticulation? +## Does the root conflict with the direction of a reticulation? With 1 hybridization or more, the direction of hybrid edges constrain the position of the root. The root cannot be downstream of hybrid edges. @@ -81,7 +93,7 @@ network below. We plotted the edge numbers, because we will want to use them later to place the root. ```@example dist_reroot -net7taxa = readTopology("(C,D,((O,(E,#H7:::0.196):0.314):0.664,(((A1,A2))#H7:::0.804,B):10.0):10.0);") +net7taxa = readnewick("(C,D,((O,(E,#H7:::0.196):0.314):0.664,(((A1,A2))#H7:::0.804,B):10.0):10.0);") R"svg(name('reroot_net7taxa_1.svg'), width=4, height=4)" # hide R"par"(mar=[0,0,0,0]) # hide plot(net7taxa, showgamma=true, showedgenumber=true, tipoffset=0.2); @@ -90,7 +102,7 @@ nothing # hide ``` ![reroot net7taxa 1](../assets/figures/reroot_net7taxa_1.svg) -Let's imagine that the A1 and A2 are our outgroups, and we estimated the network above. +Let's imagine that A1 and A2 are our outgroups, and we estimated the network above. According to this network, time must flow from the hybrid node towards A1 and A2. So any attempt to reroot the network with A1 as outgroup, or with A2 as outgroup, or with the A clade (on edge 11), will fail with a `RootMismatch` error: @@ -128,7 +140,7 @@ We can display the exact same network differently, by changing the γ inheritance values to invert the major/minor consideration of the hybrid edges. ```@example dist_reroot net7taxa.edge[5] # just to check that it's one of the 2 hybrid edges of interest -setGamma!(net7taxa.edge[5], 0.501) # switch major/minor edges +setgamma!(net7taxa.edge[5], 0.501) # switch major/minor edges R"svg(name('reroot_net7taxa_3.svg'), width=4, height=4)"; # hide R"layout(matrix(1,1,1))"; # hide R"par"(mar=[0,0,0,0]); # hide @@ -151,15 +163,13 @@ It would be the case if A1 was the only outgroup, and if A2 was an ingroup taxon In such a case, the outgroup knowledge tells us that our estimated network is wrong. One (or more) reticulation in the network must be incorrect. Its placement might be correct, but then its direction would be incorrect. -If the network was estimated via `snaq!`, check tips -about [Candidate networks compatible with a known outgroup](@ref). ## Extracting the major tree -We can also compare the networks estimated with h=0 (net0) and h=1 (net1): +We can also compare the networks estimated with h=0 (`net0`) and h=1 (`net1`): ```@repl dist_reroot rootatnode!(net1, "O"); # the ; suppresses screen output -hardwiredClusterDistance(net0, net1, true) +hardwiredclusterdistance(net0, net1, true) ``` ```@example dist_reroot R"svg(name('net1_O.svg'), width=4, height=4)" # hide @@ -171,35 +181,36 @@ nothing # hide ![net1_O](../assets/figures/net1_O.svg) They differ by 2 clusters: that's because A is of hybrid descent -in net1, not in net0. +in `net1` (descendant of each hybrid edge), not in `net0`. To beyond this hybrid difference, we can extract the major tree from the network with 1 hybridization, that is, delete the hybrid edge supported by less than 50% of genes. -Then we can compare this tree with the ASTRAL/SNaQ tree net0. +Then we can compare this tree with the ASTRAL/SNaQ tree `net0`. ```@repl dist_reroot -tree1 = majorTree(net1); # major tree from net1 -hardwiredClusterDistance(net0, tree1, true) +tree1 = majortree(net1); # major tree from net1 +hardwiredclusterdistance(net0, tree1, true) ``` They are identical (at distance 0), so here the species network with 1 hybrid node is a refinement of the estimated species tree (this needs not be the case always). -Is the SNaQ network with 1 hybrid node the same as the true network, -the one that was initially used to simulate the data? +## Hardwired-cluster distance + +Is `net1`, the SNaQ network with 1 hybrid node, the same as the true network, +the network that was initially used to simulate the data? -(digression on the data: gene trees were simulated under the coalescent +(Digression on this example's data: gene trees were simulated under the coalescent along some "true" network, then 500 base-pair alignments were simulated along each gene tree with the HKY model, gene trees were estimated from each alignment with RAxML, and these estimated gene trees served as input to both ASTRAL and SNaQ.) -The true network is shown below, correctly rooted at the outgroup O, +The "true" network is shown below, correctly rooted at the outgroup O, and plotted with branch lengths proportional to their values in coalescence units: ```@repl dist_reroot -truenet = readTopology("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); -hardwiredClusterDistance(net1, truenet, true) +truenet = readnewick("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); ``` ```@example dist_reroot R"svg(name('truenet_sim.svg'), width=4, height=4)" # hide @@ -210,17 +221,40 @@ nothing # hide ``` ![truenet](../assets/figures/truenet_sim.svg) -Our estimated network is not the same as the true network: +We can compare two networks using the hardwired-cluster dissimilarity. +- This dissimilarity counts the number of hardwired clusters present in one network + but absent in the other. +- The **hardwired cluster** associated with an edge is the set of *all* tips + descendant from that edge, i.e. all tips that inherited + at least *some* genetic material from that edge. +- Each edge is associated with its hardwired cluster of descendants, + and also with a "tree" tag or "hybrid" tag depending on the edge type. + +!!! info "distance versus dissimilarity" + When comparing level-1 networks, or tree-child networks more generally, + the hardwired-cluster dissimilarity is a distance: + d(N, N') = 0 exactly when N and N' have the same topology. + ([Cardona et al. 2009](https://doi.org/10.1109/TCBB.2024.3361390), + [Bai et al.](https://doi.org/10.1016/j.mbs.2021.108537) + [Maxfield et al. 2024](https://arxiv.org/abs/2405.16035)). + Unfortunately, this is not generally true for complex network: there are + networks at hardwired-cluster 'distance' 0, that have different topologies. + But no dissimilarity measure can both be fast to calculate and + be a distance on the full space of phylogenetic networks + ([Cardona et al. 2014](https://doi.org/10.1155/2014/254279)). + +```@repl dist_reroot +hardwiredclusterdistance(net1, truenet, true) # true: yes consider these networks as rooted +``` +Our estimated network is at distance 4 (not 0), so it is *different* from the +true network (there was estimation error). From the plots, we see that: - the underlying tree is correctly estimated - the origin of gene flow is correctly estimated: E - the target of gene flow is *not* correctly estimated: it was the lineage ancestral to (A,B), but it is estimated to be A only. -For networks, the distance here is the hardwired cluster distance: -the number of hardwired clusters found in one network and not -in the other. The **hardwired cluster** associated with an edge is the -set of *all* tips descendant from that edge, i.e. all tips that -inherited at least *some* genetic material from that edge. +The 4 cluster differences correspond to the 2 hybrid edges in `net1` (whose +cluster is A) plus the 2 hybrid edges in `truenet` (whose cluster is AB). ## Displayed trees and subnetworks @@ -231,15 +265,15 @@ We can choose to pick the "important" hybrid edges only, with heritability γ at or above a threshold. Below we use a γ threshold of 0, so we get all displayed trees: ```@repl dist_reroot -t = displayedTrees(net1, 0.0) # list of trees displayed in network -writeTopology(t[1], round=true) -writeTopology(t[2], round=true) +t = displayedtrees(net1, 0.0) # list of trees displayed in network +writenewick(t[1], round=true) +writenewick(t[2], round=true) ``` If we decide to keep edges with γ>0.2 only, then we are left with a single tree in the list (the major tree). This is because our example has 1 hybrid node with minor γ=0.196. ```@repl dist_reroot -t = displayedTrees(net1, 0.2) +t = displayedtrees(net1, 0.2) ``` We can also delete all "non-important" reticulations, @@ -248,13 +282,13 @@ The function below changes our network `net1`, as indicated by its name ending with a `!`. ```@repl dist_reroot -deleteHybridThreshold!(net1, 0.1) +deletehybridthreshold!(net1, 0.1) ``` Nothing happened to our network: because its γ is above 0.1. But if we set the threshold to 0.3, then our reticulation disappears: ```@repl dist_reroot -deleteHybridThreshold!(net1, 0.3) +deletehybridthreshold!(net1, 0.3) ``` -See also function `displayedNetworkAt!` to get the network with +See also function `displayednetworkat!` to get the network with a single reticulation of interest, and eliminate all other reticulations. diff --git a/docs/src/man/expectedCFs.md b/docs/src/man/expectedCFs.md deleted file mode 100644 index f9db34507..000000000 --- a/docs/src/man/expectedCFs.md +++ /dev/null @@ -1,110 +0,0 @@ -```@setup expCFs -using PhyloNetworks -mkpath("../assets/figures") -raxmltrees = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","raxmltrees.tre") -raxmlCF = readTableCF(writeTableCF(countquartetsintrees(readMultiTopology(raxmltrees), showprogressbar=false)...)) -truenet = readTopology("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); -``` - -# Extract Expected CFs - -A good way to visualize the "goodness-of-fit" of a given estimated network to the data -is to plot the observed CF versus the expected CF. If the network is a good fit, then the dots -in the plot will be close to the diagonal (x=y line). -The following function will create a dataframe with the observed and expected CFs, -which are all saved in the DataCF object after running snaq: -```@repl expCFs -topologyMaxQPseudolik!(truenet, raxmlCF); -df_wide = fittedQuartetCF(raxmlCF) # same as fittedQuartetCF(raxmlCF, :wide) -df_long = fittedQuartetCF(raxmlCF, :long) -``` -It is important to have run `snaq!`, `topologyQPseudolik!` or `topologyMaxQPseudolik!` -before making these tables, or the result would be meaningless. -These functions update the fitted concordance factors (those expected under the network) -inside the DataCF object `raxmlCF`. - -Here is one way to plot them, via R again, and using the R package `ggplot2`. - -```@example expCFs -using RCall -obsCF = df_long[!,:obsCF]; expCF = df_long[!,:expCF]; # hide -R"name <- function(x) file.path('..', 'assets', 'figures', x)"; # hide -R"svg(name('expCFs_obsvsfitted.svg'), width=5, height=4)"; # hide -R"par"(mar=[2.5,2.6,.5,.5], mgp=[1.5,.4,0], tck=-0.01, las=1, pty="s"); # hide -R"plot(0:1, 0:1, type='l', bty='L', lwd=0.3, col='#008080', xlab='quartet CF observed in gene trees', ylab='quartet CF expected from network')"; # hide -R"set.seed"(1234); # hide -R"points(jitter($obsCF,amount=0.005),jitter($expCF,amount=0.005),col='#008080',bg='#00808090',pch=21)"; # hide -R"dev.off()"; # hide -nothing # hide -``` -To install ggplot2 if not installed already, do: -`R"install.packages('ggplot2', dep=TRUE)"` - -```julia -@rlibrary ggplot2 -ggplot(df_long, aes(x=:obsCF,y=:expCF)) + theme_classic() + - geom_segment(x=0,y=0,xend=1,yend=1, color="#008080", size=0.3) + # diagonal line - geom_point(alpha=0.5, color="#008080", position=position_jitter(width=0.005, height=0.005)) + - ylab("quartet CF expected from network") + xlab("quartet CF observed in gene trees") + coord_equal(ratio=1); -# if needed, save with: -ggsave("expCFs_obsvsfitted.svg", scale=1, width=6, height=5); -``` - -![obsvsfitted](../assets/figures/expCFs_obsvsfitted.svg) - -Many points are overlapping, so they were "jittered" a little to see them all better. -There are always many points overlapping on the bottom-left corner: -concordance factors of 0.0 for quartet resolutions not observed, and not expected. -To export the table of quartet CFs and explore the fit of the network with other tools: - -```julia -using CSV -CSV.write("fittedCF.csv", df_long) -``` -alternative code to get a similar plot with [Gadfly](http://gadflyjl.org/): -```julia -using Gadfly -plot(layer(df_long, Geom.point, x="obsCF", y="expCF"), - layer(x=0:1,y=0:1, Geom.line), # diagonal line - Guide.xlabel("CF observed in gene trees"), Guide.ylabel("CF expected from network")) -``` - -We could highlight quartets that include taxon A, say, -if we suspect that it is an unrecognized hybrid. -Many points are overlapping, like before, so they are again "jittered" a bit. - -```@example expCFs -using DataFrames -df_long[!,:has_A] .= "no"; # add a column to our data, to indicate which 4-taxon sets have A or not -for r in eachrow(df_long) - if "A" ∈ [r[:tx1], r[:tx2], r[:tx3], r[:tx4]] - r[:has_A]="yes" - end -end -has_A = df_long.has_A # hide -nq = length(has_A); # hide -R"colA=rep('#008080',$nq); bgA=rep('#00808090',$nq);"; # hide -R"colA[$has_A=='yes']='#F8766D'; bgA[$has_A=='yes']='#F8766D90'"; # hide -R"svg(name('expCFs_obsvsfitted_A.svg'), width=5, height=4)"; # hide -R"par"(mar=[2.5,2.6,.5,.5], mgp=[1.5,.4,0], tck=-0.01, las=1, pty="s"); # hide -R"plot(0:1, 0:1, type='l', bty='L', lwd=0.3, col='black', xlab='quartet CF observed in gene trees', ylab='quartet CF expected from network')"; # hide -R"set.seed"(2345); # hide -R"points(jitter($obsCF,amount=0.005),jitter($expCF,amount=0.005),col=colA,bg=bgA,pch=21)"; # hide -R"legend(x=0.7,y=0.3,pch=21,col=c('#008080','#F8766D'),legend=c('no','yes'),title='has A?', bty='n',bg=c('#00808090','#F8766D90'))"; # hide -R"dev.off()"; # hide -nothing # hide -``` -```@repl expCFs -first(df_long, 7) # first 7 rows -``` - -```julia -ggplot(df_long, aes(x=:obsCF, y=:expCF, color=:has_A)) + theme_classic() + - geom_segment(x=0,y=0,xend=1,yend=1, color="black", size=0.3) + # diagonal line - geom_point(alpha=0.5, position=position_jitter(width=0.005, height=0.005)) + - ylab("quartet CF expected from network") + xlab("quartet CF observed in gene trees") + coord_equal(ratio=1); -# can be saved: -ggsave("expCFs_obsvsfitted_A.svg", width=6, height=5); -``` - -![obsvsfitted A present or not](../assets/figures/expCFs_obsvsfitted_A.svg) diff --git a/docs/src/man/fitDiscrete.md b/docs/src/man/fitDiscrete.md deleted file mode 100644 index 3000d3ff6..000000000 --- a/docs/src/man/fitDiscrete.md +++ /dev/null @@ -1,232 +0,0 @@ -```@setup fitdiscrete_trait -using PhyloNetworks -using DataFrames -mkpath("../assets/figures") -figname(x) = joinpath("..", "assets", "figures", x) -``` - -# Discrete Trait Evolution - -With a phylogenetic network structure inferred, we can now estimate how quickly traits -have evolved over time using a likelihood model. These traits should be discrete -characteristics of a species such as feather color, diet type, -or DNA in aligned genetic sequences. - -## Discrete trait data - -As with continuous trait evolution, we assume a fixed network, correctly rooted, -with branch lengths proportional to calendar time. We start with a network, then -add data about the tips of this network. - -The simplest way is to use a vector of species names with a data frame of traits: - -```@repl fitdiscrete_trait -# read in network -net = readTopology("(O:4,(A:3,((B:0.4)#H1:1.6::0.92,((#H1:0::0.08,C:0.4):0.6,(D:.2,E:.2):0.8):1):1):1);"); -# read in trait data -species = ["C","A","D","B","O","E"]; -dat = DataFrame(trait=["hi","lo","lo","hi","lo","lo"]) -``` - -If your species names and trait data are in the same data frame, -read in your data frame then subset the data like this: -```@example fitdiscrete_trait -dat = DataFrame(species=["C","A","D","B","O","E"], trait=["hi","lo","lo","hi","lo","lo"]); -species = dat.species # or: dat[!, :species] -select!(dat, Not(:species)) # select all columns except for :species; modifies dat in place -nothing # hide -``` - -Let's plot the network and map the data onto it: - -```@example fitdiscrete_trait -using RCall, PhyloPlots -R"svg"(figname("fitdiscrete_trait_net_1.svg"), width=4, height=3); # hide -R"par"(mar=[0,0,0,0]); # to reduce margins -res = plot(net, tipoffset=0.3); # the results "res" provides point coordinates, to use for data annotation -o = [findfirst(isequal(tax), species) for tax in tipLabels(net)] # 5,2,4,1,3,6: order to match taxa from "species" to tip labels -isequal(species[o], tipLabels(net)) # true :) -traitcolor = map(x -> (x=="lo" ? "grey" : "red"), dat.trait[o]) -leaves = res[13][!,:lea] -R"points"(x=res[13][leaves,:x] .+0.1, y=res[13][leaves,:y], pch=16, col=traitcolor, cex=1.5); # adds grey & red points -R"legend"(x=1, y=7, legend=["hi","lo"], pch=16, col=["red","grey"], - title="my trait", bty="n",var"title.adj"=0); -# next: add to gene flow edge the proportion γ of genes affected -hi = findfirst([!e.isMajor for e in net.edge]) # 6 : "h"ybrid "i"ndex: index of gene flow edge (minor hybrid) in net: horizontal segment -R"text"(res[14][hi,:x]-0.3, res[14][hi,:y]-0.1, res[14][hi,:gam], col="deepskyblue", cex=0.75); # add the γ value -R"dev.off"(); # hide -nothing # hide -``` - -![net_1](../assets/figures/fitdiscrete_trait_net_1.svg) - -## Substitution models - -After reading in your data, choose a model to describe how evolutionary changes -(or substitutions, in the case of DNA) happened over time. -Available Markov substitution models are described below. - -For general trait types, use one of these three models: -- `:BTSM` Binary Trait Substitution Model (2 states, rates unconstrained) -- `:ERSM` Equal Rates Substitution Model - (`k` states, all transitions possible with equal rates) -- `:TBTSM` Two Binary Trait Substitution Model (though not fully implemented yet) - - -## Inference - -To infer evolutionary rates, run [`fitdiscrete`](@ref) on the network and data. -It will calculate the maximum likelihood score -of one or more discrete trait characters at the tips -on a fixed network. - -- Along each edge, evolutionary changes are modeled with a - continous time Markov model. -- At a hybrid node, the trait is assumed to be inherited from one or the other - of its parents (immediately before the reticulation event), - with probabilities equal to the inheritance γ of each parent edge, - which is given by the network. -- At the root of the network, a uniform distribution among the possible - states is assumed a priori. -- The model ignores incomplete lineage sorting (e.g. hemiplasy). - -### parameter estimation & model fit - -The example below if for a binary trait, first using a model assuming -equal rates (from `lo` to `hi` and from `hi` to `lo`); -then using a model allowing for distinct rates. -The option `optimizeQ=false` causes transition rates -to stay at their starting values, without being optimized. - -```@repl fitdiscrete_trait -s1 = fitdiscrete(net, :ERSM, species, dat; optimizeQ=false) -s2 = fitdiscrete(net, :BTSM, species, dat; optimizeQ=false) -``` -The default rates, which act as starting value if rates were to be optimized, -are chosen equal to the inverse of the total edge lengths -in the network (or 1/ntax if all branch lengths are missing). - -By default `optimizeQ = true`, such that [`fitdiscrete`](@ref) -estimates the parameters of the rate matrix Q. - -```@repl fitdiscrete_trait -s3 = fitdiscrete(net, :ERSM, species, dat) -s4 = fitdiscrete(net, :BTSM, species, dat) -``` - -To compare the two models, we can use the Akaike criterion. -```@repl fitdiscrete_trait -using StatsBase -aic(s3) -aic(s4) -``` -Here, the equal-rate model is slightly favored (lower AIC), -so we will use `s3` below. - -### ancestral state prediction - -This is traditionally called "ancestral state reconstruction", -but we do not actually reconstruct anything. -We make predictions for (past of present-day) values, -hopefully with some measure to quantify our uncertainty. - -```@repl fitdiscrete_trait -# show(ancestralStateReconstruction(s3), allrows=true) -ancestralStateReconstruction(s3) -``` -Rows 1-6 correspond to the tips, with known values. -We see much prediction uncertainty at most of the internal nodes. -To see where these internal nodes (7-13/H1) are, we need to look -at the network stored within the fitted model. -This network might differ somewhat from the input network in case -taxa with missing data where pruned, and with edges possibly renumbered. - -```@example fitdiscrete_trait -R"svg"(figname("fitdiscrete_trait_net_2.svg"), width=4, height=3); # hide -R"par"(mar=[0,0,0,0]); # hide -plot(s3.net, shownodenumber=true, shownodelabel=true, tipoffset=0.2); -R"dev.off"(); # hide -nothing # hide -``` - -![net_2](../assets/figures/fitdiscrete_trait_net_2.svg) - -Looking back at the posterior probabilities of states "hi" and "lo" -at each node from the ancestral 'prediction' table above, -we see that there is more uncertainty near the root, and -less uncertainty near the tips. -The most recent common ancestor of D and E (node 11), -in particular, is predicted to be "lo" with fairly high certainty. - -### impact of gene flow on the trait - -An interesting question is whether there is evidence that B obtained -it's "hi" state via gene flow. The prior probability for this is γ: -the supposedly known proportion of genes inherited via gene flow, -which is part of the network (along with branch lengths). -Here, this prior probability of trait inheritance via gene flow is: - -```@repl fitdiscrete_trait -net.edge[6].gamma # the minor hybrid edge was edge 6, from above -``` - -We can compare this to the posterior probability, and get a Bayes factor -to compare the two hypotheses: gene flow vs. vertical inheritance. - -```@repl fitdiscrete_trait -exp(s3.priorltw[1]) # prior: for vertical inheritance. "ltw" = log tree weight -exp(s3.priorltw[2]) # prior: for gene flow inheritance, same as γ above -postltw = PhyloNetworks.posterior_logtreeweight(s3) -exp(postltw[2]) # posterior: for gene flow inheritance -function geneflowBF(fit) - postltw = PhyloNetworks.posterior_logtreeweight(fit) - exp(postltw[2] - postltw[1] + fit.priorltw[1] - fit.priorltw[2]) -end -geneflowBF(s3) -``` - -We get a Bayes factor greater than 1, so there is more evidence that -the "hi" value of B was inherited via gene flow, than via vertical -inheritance. But the Bayes factor is just barely above 1, so the -evidence is very equivocal. -This may not be surprising given that -gene flow occurred between fairly closely related species, -and that the data set is very small. - -## Trait simulation - -[`randomTrait`](@ref) can simulate traits along a known network. -For example, we can define a binary trait model with states -"carnivory" (state 1) and "non-carnivory" (state 2), then ask for -a trait to be simulated along our network. We can ask for -3 independent simulations, giving us 3 traits then, arranged in 3 rows. - -```@repl fitdiscrete_trait -m1 = BinaryTraitSubstitutionModel(1.0,2.0, ["carnivory", "non-carnivory"]) -using Random; Random.seed!(1234); # for reproducibility of this example -traitmatrix, nodecolumn = randomTrait(m1, net; ntraits=3); -traitmatrix -``` - -In this trait matrix, each column corresponds to a node, -each row is a trait, and each entry gives the state of that trait for that node, -as an index. To get the state labels: - -```@repl fitdiscrete_trait -m1.label[traitmatrix] -``` - -The `nodecolumn` vector says which node corresponds to which column -in the trait matrix, and we can compare to the node numbers in the network. -For example, the first column corresponds to node `-2`, which is the root. -(The root is always in the first column: that's where the simulation starts.) -Also, as an example, the column for taxon "A" is column 12: - -```@repl fitdiscrete_trait -nodecolumn -net.node[net.root] -findfirst(isequal("A"), nodecolumn) -nodecolumn[12] -traitmatrix[:,12] -m1.label[traitmatrix[:,12]] -``` diff --git a/docs/src/man/fitdiscreteDNA.md b/docs/src/man/fitdiscreteDNA.md deleted file mode 100644 index f1c2b8001..000000000 --- a/docs/src/man/fitdiscreteDNA.md +++ /dev/null @@ -1,78 +0,0 @@ -```@setup concatdna -using PhyloNetworks -``` - -# fitting DNA on a network - -The methods below model each DNA site as a trait, assuming that -sites are unlinked, that is, they evolve independently of each other. -In other words, this is a "concatenation" approach where -sites from the same locus do not share information about their -evolutionary path. This is appropriate if recombination is assumed -to have occurred within genes. - -## DNA evolution: data and models - -### reading in an alignment - -As for trait evolution, [`fitdiscrete`](@ref) can be used. It can be -given data in a variety of ways. For DNA, this is one way: - -```@repl concatdna -# read in network -dna_net = readTopology("((((((((((((((Ae_caudata_Tr275:1.0,Ae_caudata_Tr276:1.0):1.0,Ae_caudata_Tr139:1.0):1.0)#H1:1.0::0.6,((((((Ae_longissima_Tr241:1.0,Ae_longissima_Tr242:1.0):1.0,Ae_longissima_Tr355:1.0):1.0,(Ae_sharonensis_Tr265:1.0,Ae_sharonensis_Tr264:1.0):1.0):1.0,((Ae_bicornis_Tr408:1.0,Ae_bicornis_Tr407:1.0):1.0,Ae_bicornis_Tr406:1.0):1.0):1.0,((Ae_searsii_Tr164:1.0,Ae_searsii_Tr165:1.0):1.0,Ae_searsii_Tr161:1.0):1.0):1.0)#H2:1.0::0.6):1.0,(((Ae_umbellulata_Tr266:1.0,Ae_umbellulata_Tr257:1.0):1.0,Ae_umbellulata_Tr268:1.0):1.0,#H1:1.0::0.4):1.0):1.0,((Ae_comosa_Tr271:1.0,Ae_comosa_Tr272:1.0):1.0,(((Ae_uniaristata_Tr403:1.0,Ae_uniaristata_Tr357:1.0):1.0,Ae_uniaristata_Tr402:1.0):1.0,Ae_uniaristata_Tr404:1.0):1.0):1.0):1.0,(((Ae_tauschii_Tr352:1.0,Ae_tauschii_Tr351:1.0):1.0,(Ae_tauschii_Tr180:1.0,Ae_tauschii_Tr125:1.0):1.0):1.0,(#H2:1.0::0.4,((((Ae_mutica_Tr237:1.0,Ae_mutica_Tr329:1.0):1.0,Ae_mutica_Tr244:1.0):1.0,Ae_mutica_Tr332:1.0):1.0)#H4:1.0::0.6):1.0):1.0):1.0,(((T_boeoticum_TS8:1.0,(T_boeoticum_TS10:1.0,T_boeoticum_TS3:1.0):1.0):1.0,T_boeoticum_TS4:1.0):1.0,((T_urartu_Tr315:1.0,T_urartu_Tr232:1.0):1.0,(T_urartu_Tr317:1.0,T_urartu_Tr309:1.0):1.0):1.0):1.0):1.0,(((((Ae_speltoides_Tr320:1.0,Ae_speltoides_Tr323:1.0):1.0,Ae_speltoides_Tr223:1.0):1.0,Ae_speltoides_Tr251:1.0):1.0):1.0,#H4:1.0::0.4):1.0):1.0):1.0,Ta_caputMedusae_TB2:1.0):1.0,S_vavilovii_Tr279:1.0):1.0,Er_bonaepartis_TB1:1.0):1.0,H_vulgare_HVens23:1.0);"); -# read in alignment in FASTA format -fastafile = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","Ae_bicornis_Tr406_Contig10132.aln"); -dna_dat, dna_weights = readfastatodna(fastafile, true); -dna_dat -dna_weights -``` - -Here, `dna_dat` is a single data frame containing both species names -and trait data (site patterns). The alignment was summarized by listing -each observed site pattern only once in `dna_dat`. -`dna_weights` is a vector of weights, containing -the number of times that each site pattern was observed. - -### sequence substitution models - -DNA-specific substitution models have 4 states: the 4 nucleotides from -[BioSymbols](https://github.com/BioJulia/BioSymbols.jl) -(listed [here](http://biojulia.net/BioSymbols.jl/stable/nucleicacids/)). -Each model has a relative and an absolute version. -- `:JC69` Jukes & Cantor 1969 model: one single rate for all transitions. - The relative version has values -1 along the diagonal of the rate matrix - (1 expected transition / unit of time). The absolute version has an extra - parameter to scale the rate matrix. -- `:HKY85` Hasegawa, Kishino & Yano 1985: treats transitions differently - from transversions. The relative is scaled to predict an average of - 1 transition / unit of time. - -We may allow for rate variation across sites using the `:RV` option. - -### likelihood of a fixed network - -In the examples below, none of the rate parameters are optimized, -so we get to see the default starting values. - -```@repl concatdna -d1 = fitdiscrete(dna_net, :JC69, dna_dat, dna_weights, :RV; optimizeQ=false, optimizeRVAS=false) -d2 = fitdiscrete(dna_net, :HKY85, dna_dat, dna_weights, :RV; optimizeQ=false, optimizeRVAS=false) -``` -When allowing for rate variation across sites, the default α is 1. - -In the more interesting examples below, -we optimize the evolutionary rates and the way rates vary across sites -(which is the default). -```@repl concatdna -d3 = fitdiscrete(dna_net, :JC69, dna_dat, dna_weights, :RV; ftolAbs=0.1, xtolAbs=0.01) -``` -Lenient tolerance parameters `ftolAbs` etc. have been chosen here to -make this example faster. -Note that the fitted object contains a separate version of the input network, -where any taxon without data has been pruned, and where branch length numbers -may have been modified. - -```@repl concatdna -d3.net -``` diff --git a/docs/src/man/fixednetworkoptim.md b/docs/src/man/fixednetworkoptim.md deleted file mode 100644 index ee4d0b808..000000000 --- a/docs/src/man/fixednetworkoptim.md +++ /dev/null @@ -1,182 +0,0 @@ -# Candidate Networks - -## Optimizing parameters for a given network - -For a given network topology, we can optimize the branch lengths and -inheritance probabilities (γ) with the pseudolikelihood. -This is useful if we have a few candidate networks to compare. -Each network can be optimized individually, and the network with the best -pseudolikelihood can be chosen. - -The score being optimized is a pseudo-deviance, i.e. -a multiple of the negative log pseudo-likelihood up to an additive constant -(the lower the better; a pseudo-deviance of 0 corresponds to a perfect fit). - -Following our example in [Getting a Network](@ref), -we can optimize parameters on the true network -(the one originally used to simulate the data): - -```@setup fixednetworkoptim -using PhyloNetworks -using Logging # to suppress info messages below -baselogger = global_logger() -mkpath("../assets/figures") -raxmltrees = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","raxmltrees.tre") -raxmlCF = readTableCF(writeTableCF(countquartetsintrees(readMultiTopology(raxmltrees), showprogressbar=false)...)) -``` - -```@repl fixednetworkoptim -truenet = readTopology("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); -net1alt = topologyMaxQPseudolik!(truenet, raxmlCF); -writeTopology(net1alt, round=true) -net1alt.loglik # pseudo deviance actually: the lower the better -``` -```@example fixednetworkoptim -using PhyloPlots, RCall -R"name <- function(x) file.path('..', 'assets', 'figures', x)" # hide -R"svg(name('truenet_opt.svg'), width=4, height=4)" # hide -R"par"(mar=[0,0,0,0]) -plot(net1alt, showgamma=true); -R"dev.off()" # hide -nothing # hide -``` -![truenet_opt](../assets/figures/truenet_opt.svg) - -We get a score of 29.941, -which is comparable to the score of the SNaQ network (net1: 28.315), -especially compared to the score of the best tree (net0: 53.532). -This begs the question: is the true network within the "range" of uncertainty? -We can run a [Bootstrap](@ref) analysis to measure uncertainty -in our network inference. - -For a more thorough optimization, we may increase the requirements before -the search stops (but the optimization will take longer). -It makes no difference on this small data set. -```julia -net1par = topologyMaxQPseudolik!(truenet, raxmlCF, ftolRel=1e-10, xtolAbs=1e-10) -net1par.loglik # pseudo deviance, actually: the lower the better -``` - -## Network Score with no optimization - -For a network with given branch lengths and γ heritabilies, -we can compute the pseudolikelihood (well, a pseudo-deviance) with: -```@repl fixednetworkoptim -topologyQPseudolik!(truenet,raxmlCF); -truenet.loglik # again, pseudo deviance -``` -This function is not maximizing the pseudolikelihood, it is simply computing the -pseudolikelihood (or deviance) for the given branch lengths and probabilities of -inheritance. At the moment, both of these functions require that the -given network is of level 1 (cycles don't overlap). - -## Candidate networks compatible with a known outgroup - -If the network was estimated via `snaq!`, it might turn out to be impossible -to root our estimated network with a known outgroup (see section -[What if the root conflicts with the direction of a reticulation?](@ref).) -At this time, `snaq!` does not impose any rooting constraint on the network: -the search for the lowest score considers all level-1 networks, including those -that are incompatible with a known outgroup. -(The monophyly of outgroups is not imposed either, like in many other methods.) - -If the estimated network cannot be rooted with the known outgroup, -we can check the `.networks` output file. -It has a list of networks that are slight modifications of the best network, -where the modifications changed the direction of one reticulation at a time. -For each modified network, the score was calculated. So if we find in this list -a modified network that has a score close to that of the best network, -and that can be re-rooted with our known root position, then this modified network -is a better candidate than the network with the best score. - -Below is what the `net1.networks` file looks like, after performing -the analysis in the section [Network Estimation](@ref). -Scroll to the right to see the scores. - - (C,D,((O,(E,#H7:::0.19558838614943078):0.31352437658618976):0.6640664399202987,(B,(A)#H7:::0.8044116138505693):10.0):10.0);, with -loglik 28.31506721890958 (best network found, remaining sorted by log-pseudolik; the smaller, the better) - (C,D,((O,(E)#H7:::0.8150784689693145):0.9336405757682176,(B,(A,#H7:::0.18492153103068557):0.25386142779877724):1.8758156446611114):10.0);, with -loglik 31.535560380783814 - (B,#H7:9.90999345612101::0.2555404440833535,(A,(E,(O,((C,D):10.0)#H7:0.3419231810962026::0.7444595559166465):0.19994859441332047):2.5014911511063644):0.7957621793330066);, with -loglik 56.64548310161462 - (C,D,((O,(E,((B)#H7:::0.7957543284159452,A):4.786202415937916):0.004527712280136759):1.7952610454570868,#H7:::0.20424567158405482):10.0);, with -loglik 67.17775727492258 - (C,D,(#H7:::0.32947301811471164,(B,(A,(E,(O)#H7:::0.6705269818852884):1.371799259141243):0.0):6.397073999864152):7.677245926003807);, with -loglik 199.11401961057143 - -We can read this file and look at its list of networks like this: - -```@repl fixednetworkoptim -file = "net1.networks"; -# or use the example file available with the package: -file = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net1.networks"); -netlist = readMultiTopology(file) # read the full list of networks in that file -``` -Next, we would like to extract the network scores from the file. -Below is a one-liner to do this -(we make Julia send a `sed` command to the shell --sorry, Mac or Linux for this.) -```@repl fixednetworkoptim -scoresInString = read(`sed -E 's/.+with -loglik ([0-9]+.[0-9]+).+/\1/' $file`, String) -scores = parse.(Float64, split(scoresInString)) -# next: update the "loglik" of each network with the score read from the file -for i in eachindex(netlist) - netlist[i].loglik = scores[i] - println("net $i in the list: score = ",scores[i]) -end -``` -The first network in the list is the best network returned by `snaq!`. -We see that the second network has a score that's not too far, but the other networks -have worse scores. The best network and its best modification (second network in the -list) are shown below. We chose to show edge numbers, to use them later -to re-root the networks. - -```@example fixednetworkoptim -R"svg(name('fixednetworkoptim_othernets1.svg'), width=7, height=4)" # hide -R"layout(matrix(1:2,1,2))"; # hide -R"par"(mar=[0,0,0,0]) # hide -plot(netlist[1], showgamma=true, showedgenumber=true, tipoffset=0.1); -R"mtext"("best net, score=28.3", line=-1); -plot(netlist[2], showgamma=true, showedgenumber=true, tipoffset=0.1); -R"mtext"("direction modified, score=31.5", line=-1); -R"dev.off()"; # hide -nothing # hide -``` -![othernets before reroot](../assets/figures/fixednetworkoptim_othernets1.svg) - -Now imagine that our outgroup is taxon A. -- best network: we would get a "RootMismatch" error if we tried to set - the root on the external edge 9 to A, with `rootatnode!(netlist[1], "A")` - (see section - [What if the root conflicts with the direction of a reticulation?](@ref)). - But we could root the best network on the major parent edge to A, edge 10 - (rooted network on the left below). -- For the second best network in our list, there are 2 ways to root it - with A: on the external edge 8 to A (top right), or on its parent edge 10 - These 2 options give quite different rooted versions - of the network, one of which requires the existence of an unsampled taxon, - sister to BOECD, that would have contributed to introgression into - an ancestor of E. The second rooted version says that an ancestor of - (or sister to) A contributed to the introgression into the ancestor of E. - A is an outgroup in both cases, but the second case is more parsimonious, - in the sense that it does not require the existence of an unsampled taxon. - -```@example fixednetworkoptim -R"svg(name('fixednetworkoptim_othernets2.svg'), width=7, height=7)" # hide -R"layout(matrix(c(1,4,2,3),2,2))"; # hide -R"par"(mar=[0,0,0.5,0]) # hide -rootonedge!(netlist[1], 10); # root best net to make A outgroup -rotate!(netlist[1], -4); # to 'un-cross' edges -rotate!(netlist[1], -6); -rotate!(netlist[1], -5); -plot(netlist[1], showgamma=true, tipoffset=0.1); -R"mtext"("best net, score=28.3", line=-1); -global_logger(NullLogger()); # hide -rootatnode!(netlist[2], "A"); # net with modified direction: first way to make A outgroup -global_logger(baselogger); # hide -rotate!(netlist[2], -4) # to 'un-cross' edges -rotate!(netlist[2], -6) -plot(netlist[2], showgamma=true, tipoffset=0.1); -R"mtext"("second best in list, score=31.5\nrequires unsampled population", line=-2); -rootonedge!(netlist[2], 10) # net with modified direction: second way to make A outgroup -for i in [9,-7] rotate!(netlist[2], i); end; # to 'un-cross' edges -plot(netlist[2], showgamma=true, tipoffset=0.1); -R"mtext"("second best in list, score=31.5\ndifferent root position", line=-2); -R"dev.off()"; # hide -nothing # hide -``` -![othernets after reroot](../assets/figures/fixednetworkoptim_othernets2.svg) diff --git a/docs/src/man/inputdata.md b/docs/src/man/inputdata.md deleted file mode 100644 index 35de29625..000000000 --- a/docs/src/man/inputdata.md +++ /dev/null @@ -1,187 +0,0 @@ -# Input for SNaQ - -SNaQ is a method implemented in the package to estimate a phylogenetic network -from multiple molecular sequence alignments. There are two alternatives for the input data: - -1. A list of estimated gene trees for each locus, which can be obtained using [MrBayes](http://mrbayes.sourceforge.net) or [RAxML](http://sco.h-its.org/exelixis/software.html). Or: -2. A table of concordance factors (CF), i.e. gene tree frequencies, for each 4-taxon subset. This table can be obtained from [BUCKy](http://www.stat.wisc.edu/~ane/bucky/), to account for gene tree uncertainty - -This [pipeline](https://github.com/nstenz/TICR) can be used to obtain the table of -quartet CF needed as input for SNaQ -(see also the [wiki](https://github.com/juliaphylo/PhyloNetworks.jl/wiki/TICR:-from-alignments-to-quartet-concordance-factors).) -It starts from the sequence alignments, -runs MrBayes and then BUCKy (both parallelized), producing the -table of estimated CFs and their credibility intervals. -Additional details on this [TICR pipeline](@ref) -describe how to insert data at various stages (e.g. after running MrBayes on each locus). - -## Tutorial data: gene trees - -We suggest that you create a special directory for running these examples, -where input files can be downloaded and where output files will be -created (with estimated networks for instance). Enter this directory -and run Julia from there. - -Suppose you have a file with a list of gene trees in parenthetical -format called `raxmltrees.tre`. -You can access the example file of input trees -[here](https://github.com/juliaphylo/PhyloNetworks/blob/master/examples/raxmltrees.tre) -or -[here](https://raw.githubusercontent.com/juliaphylo/PhyloNetworks/master/examples/raxmltrees.tre) -for easier download. - -Do not copy-paste into a "smart" text-editor. Instead, save the file -directly into your working directory using "save link as" or "download linked file as". -This file contains 30 gene trees, each in parenthetical format on 6 taxa -like this (with rounded branch lengths): - -`(E:0.038,((A:0.014,B:0.010):0.010,(C:0.008,D:0.002):0.010):0.025,O:0.078);` - -If `raxmltrees.tre` is in your working directory, you can view its content -within Julia: -```julia -less("raxmltrees.tre") -``` -or like this, to view the version downloaded with the package: -```julia -raxmltrees = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","raxmltrees.tre") -less(raxmltrees) -``` -Just type `q` to quit viewing this file. -You could read in these 30 trees and visualize the third one (say) like this: -```@example qcf -using PhyloNetworks -raxmltrees = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","raxmltrees.tre"); -nothing # hide -``` -```@repl qcf -genetrees = readMultiTopology(raxmltrees); -genetrees[3] -``` -To visualize any of these input trees, use the -[PhyloPlots](https://github.com/juliaphylo/PhyloPlots.jl) package: -```@example qcf -using PhyloPlots -using RCall # hide -mkpath("../assets/figures") # hide -R"name <- function(x) file.path('..', 'assets', 'figures', x)" # hide -R"svg(name('inputdata_gene3.svg'), width=4, height=3)" # hide -R"par"(mar=[0,0,0,0]) # hide -plot(genetrees[3]); # tree for 3rd gene -R"dev.off()" # hide -nothing # hide -``` -![gene3](../assets/figures/inputdata_gene3.svg) - -To read in all gene trees and directly summarize them by a list -of quartet CFs (proportion of input trees with a given quartet): -```@repl qcf -q,t = countquartetsintrees(genetrees); # read in trees, calculate quartet CFs -df = writeTableCF(q,t) # data frame with observed CFs: gene frequencies -using CSV -CSV.write("tableCF.csv", df); # to save the data frame to a file -raxmlCF = readTableCF("tableCF.csv") # read in the file and produces a "DataCF" object -rm("tableCF.csv") # hide -``` -`less("tableCF.csv")` lets you see the content of the newly created -file "tableCF.csv", within Julia. Again, type `q` to quit viewing this file. - -In this table, each 4-taxon set is listed in one row. -The 3 "CF" columns gives the proportion of genes that has -each of the 3 possible trees on these 4 taxa. - -For more help on any function, type `?` to enter the help mode, -then type the name of the function. For example: type `?` then `countquartetsintrees` -for information on the various options of that function. - -When there are many more taxa, the number of quartets -might be very large and we might want to use a subset to speed things up. -Here, if we wanted to use a random sample of 10 quartets -instead of all quartets, we could do: - -`raxmlCF = readTrees2CF(raxmltrees, whichQ="rand", numQ=10, CFfile="tableCF10.txt")` - -Be careful to use a numQ value smaller than the total number of possible -4-taxon subsets, which is *n choose 4* on *n* taxa (e.g. 15 on 6 taxa). -To get a predictable random sample, you may set the seed with -`using Random; Random.seed!(12321)` -(for instance) prior to sampling the quartets as above. -The `readTrees2CF` is *much* slower than the function `countquartetsintrees` -to read in trees and calculate the quartet CFs observed in the trees, -when we want to get *all* quartet CFs. But for a small sample of quartets, -then `readTrees2CF` is available. - -## Tutorial data: quartet CFs - -If we already have a table of quartet concordance factor (CF) values -in a file `buckyCF.csv` in this format - -| Taxon1 | Taxon2 | Taxon3 | Taxon4 | CF12_34 | CF13_24 | CF14_23 -|:-------|:-------|:-------|:-------|:--------|:--------|:------- -| D | A| E | O| 0.565 | 0.0903 | 0.3447 -| ... | | | | | | ... - -we would read it in one step like this: `readTableCF("buckyCF.csv")`. -An example file comes with the package, available -[here](https://github.com/juliaphylo/PhyloNetworks/blob/master/examples/buckyCF.csv) -or -[here](https://raw.githubusercontent.com/juliaphylo/PhyloNetworks/master/examples/buckyCF.csv). - -```@repl qcf -buckyCFfile = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","buckyCF.csv"); -buckyCF = readTableCF(buckyCFfile) -``` -The same thing could be done in 2 steps: -first to read the file and convert it to a 'DataFrame' object, -and then to convert this DataFrame into a DataCF object. -```@repl qcf -using CSV, DataFrames -dat = DataFrame(CSV.File(buckyCFfile); copycols=false); -first(dat, 6) # to see the first 6 rows -buckyCF = readTableCF(dat) -writeTableCF(buckyCF) -``` -In the input file, columns need to be in the right order: -with the first 4 columns giving the names of the taxa in each 4-taxon set. -The CF values are assumed to be in columns named "CF12_34", etc., -or else in columns 5,6,7. -If available, a column named "ngenes" will be taken to have the -the number of genes for each 4-taxon subset. - -## Tutorial data: starting tree - -If we have a tree for the data set at hand, -it can be used as a starting point for the optimization. -From our gene trees, we estimated a species tree with -[ASTRAL](https://github.com/smirarab/ASTRAL/blob/master/astral-tutorial.md). -This tree comes with the package in file `astral.tre` -[here](https://github.com/juliaphylo/PhyloNetworks/blob/master/examples/astral.tre). -This file has 102 trees: 100 bootstrap species trees, -followed by their greedy consensus, -followed by the best tree on the original data. -It's this last tree that we are most interested in. -We can read it with -```@example qcf -astralfile = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","astral.tre"); -astraltree = readMultiTopology(astralfile)[102] # 102th tree: last tree here -R"svg(name('inputdata_astraltree.svg'), width=4, height=3)" # hide -R"par"(mar=[0,0,0,0]) # hide -plot(astraltree, showedgelength=true); -R"dev.off()"; # hide -nothing # hide -``` -![astraltree](../assets/figures/inputdata_astraltree.svg) - -To start its search, SNaQ will need a network of "level 1". -All trees and all networks with 1 hybridization are of level 1. -To make sure that a network with 2 or more hybridizations is of level 1, -we can read it in with -`readTopologyLevel1` (which also unroots the tree, resolves polytomies, -replaces missing branch lengths by 1 for starting values etc.): -```julia -T=readTopologyLevel1("startNetwork.txt") -``` -(here `startNetwork.txt` is a hypothetical file: replace this by -the name of a file that contains your network of interest.) - -Next: [Getting a Network](@ref) diff --git a/docs/src/man/installation.md b/docs/src/man/installation.md index 7d03cab9e..a0228a8cf 100644 --- a/docs/src/man/installation.md +++ b/docs/src/man/installation.md @@ -1,6 +1,6 @@ # Installation -## Installation of Julia +## Install Julia Julia is a high-level and interactive programming language (like R or Matlab), but it is also high-performance (like C). @@ -12,32 +12,33 @@ Editors: - [Visual Studio Code](https://code.visualstudio.com) provides an editor and an integrated development environment (IDE) for Julia: highly recommended! -- [Juno](http://junolab.org) provides an IDE for Julia, - based on the [Atom](http://atom.io/) editor. -- you can also run Julia within a [Jupyter](http://jupyter.org) notebook - (formerly IPython notebook). + [Positron](https://github.com/posit-dev/positron) is a great (and similar) + alternative. +- Install the [Julia extension](https://code.visualstudio.com/docs/languages/julia) + in VS Code or Positron. +- We can also run Julia in a Pluto notebook. + [Pluto.jl](https://plutojl.org/) is a great to get started with Julia. -IMPORTANT: Julia code is just-in-time compiled. This means that the -first time you run a function, it will be compiled at that moment. So, -please be patient! Future calls to the function will be much much -faster. Trying out toy examples for the first calls is a good idea. +Julia code is just-in-time compiled. This means that the +first time we run a function, it will be compiled at that moment. +Future calls to the function will be much faster. +Trying out toy examples for the first calls is a good idea. -## Installation of the package PhyloNetworks +## Install PhyloNetworks To install the package, type inside Julia: ```julia using Pkg Pkg.add("PhyloNetworks") ``` -The first step can take a few minutes, be patient. If you already installed the package and want -the latest registered version, just do this (which will update all of your packages): +If you already installed the package and want +the latest registered version, do this to update all of your packages: ```julia Pkg.update() ``` -Warning: It is important to update the package regularly as it is +It is important to update the package regularly as it is undergoing constant development. Join the google group for updates -[here] -(https://groups.google.com/forum/#!forum/phylonetworks-users/new). +[here](https://groups.google.com/forum/#!forum/phylonetworks-users/new). `Pkg.update()` will install the latest registered version, but there could be other improvements in the `master` branch of the @@ -55,8 +56,8 @@ it. You can always free a pinned package with [here](https://docs.julialang.org/en/v1/stdlib/Pkg/). The PhyloNetworks package has dependencies like -[NLopt](https://github.com/JuliaOpt/NLopt.jl) and -[DataFrames](http://juliadata.github.io/DataFrames.jl/stable/) +[NLopt](https://github.com/jump-dev/NLopt.jl) and +[DataFrames](https://dataframes.juliadata.org/stable/) (see the `Project.toml` file for the full list), but everything is installed automatically. The companion package [PhyloPlots](https://github.com/juliaphylo/PhyloPlots.jl) @@ -80,13 +81,13 @@ This is something to type every time you start a Julia session: ```@example install using PhyloNetworks; ``` -This step can also take a while, if Julia needs to pre-compile the code (after a package +This step can also take a while, to pre-compile the code (after a package update for instance). Here is a very small test for the installation of PhyloNetworks. ```@repl install -net = readTopology("(A,(B,(C,D)));"); -tipLabels(net) +net = readnewick("(A,(B,(C,D)));"); +tiplabels(net) ``` You can see a list of all the functions with @@ -95,71 +96,92 @@ varinfo(PhyloNetworks) ``` and press `?` inside Julia to switch to help mode, followed by the name of a function (or type) to get more details about it. - + ## Julia types Each object in Julia has a *type*. We show here small examples on how to get more -info on an object, what's its type, and how to manipulate objects. -For example, let's take an object `raxmlCF` created from reading in some data -(see [Input for SNaQ](@ref)): +info on an object. +If we want to know the type of a particular object, use `typeof` +For example, let's read a list of gene trees. +First, we need the file name. + ```@repl install -raxmltrees = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","raxmltrees.tre"); -raxmlCF = readTrees2CF(raxmltrees); +raxmltreefile = joinpath(dirname(dirname(pathof(PhyloNetworks))), "examples","raxmltrees.tre") +typeof(raxmltreefile) ``` +The object `raxmltreefile` is a basic string (of letters). +Let's create our list of gene trees by reading this file. -Typing `varinfo()` will provide a list of objects and packages in memory, -including `raxmlCF` that we just created. -If we want to know the type of a particular object, we do: ```@repl install -typeof(raxmlCF) +genetrees = readmultinewick(raxmltreefile); # the semicolon suppresses info on the result +typeof(genetrees) ``` -which shows us that `raxmlCF` is of type `DataCF`. +which shows us that `genetrees` is of type `Vector{HybridNetwork}`, that is, +a vector containing networks. If we want to know about the attributes the object has, we can type `?` in Julia, -followed by `DataCF` for a description. -We can also ask for a list of all its attributes with +followed by `HybridNetwork` for a description. + +Typing `varinfo()` will provide a list of objects and packages in memory, +including `raxmltreefile` and `genetrees` that we just created. + +## Quick start + +Here we could check the length of our list of gene trees, as a sanity check +to make sure we have all gene trees we expected, and check that the third tree +has whatever taxon names we expected: ```@repl install -fieldnames(typeof(raxmlCF)) -``` -For example, we see that one attribute is `numQuartets`: its the number of 4-taxon subsets -in the data. To see what this number is: -```@repl install -raxmlCF.numQuartets -``` -We also noticed an attribute `quartet`. It is a vector of Quartet objects inside `raxmlCF`, so -```@repl install -raxmlCF.quartet[2].taxon +length(genetrees) +tiplabels(genetrees[3]) ``` -will provide the list of taxon names for the second 4-taxon subset in the data. -To see the observed CF, we can type + +We can also see some basic information on the third gene tree, say: ```@repl install -raxmlCF.quartet[2].obsCF +genetrees[3] ``` -We can verify the type with -```@repl install -typeof(raxmlCF.quartet[2]) +To visualize any of these gene trees, use the +[PhyloPlots](https://github.com/juliaphylo/PhyloPlots.jl) package: +```@example install +using PhyloPlots +using RCall # hide +mkpath("../assets/figures") # hide +R"name <- function(x) file.path('..', 'assets', 'figures', x)" # hide +R"svg(name('inputdata_gene3.svg'), width=4, height=3)" # hide +R"par"(mar=[0,0,0,0]) # hide +plot(genetrees[3]); # tree for 3rd gene +R"dev.off()" # hide +nothing # hide ``` -We can also read a simple network in Julia and print the list of edges +![gene3](../assets/figures/inputdata_gene3.svg) + + +We can also read a network from a newick formatted string, +and, for example, print a list of its edges: + ```@repl install -str = "(A,((B,#H1),(C,(D)#H1)));"; -net = readTopology(str); -printEdges(net) +newickstring = "(A,((B,#H1),(C,(D)#H1)));"; +net = readnewick(newickstring); +printedges(net) ``` + We see that the edges do not have branch lengths, -and the hybrid edges do not have gamma values. We can set them with +and the hybrid edges do not have gamma (inheritance) values. +We can set them with + ```@repl install -setLength!(net.edge[1],1.9) -setGamma!(net.edge[3],0.8) -printEdges(net) +setlength!(net.edge[1], 1.9) +setgamma!(net.edge[3], 0.8) +printedges(net) ``` where 1 and 3 correspond to the position of the given edge to modify in the list of edges. -We can only change the gamma value of hybrid edges (not tree edges). +We can only change the γ value of hybrid edges, +not tree edges (for which γ=1 necessarily). Such an attempt below will cause an error with a message to explain that the edge was a tree edge: ```julia -setGamma!(net.edge[4],0.7) +setgamma!(net.edge[4], 0.7) # should return this: # ERROR: cannot change gamma in a tree edge ``` diff --git a/docs/src/man/multiplealleles.md b/docs/src/man/multiplealleles.md deleted file mode 100644 index 9c8dfee5a..000000000 --- a/docs/src/man/multiplealleles.md +++ /dev/null @@ -1,147 +0,0 @@ -```@setup multialleles -using PhyloNetworks -``` - -# Multiple alleles per species - -## between-species 4-taxon sets - -The default setting for SNaQ considers that each allele in a gene tree corresponds -to a taxon (a tip) in the network. If instead each allele/individual can be mapped confidently -to a species, and if only the species-level network needs to be estimated, -then the following functions can be used: - -```@repl multialleles -using CSV, DataFrames -mappingfile = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","mappingIndividuals.csv"); -tm = CSV.read(mappingfile, DataFrame) # taxon map as a data frame -taxonmap = Dict(row[:individual] => row[:species] for row in eachrow(tm)) # taxon map as a dictionary -``` - -The [mapping file](https://github.com/juliaphylo/PhyloNetworks/blob/master/examples/mappingIndividuals.csv) -can be a text (or `csv`) file with two columns (at least): -one for the individuals, named `allele` or `individual`, -and one column containing the species names, named `species`. -Each row should map an allele name to a species name. -Next, read in the [gene trees](https://github.com/juliaphylo/PhyloNetworks/blob/master/examples/genetrees_alleletips.tre) -and calculate the quartet CFs at the species level: - - -```@repl multialleles -genetreefile = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","genetrees_alleletips.tre"); -genetrees = readMultiTopology(genetreefile); -sort(tipLabels(genetrees[1])) # multiple tips in species S1 -df_sp = writeTableCF(countquartetsintrees(genetrees, taxonmap, showprogressbar=false)...) -``` - -Now `df_sp` is a data frame containing the quartet concordance factors -at the species level only, that is, considering sets made of 4 distinct species, -even if the gene trees may have multiple alleles from the same species. -For 4 distinct species `A,B,C,D`, all alleles from each species (`A` etc.) -will be used to calculate the quartet CF. If a given gene tree has -`n_a` alleles from `a`, `n_b` alleles from `b` etc., then -each set of 4 alleles is given a weight of `1/(n_a n_b n_c n_d)` -to calculated of the CF for `A,B,C,D` (such that the total weight from -this particular gene trees is 1). -It is safe to save this data frame, then use it for `snaq!` like this: - -```@repl multialleles -CSV.write("tableCF_species.csv", df_sp); # to save the data frame to a file -d_sp = readTableCF("tableCF_species.csv"); # to get a "DataCF" object for use in snaq! -summarizeDataCF(d_sp) -``` - -## within-species 4-taxon sets - -Four-taxon sets involving 2 individuals per species can provide more -information about the underlying network, including external branch -length in coalescent units. However, `snaq!` runs more slowly when -using this extra information. To get quartet CFs from sets of 4 individuals -in which 2 individuals are from the same species, the following functions -should be used: - -```@repl multialleles -df_ind = writeTableCF(countquartetsintrees(genetrees, showprogressbar=false)...); # no mapping: CFs across individuals -first(df_ind, 4) # to see the first 4 rows -CSV.write("tableCF_individuals.csv", df_ind); # to save to a file -df_sp = mapAllelesCFtable(mappingfile, "tableCF_individuals.csv"); -d_sp = readTableCF!(df_sp, mergerows=true); -``` -where the mapping file can be a text (or `csv`) file with two columns -named `allele` (or `individual`) and `species`, mapping each allele name to a species name. -The data in `df_ind` is the table of concordance factors at the level of individuals. -In other words, it lists CFs using one row for each set of 4 alleles/individuals. - -`mapAllelesCFtable` creates a new data frame `df_sp` of quartet concordance factors at the -species level: with the allele names replaced by the appropriate species names. - -**Warnings**: -- This procedure requires that all alleles from the same - individual are given the same name (the individual's 'name') across - all genes for which that individual was sequenced. -- For a four-taxon set `A,B,C,D`, all the individuals from `A`, `B`, `C` and `D` - are considered, say `(a1,b1,c1,d1)`, `(a2,b1,c1,d1)`, `(a1,b2,c1,d1)`, `(a2,b2,c1,d1)` - and so on. The CFs of these 4-taxon sets are averaged together to obtain the - CFs at the species level. This procedures gives more weight to genes that have - many alleles (because they contribute to more sets of 4 individuals) and less - weight to genes that have few alleles. - -The last command modifies this data frame `df_sp` by deleting rows that are uninformative -about between-species relationships, such as rows corresponding to 4 individuals from the -same species. The output `d_sp` of this second command is an object of type `DataCF` at the -species level, which can be used as input for networks estimation with `snaq!`. -But before, it is safe to save the concordance factor of quartets of species, -which can be calculated by averaging the CFs of quartets of individuals -from the associated species: - -```@repl multialleles -df_sp = writeTableCF(d_sp) # data frame, quartet CFs averaged across individuals of same species -CSV.write("CFtable_species.csv", df_sp); # save to file -``` - -Some quartets have the same species repeated twice, -representing cases when 2 of the 4 individuals came from the same species. -These quartets, with repeated species, are informative about the population -size of extant populations, i.e. about the lengths of external branches in -coalescent units. - -The main difference between this section compared to the previous section -("between-species 4-taxon sets") is that quartets with 2 individuals from -the same species are included here, such as `a1,a2,b1,c1`. -Also, the weighting of quartets is different. Here, genes with more alleles -are given more weight. - -now we can run snaq: - -```julia -net = snaq!(T_sp, d_sp); -``` -where `T_sp` should be a starting topology with one tip per species, -labelled with the same species names as the names used in the mapping file. - -If `snaq!` takes too long that way, we can try a less ambitious estimation -that does not estimate the external branch lengths, that is, -*without* using quartets that have 2 individuals from the same species. -To do so, we can use the quartet concordance factors at the species level, -but filter out the quartets with one (or more) species repeated. -This can be done as in the first section ("between-species 4-taxon sets") -to give equal weight to all genes, -or as shown below to give more weight to genes that have more alleles: - -```@repl multialleles -first(df_sp, 3) # some quartets have the same species twice -function hasrep(row) # see if a row (4-taxon set) has a species name ending with "__2": repeated species - occursin(r"__2$", row[:t1]) || occursin(r"__2$", row[:t2]) || # replace :t1 :t2 etc. by appropriate column names in your data, - occursin(r"__2$", row[:t3]) || occursin(r"__2$", row[:t4]) # e.g. by :taxon1 :taxon2 etc. -end -df_sp_reduced = filter(!hasrep, df_sp) # removes rows with repeated species -CSV.write("CFtable_species_norep.csv", df_sp_reduced); # to save to file -d_sp_reduced = readTableCF(df_sp_reduced) # DataCF object, for input to snaq! -``` - -and now we can run `snaq!` on the reduced set of quartets without repeats, -which should be faster: - -```julia -net = snaq!(T_sp, d_sp_reduced); -``` diff --git a/docs/src/man/net_plot.md b/docs/src/man/net_plot.md new file mode 100644 index 000000000..3e9bf8f9d --- /dev/null +++ b/docs/src/man/net_plot.md @@ -0,0 +1,163 @@ +```@setup snaqplot +using PhyloNetworks +mkpath("../assets/figures") +net1 = readnewick(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net1.out")) +rotate!(net1, -6) +``` +# Network Visualization + +To visualize a network, we can use the companion package +[PhyloPlots](https://github.com/juliaphylo/PhyloPlots.jl). +Its [manual](https://juliaphylo.github.io/PhyloPlots.jl/dev/) has more examples, +beyond the basic examples provided here. + +## text parenthetical format: extended newick + +To get started, we load a few networks that we will later visualize. +They are available in files that come with the package. + +```@example snaqplot +net2 = readnewick(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net2.out")) +net3 = readnewick(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net3.out")) +``` + +These networks are stored in extended newick parenthetical format, +widely used by various software packages. +This format encodes the network's topology, edge lengths, and +edge inheritance γ for hybrid edges. +These γ values measure the proportion of genes inherited via each parent at a +reticulation event. +- A hybrid edge with γ=0.804 means that its child node (a hybrid or admixed + population) received 80.4% of its genetic material from that edge. +- The other parent hybrid edge of this hybrid population should have γ=0.196. + If the event was introgression, then this means that 19.6% of genetic material + was inherited by gene flow. + Generally, the γ values of all partners contributing to a given + admixed population sum up to 100%. + +Let's see this newick format, printed to the screen or written to a file: +```@repl snaqplot +net1 +writenewick(net2) # writes to screen, full precision for branch lengths and γ +writenewick(net2, round=true, digits=2) +writenewick(net2, di=true) # γ omitted: for dendroscope +writenewick(net2, "mynetwork_net2.tre") # writes to file: creates or overwrites file +rm("mynetwork_net2.tre") # hide +``` +The option `di=true` is for the parenthetical format used by +[Dendroscope](https://software-ab.cs.uni-tuebingen.de/download/dendroscope/manual.pdf) +(without reticulation heritabilities). +Copy this parenthetical description and paste it into Dendroscope, +or use the plotting function described below. + +## visualize the network topology and γ inheritance + +The newick format is great for computers, but not quite for human eyes. +Are our 2 networks similar? Below, we plot them side-by-side, using +extra commands that use the [RCall](https://github.com/JuliaInterop/RCall.jl) +package (more on that later). + +The key command here is `plot`, with option `showgamma=true` to plot γ values +below each hybrid edge. + +```@example snaqplot +using PhyloPlots +using RCall # to be able to tweak our plot within R +R"name <- function(x) file.path('..', 'assets', 'figures', x)" # hide +R"svg(name('snaqplot_net23.svg'), width=7, height=3)" # hide +R"layout(matrix(1:2, 1, 2))" # to get 2 plots into a single figure: 1 row, 2 columns +R"par"(mar=[0,0,1,0]) # for smaller margins +plot(net2, showgamma=true); +R"mtext"("hmax=2") # add text annotation: title here +plot(net3, showgamma=true); +R"mtext"("hmax=3") +R"dev.off()"; # hide +nothing # hide +``` +![net23](../assets/figures/snaqplot_net23.svg) + +Both networks have a single reticulation. +In both, A is of hybrid origin, 80.4% sister to B, +and 19.6% sister to E (which is otherwise sister to O). +C & D are sister to each other, if we were to re-root the networks +along the edge tha leads to ABEO. + +So, these 2 networks appear identical. Are they really? To be sure, we can +calculate the hardwired-cluster distance between them, which extends the +Robinson-Foulds distance on trees. +See [Comparing and manipulating networks](@ref) for more on this dissimilarity. + +```@repl snaqplot +hardwiredclusterdistance(net2, net3, false) # rooted=false: to consider net2 and net3 as semidirected +``` + +Indeed, these networks have the same semidirected topology. + +## saving the plot + +In the example below, julia creates and sends the plot to R +via [RCall](https://github.com/JuliaInterop/RCall.jl), +so we can tweak the plot in various ways via commands sent to R. +To save the plot in a file: we first tell R to create an image file, +then we send the plot of the network, +then we tell R to wrap up and save its image file. + +```@example snaqplot +using PhyloPlots # to visualize networks +using RCall # to send additional commands to R like this: R"..." +imagefilename = "../assets/figures/snaqplot_net1_2.svg" +R"svg"(imagefilename, width=4, height=3) # starts image file +R"par"(mar=[0,0,0,0]) # to reduce margins (no margins at all here) +plot(net1, showgamma=true, showedgenumber=true); # network is plotted & sent to file +R"dev.off()"; # wrap up and save image file +nothing # hide +``` +![net1_2](../assets/figures/snaqplot_net1_2.svg) + +The plot function has many options, to annotate nodes and edges. In the +example above, hybrid edges were annotated with their γ inheritance values +(in blue: light blue for the minor edge with γ<0.5, and dark blue for the +major edge with γ>0.5), and edges were annotated with their internal numbers. + +We also used the option `showedgenumber=true` to see the edge numbers used +internally. They is sometimes useful to re-root the network on some particular +edge, for example. + +## styles and options + +To see the list of all options, type `?` to switch to the help mode +of Julia, then type the name of the function, here `plot`. + +Below are two visualizations. +The first uses the default style (`:fulltree`) and modified edge colors. +The second uses the `:majortree` style. +That style doesn't have an arrow by default for minor hybrid edges, +but we can ask for one by specifying a positive arrow length. +```@example snaqplot +R"svg(name('snaqplot_net1_3.svg'), width=7, height=3)" # hide +R"par"(mar=[0,0,0,0]) # hide +R"layout(matrix(1:2,1,2))"; +plot(net1, showedgelength=true, minorhybridedgecolor="tan"); +plot(net1, style=:majortree, arrowlen=0.07); +R"dev.off()"; # hide +nothing # hide +``` +![net1_3](../assets/figures/snaqplot_net1_3.svg) + +Edge lengths are shown, too. They were estimated in coalescent units: +number of generations / effective population size. +Some edge lengths are not identifiable, hence missing. + +Below is another example, where space was added between the network and +the taxon names via the `tipoffset` option. +Also, edge colors were changed, and the nodes numbers are shown (used internally) + +```@example snaqplot +R"svg(name('snaqplot_net1_4.svg'), width=4, height=3)" # hide +R"par"(mar=[0,0,0,0]) # hide +plot(net1, tipoffset=0.5, shownodenumber=true, edgecolor="tomato4", + minorhybridedgecolor="skyblue", majorhybridedgecolor="tan"); +R"dev.off()"; # hide +nothing # hide +``` +![net1_4](../assets/figures/snaqplot_net1_4.svg) diff --git a/docs/src/man/netmanipulation.md b/docs/src/man/netmanipulation.md index 8451c82b4..9194028ea 100644 --- a/docs/src/man/netmanipulation.md +++ b/docs/src/man/netmanipulation.md @@ -1,53 +1,133 @@ +```@setup network_getters +using PhyloNetworks +``` + # Network manipulation -The package contains a good number of utilities to manipulate phylogenetic -networks. Functions that are not exported are more likely to experience +The package contains many utilities to extract information about phylogenetic networks, and to modify networks. +Functions that are not exported are more likely to experience breaking changes in future versions, but can be used by prefixing their -name with `PhyloNetworks.`. +name with `PhyloNetworks.` . -Here is a list of the most useful functions that can handle networks of any level. +Below is a list of the most useful functions. They typically assume a bicombining network, that is, a network in which each hybrid node has exactly 2 parents (never more). -To traverse or learn something about a network, node or edge, see for example: -- [`tipLabels`](@ref), - [`PhyloNetworks.descendants`](@ref) for the clade ("hardwired cluster") below an edge, - [`PhyloNetworks.isdescendant`](@ref), - [`PhyloNetworks.isconnected`](@ref) -- [`displayedTrees`](@ref), [`majorTree`](@ref), - [`biconnectedComponents`](@ref), [`PhyloNetworks.blobInfo`](@ref) -- [`hardwiredCluster`](@ref), [`hardwiredClusters`](@ref) -- [`getroot`](@ref), [`isrootof`](@ref), - [`isleaf`](@ref PhyloNetworks.isrootof), [`isexternal`](@ref PhyloNetworks.isrootof), - [`isparentof`](@ref), [`ischildof`](@ref PhyloNetworks.isparentof), - [`hassinglechild`](@ref), -- [`getchild`](@ref), [`getchildren`](@ref PhyloNetworks.getchild), - [`getchildedge`](@ref PhyloNetworks.getchild) - [`getparent`](@ref), [`getparents`](@ref PhyloNetworks.getparent), - [`getparentminor`](@ref PhyloNetworks.getparent), - [`getparentedge`](@ref PhyloNetworks.getparent), - [`getparentedgeminor`](@ref PhyloNetworks.getparent), - [`getpartneredge`](@ref) - -To modify a network, for example: +## Getting information on a network + +### overall network information + +- [`tiplabels`](@ref) for taxon labels +- [`getroot`](@ref) gives the root node +- [`pairwisetaxondistancematrix`](@ref) for *average* distances +- [`vcv`](@ref) for the variance-covariance matrix between taxa under a + Brownian Motion model along the network, and [`sharedpathmatrix`](@ref) + for the variance-covariance between all nodes (not just leaves) +- [`istimeconsistent`](@ref): `true` or `false`, to know if for all nodes, + the various paths from the root to that node have the same length + (as expected if length was proportional to time) +- [`getnodeages`](@ref) assuming the network is time-consistent and ultrametric +- [`displayedtrees`](@ref) or [`majortree`](@ref) to get the displayed trees + or major tree, respectively +- [`hardwiredclusters`](@ref) to get all clusters of taxa on a network +- [`biconnectedcomponents`](@ref) and [`PhyloNetworks.blobinfo`](@ref) + give information about the blobs found within a network; + also + [`PhyloNetworks.biconnectedcomponent_entrynodes`](@ref), + [`PhyloNetworks.biconnectedcomponent_exitnodes`](@ref), + and [`blobdecomposition`](@ref) +- [`treeedgecomponents`](@ref) are the components after removing hybrid edges +- [`checkroot!`](@ref) to check that the graph is a valid semidirected + network with a root node in a admissible rooting position + +The following functions all compute distances from the root to each node. +Their differ in how they handle time inconsistency: when the distance from +the root to a node varies across multiple paths from the root to that node. +- [`getnodeheights`](@ref) +- [`getnodeheights_average`](@ref) +- [`getnodeheights_majortree`](@ref) + +### node information + +To learn about nodes and how some might be related or connected, one can use: + +- [`PhyloNetworks.isdescendant`](@ref) and [`PhyloNetworks.isconnected`](@ref) + can be used to learn about the relationship between two nodes +- [`hassinglechild`](@ref) +- [`getparent`](@ref) or [`getparents`](@ref PhyloNetworks.getparent) if the + node is a hybrid +- [`getparentminor`](@ref PhyloNetworks.getparent) +- [`getchild`](@ref) or [`getchildren`](@ref PhyloNetworks.getchild) if the + node has more than one child +- [`isrootof`](@ref) + +To learn about the edges connected to a given node, one can use: +- [`getchildedge`](@ref PhyloNetworks.getchild) +- [`PhyloNetworks.getconnectingedge`](@ref) +- [`getparentedge`](@ref PhyloNetworks.getparent) +- [`getparentedgeminor`](@ref PhyloNetworks.getparent) for a hybrid node + +### edge information + +To learn about the nodes related connected to a given edge, one can use the following functions: + +- [`PhyloNetworks.descendants`](@ref) for the clade ("hardwired cluster") below an edge +- [`getparent`](@ref) +- [`getchild`](@ref) +- [`getpartneredge`](@ref) gives the hybrid partner of an edge, + if it is the parent edge of a hybrid node. +- [`isparentof`](@ref), [`ischildof`](@ref PhyloNetworks.isparentof) can + inform whether an edge and node are connected +- [`hardwiredcluster`](@ref) to get the cluster of taxa below a particular edge + +## Modifying a network + +To modify some of the core components of a network: + - [`rootonedge!`](@ref), [`rootatnode!`](@ref): very useful to root with an outgroup, and [`rotate!`](@ref) to improve plots -- [`deleteleaf!`](@ref), - [`deleteaboveLSA!`](@ref) (the "least stable ancestor" may be different from the root) -- [`deleteHybridThreshold!`](@ref) to simplify a network by deleting edges with small γ's -- [`removedegree2nodes!`](@ref), [`shrink3cycles!`](@ref), [`shrink2cycles!`](@ref), - [`PhyloNetworks.shrinkedge!`](@ref) -- [`PhyloNetworks.addleaf!`](@ref), - [`PhyloNetworks.deletehybridedge!`](@ref), - [`PhyloNetworks.addhybridedge!`](@ref) -- [`nni!`](@ref) (nearest neighbor interchange), - [`PhyloNetworks.fliphybrid!`](@ref) to flip the direction of a hybrid edge +- [`nni!`](@ref) to perform a semidirected nearest neighbor interchange +- [`PhyloNetworks.fliphybrid!`](@ref) to flip the direction of a hybrid edge - [`PhyloNetworks.unzip_canonical!`](@ref) to "unzip" (or zip down) all reticulations, or [`PhyloNetworks.rezip_canonical!`](@ref) to undo. +- [`setlength!`](@ref) and [`setlengths!`](@ref) to change the length of one + or more edges, + and [`setgamma!`](@ref) to change a hybrid edge inheritance γ + +To remove components from a network: + +- [`deleteleaf!`](@ref) +- [`deleteaboveLSA!`](@ref): the "least stable ancestor" may be different + from the root +- [`deletehybridthreshold!`](@ref) to simplify a network by deleting edges with small γ's +- [`PhyloNetworks.shrinkedge!`](@ref) to contract an edge +- [`removedegree2nodes!`](@ref) to suppress degree-2 nodes +- [`shrink3cycles!`](@ref) and [`shrink2cycles!`](@ref) to contract "cycles" + of 2 or 3 edges, which deletes 1 reticulation +- [`PhyloNetworks.deletehybridedge!`](@ref) to remove one hybrid edge. + +To add components to a network: + +- [`PhyloNetworks.addleaf!`](@ref) +- [`PhyloNetworks.addhybridedge!`](@ref) + +To modify some internal attributes, that don't affect the network topology +or edge parameters: + +- [`nameinternalnodes!`](@ref) +- [`PhyloNetworks.resetnodenumbers!`](@ref) and + [`PhyloNetworks.resetedgenumbers!`](@ref) + +To calibrate a network (modify its edge lengths): + +- [`calibratefrompairwisedistances!`](@ref). This documentation has little + about calibration so far, but see this + [tutorial](https://cecileane.github.io/networkPCM-workshop/topic1-netcalibration.html) + +## Comparing two networks -To compare networks or compare nodes in a network, for example: -- [`hardwiredClusterDistance`](@ref): extends the Robinson-Foulds distance, - it's a dissimilarity measure on networks -- [`pairwiseTaxonDistanceMatrix`](@ref) for *average* distances, - [`getNodeAges`](@ref) if ultrametric network, - [`PhyloNetworks.getHeights`](@ref), [`vcv`](@ref) +- [`hardwiredclusterdistance`](@ref): extends the Robinson-Foulds distance. + It's a dissimilarity measure on networks: a dissimilarity of 0 does not + guarantee that the 2 networks have the same topology in general. + But it does if the networks are in some classes (e.g. trees, level-1, + tree-child, and others). diff --git a/docs/src/man/bootstrap.md b/docs/src/man/network_support.md similarity index 57% rename from docs/src/man/bootstrap.md rename to docs/src/man/network_support.md index 6f6f1eb2b..8278612e5 100644 --- a/docs/src/man/bootstrap.md +++ b/docs/src/man/network_support.md @@ -2,75 +2,50 @@ using PhyloNetworks mkpath("../assets/figures") ``` -# Bootstrap +# Network support -## Running a bootstrap analysis +We show here how to summarize a sample of networks. This may be used to +get bootstrap support or posterior probabilities for network features, +if the sample of networks comes from a bootstrap analysis +(as possible with [SNaQ](https://juliaphylo.github.io/SNaQ.jl/stable/man/bootstrap/#Bootstrap)) +or if it's a posterior sample of networks from a Bayesian analysis. -There are two ways to do a bootstrap analysis. - -- From quartet CFs with credibility intervals, such as if we used BUCKy. The [TICR pipeline](@ref) outputs a CF table with extra columns for credibility intervals. We could then read that table and get bootstrap networks like this, and tweak options as needed: -```julia -using DataFrames, CSV -df = DataFrame(CSV.File("tableCF_withCI.csv"); copycols = false) -bootnet = bootsnaq(startnetwork, df, hmax=1, filename="bootstrap") -``` - -- Alternatively, we can use bootstrap gene trees: one file of bootstrap trees per gene. Here, the input is a text file that lists all the bootstrap files (one per gene). We demonstrate this option here. - -The names of all our bootstrap files are listed in "BSlistfiles". -(ASTRAL can use the same file to do its own bootstrap, see the -[wiki](https://github.com/juliaphylo/PhyloNetworks.jl/wiki/Gene-Trees:-RAxML) -for more details). -The function `readBootstrapTrees` can read this list of file names, then -read each bootstrap file to get the bootstrap sample for each gene. -We can use them to sample input gene trees at random, one per gene, -and estimate a network from them. We ask the `bootsnaq` function -to repeat this resampling of bootstrap gene trees several times. - -```julia -bootTrees = readBootstrapTrees("BSlistfiles"); -bootnet = bootsnaq(net0, bootTrees, hmax=1, nrep=10, runs=3, - filename="bootsnaq", seed=4321) -``` - -The bootstrap networks are saved in the `boostrap.out` file, so they -can be read in a new session with -`bootnet = readMultiTopology("bootsnaq.out")`. To save the bootstrap networks to -a different file (perhaps after having re-rooted them with an -outgroup), we could do this: `writeMultiTopology(bootnet, "bootstrapNets.tre")`. - -The example above asks for 10 bootstrap replicates, -which is definitely too few, to make the example run faster. -We might also increase the number of optimization runs (`runs`) -done for each bootstrap replicate. This bootstrap was run with the -default 10 runs per replicate, and 100 bootstrap replicates, -and the 100 bootstrap networks come with the package: +To demonstrate summarizing a sample of networks, we use here a sample of +100 networks, obtained by running 100 bootstrap replicates of SNaQ. +The file containing the 100 networks comes with the package: ```@example bootstrap -bootnet = readMultiTopology(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","bootsnaq.out")); +bootnet = readmultinewick(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","bootsnaq.out")); length(bootnet) ``` -If we used a specified list of quartets on the original data, we -should use that same list for the bootstrap analysis through the -option `quartetfile`. +We seek to summarize what these 100 networks have in common +(highly supported features) and what they don't (areas of uncertainty). +Unlike for trees, there are a variety of features that we may summarize in +a network. Below we show how to calculate support for *tree edges*, +for a clade to be of *hybrid origin*, or for a clade to be *sister* +to a hybrid clade, or combinations. -## support for tree edges +We also assume that we have a reference network, such as the best-fitting +network on the original (non-bootstrapped) data, or some other "consensus" +network. We focus on features (tree edges and clades) in this reference network +and quantify the support for these features in the sample of networks. -Now that we have 100 bootstrap networks, we need to summarize -what they have in common (highly supported features) and what they -don't (areas of uncertainty). +## support for tree edges -Before summarizing these bootstrap networks on the best network, +To summarize our sample of 100 networks on our reference network, it is best to re-read this network to get a reproducible internal numbering -of its nodes and edges, used later for mapping bootstrap support to edges. +of its nodes and edges, used later for mapping support to edges. +As our reference network, we use here a network with 1 reticulation +(best-fitting network on the original data): + ```@example bootstrap -net1 = readTopology(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net1.out")) +net1 = readnewick(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net1.out")) ``` It turns out that the direction of gene flow is quite uncertain in this example (see below) with a wrong direction inferred sometimes, -so we re-root our best network net1 to the base of O,E, for the figures +so we re-root our reference network `net1` to the base of O,E, for the figures to be less confusing later. ```@setup bootstrap @@ -107,12 +82,12 @@ nothing # hide ``` ![net1_rotate2](../assets/figures/net1_rotate2.svg) -We can now summarize our bootstrap networks. -The functions `treeEdgesBootstrap` and `hybridBootstrapSupport` -read all bootstrap networks and map the edges / nodes -onto a reference network: here net1. +We can now summarize our sample of networks. +The functions `treeedges_support` and `hybridclades_support` +read all networks in the sample and map the edges / nodes +onto a reference network, here `net1`. ```@example bootstrap -BSe_tree, tree1 = treeEdgesBootstrap(bootnet,net1); +BSe_tree, tree1 = treeedges_support(bootnet,net1); ``` This calculates the major tree `tree1` displayed in `net1`, that is, the tree obtained by following the major parent (γ>0.5) of each hybrid node. @@ -126,20 +101,22 @@ nothing # hide ``` ![major_tree](../assets/figures/major_tree.svg) -Next, we can look at bootstrap table `BSe_tree`, which has one row for +Next, we can look at the support table `BSe_tree`, which has one row for each tree edge in `net1`. One column contains the edge number (same as shown in the plot) and another column contains the edge -bootstrap support: the proportion of bootstrap replicates in which this edge was -found in the major tree of the inferred network. -We can see the full bootstrap table and see -which tree edges have bootstrap support lower than 100% (none here) with +(bootstrap) support: the proportion of sample networks +in which this edge was +found in the major tree of that network. +We can see the full support table and see +which tree edges have support lower than 100% (none here) with ```@repl bootstrap using DataFrames # for showall() below show(BSe_tree, allrows=true, allcols=true) filter(row -> row[:proportion] < 100, BSe_tree) ``` -Finally, we can map the bootstrap proportions onto the network or its main tree -by passing the bootstrap table to the `edgelabel` option of `plot`: +Finally, we can map the support values onto the reference network +or its main tree +by passing the support table to the `edgelabel` option of `plot`: ```@example bootstrap R"svg(name('boot_tree_net_1.svg'), width=4, height=4)" # hide R"par"(mar=[0,0,0,0]) # hide @@ -159,31 +136,37 @@ table --those in `net1` at the time-- correspond to the current edge numbers in `tree1` and `net1`. That was the purpose of reading the network from the output file of `snaq!` earlier, for consistency across different Julia sessions.) -If we wanted to plot only certain bootstrap values, like those below 100% (1.0), +If we wanted to plot only certain support values, like those below 100% (1.0), we could do this: ```julia plot(net1, edgelabel=filter(row -> row[:proportion] < 100, BSe_tree)); ``` -## support for hybrid edges and hybrid nodes +## support for hybrid edges Summarizing the placement of reticulations is not standard. -The function `hybridBootstrapSupport` attempts to do so. -The descendants of a given hybrid node form the "recipient" or "hybrid" clade, -and is obtained after removing all other reticulations. -If reticulation is due to gene flow or introgression, the minor hybrid edge (with γ<0.5) -represents this event. The descendants of the lineage from which gene flow originated -is then a second "sister" of the hybrid clade. Because of the reticulation event, -the hybrid clade has 2 sister clades, not 1: the major sister (through the major hybrid edge -with γ>0.5) and the minor sister (through the minor hybrid edge with γ<0.5). +The function `hybridclades_support` attempts to do so. + +- The descendants of a given hybrid node form the "recipient" or **"hybrid" clade**, + and is obtained *after removing all other reticulations*. +- To remove the reticulations other than one of interest, + their minor hybrid parent edge (with γ<0.5) is removed. + If a reticulation is due to introgression, + this minor edge may be interpreted as the "gene flow" edge. +- The descendants of the lineage from which gene flow originated + is then a second "sister" of the hybrid clade. + Because of the reticulation event, the hybrid clade has 2 **sister clades**, + not 1: the major sister (through the major hybrid edge with γ>0.5) and + the minor sister (through the minor hybrid edge with γ<0.5). + Note that the network says *nothing* about the process: its shows the *relationships* only. We can calculate the frequency that each clade is a hybrid clade, or a major or minor sister -for some other hybrid, in the bootstrap networks: +for some other hybrid, in the sample of networks: ```@example bootstrap -BSn, BSe, BSc, BSgam, BSedgenum = hybridBootstrapSupport(bootnet, net1); +BSn, BSe, BSc, BSgam, BSedgenum = hybridclades_support(bootnet, net1); ``` Let's look at the results. -We can list all the clades and the percentage of bootstrap networks (bootstrap support) +We can list all the clades and the percentage of sample networks (support) in which each clade is a hybrid or sister to a hybrid: ```@repl bootstrap BSn @@ -193,11 +176,11 @@ The clade found in the best network is listed with its tag, starting with H (e.g The name of other clades start with "c_" followed by their number in the best network, if they do appear in the best network. The node numbers, as used internally in the best network, are listed in a separate column. -They can be used later to display the bootstrap support values onto the network. -Various columns give the bootstrap support that each clade is a hybrid, or a (major/minor) sister -to a hybrid. The last column gives the bootstrap support for the full relationship in the +They can be used later to display the support values onto the network. +Various columns give the support that each clade is a hybrid, or a (major/minor) sister +to a hybrid. The last column gives the support for the full relationship in the best network: same hybrid with same two sisters. -These bootstrap values are associated with nodes (or possibly, their parent edges). +These support values are associated with nodes (or possibly, their parent edges). To see what is the clade named "H7", for instance: ```@repl bootstrap @@ -206,14 +189,14 @@ show(BSc, allrows=true, allcols=true) # BSc[BSc[!,:H7], :taxa] # just a different syntax to subset the data in the same way filter(row -> row[:H7], BSc).taxa ``` -We can also get bootstrap values associated with edges, to describe the support that a given +We can also get support values associated with edges, to describe the support that a given hybrid clade has a given sister clade. ```@repl bootstrap BSe ``` Here, each row describes a pair of 2 clades: one being the hybrid, the other being its sister, connected by a hybrid edge. The first rows corresponds to hybrid edges in the best network. Other -rows correspond to edges seen in bootstrap networks but not in the reference network. +rows correspond to edges seen in the sample of networks but not in the reference network. ```@repl bootstrap BSedgenum ``` @@ -221,7 +204,7 @@ lists all the hybrid edges in the best network, two for each hybrid node: the major parent edge and then the minor parent edge. In our case, there is only one reticulation, so only 2 hybrid edges. -We can plot the bootstrap values of the 2 hybrid edges in the best network: +We can plot the support values of the 2 hybrid edges in the best network: ```@example bootstrap R"svg(name('boot_net_net.svg'), width=4, height=4)" # hide R"par"(mar=[0,0,0,0]) # hide @@ -231,12 +214,14 @@ nothing # hide ``` ![boot_net_net](../assets/figures/boot_net_net.svg) -This is showing the bootstrap support each hybrid edge: percentage of bootstrap trees with an +This is showing the support for each hybrid edge: the percentage of networks +in the sample, with an edge from the same sister clade to the same hybrid clade. -Alternatively, we could show the bootstrap support for the full reticulation relationships in +Alternatively, we could show the support for the full reticulation relationships in the network, one at each hybrid node (support for same hybrid with same sister clades). Here, we find that A received gene flow from E (and is sister to B otherwise) in just 32% -of bootstrap networks. In another 1% bootstrap, A received gene flow from another source. +of sampled networks. +In another 1% of sampled networks, A received gene flow from another source. ```@example bootstrap R"svg(name('boot_net_ret.svg'), width=4, height=4)" # hide R"par"(mar=[0,0,0,0]) # hide @@ -258,12 +243,12 @@ tmp = vcat(BSe_tree, tmp) plot(net1, edgelabel=tmp, nodelabel=BSn[:, [:hybridnode,:BS_hybrid_samesisters]]) ``` -### Who are the hybrids in bootstrap networks? +## support for hybrid clades -On a different plot, we can show the bootstrap support for hybrid clades, +On a different plot, we can show the support for hybrid clades, first mapped to each node with positive hybrid support, and then mapped on the parent edge of these nodes. -A is estimated as a hybrid in only 33% of our bootstrap networks. +A is estimated as a hybrid in only 33% of our sampled networks. In another 44%, it is the lineage to (E,O) that is estimated as being of hybrid origin. ```@example bootstrap @@ -281,7 +266,7 @@ nothing # hide ![boot_net_hyb 1](../assets/figures/boot_net_hyb_1.svg) ![boot_net_hyb 2](../assets/figures/boot_net_hyb_2.svg) -### Where is the origin of gene flow? +## support for the origin of gene flow We can plot the support for the various placements of the gene flow origin (minor sister clade), @@ -304,9 +289,10 @@ nothing # hide ![boot_net_clade 2](../assets/figures/boot_net_clade_2.svg) In our best network, the lineage to E is estimated as the origin -of gene flow, but this is recovered in only 41% of our bootstrap networks. -In another 49%, it is the lineage to A that is estimated as the *origin* -of gene flow: so gene flow is estimated in the opposite direction. +of gene flow, but this is recovered in only 41% of our sampled networks. +In another 49%, it is the lineage to A that is the *origin* of gene flow: +in these networks, gene flow is in the opposite direction compared to our +reference network. In this example, there is support for gene flow between (A,B) and (E,O), but there is much uncertainty about its exact placement and about its direction. @@ -315,12 +301,15 @@ Mapping the support for major sister clades might be interesting too: plot(net1, nodelabel=filter(r->r[:BS_major_sister]>5, BSn)[!,[:node,:BS_major_sister]]) ``` -The estimated heritability γ on hybrid edges in the reference network, when present in a -bootstrap network, was also extracted: +## summarizing heritabilities in a network sample + +For each hybrid edge in the reference network, +when present in a sampled network, +its heritability γ in the sampled network was also extracted: ```@repl bootstrap BSgam[1:3,:] # first 3 rows only ``` -γ=0 values are for bootstrap replicates that did not have the edge in their network. +γ=0 values are for sampled networks that did not have the edge. Basic summaries on γ values for a given edge, say the minor parent, could be obtained like this: ```@repl bootstrap diff --git a/docs/src/man/parsimony.md b/docs/src/man/parsimony.md index 008e40e60..7fdbf1f52 100644 --- a/docs/src/man/parsimony.md +++ b/docs/src/man/parsimony.md @@ -25,7 +25,7 @@ using PhyloNetworks mkpath("../assets/figures") using RCall R"name <- function(x) file.path('..', 'assets', 'figures', x)" -# net1 = readTopology(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","swadesh.out")) +# net1 = readnewick(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","swadesh.out")) # we would get net1 from analyzing the complete data, but not available with the package ``` @@ -46,7 +46,7 @@ converted to a list of vectors, with one vector for each species. An internal function is provided for this: ```@repl parsimony -species, traits = PhyloNetworks.readCSVtoArray(dat); +species, traits = PhyloNetworks.readcsvtoarray(dat); species traits ``` @@ -54,7 +54,7 @@ traits Then, we read the network as usual: ```@repl parsimony -net = readTopology("(Spanish,((English)#H1,(Norwegian,(German,#H1))));"); +net = readnewick("(Spanish,((English)#H1,(Norwegian,(German,#H1))));"); ``` ```@example parsimony @@ -70,32 +70,38 @@ nothing # hide There are different types of parsimony scores on networks. Currently, we have implemented the **softwired** criterion only, with two different functions: -[`parsimonySoftwired`](@ref) and +[`parsimonysoftwired`](@ref) and [`parsimonyGF`](@ref). -The function `parsimonySoftwired` uses a faster algorithm than +The function `parsimonysoftwired` uses a faster algorithm than `parsimonyGF`, but can solve the softwired criterion only. ```@repl parsimony -score = parsimonySoftwired(net, species, traits) +score = parsimonysoftwired(net, species, traits) score = parsimonyGF(net,species,traits,:softwired) ``` ## Finding the most parsimonious network -The function [`maxParsimonyNet`](@ref) searches for the most parsimonious -level-1 network. It uses the `parsimonyGF` function, with softwired criterion -as default, which will be extended to other criteria later. +!!! warning "feature to be re-implemented" + The search for the most parsimonious network is no longer available. + It will be re-implemented, and without the level-1 restriction. + Please use version 0.16 of PhyloNetworks to access this older functionality, + until a better one is made available. -Just like [`snaq!`](@ref), [`maxParsimonyNet`](@ref) requires a -starting topology, which can be a tree or a level-1 network, -and returns a level-1 network. +The function [`maxParsimonyNet`](@ref PhyloNetworks.maxParsimonyNet) searches +for the most parsimonious level-1 network. +It uses the `parsimonyGF` function, with softwired criterion +as default, which may be extended to other criteria later. + +`maxParsimonyNet` requires a starting topology, which can be a tree or a +level-1 network, and returns a level-1 network. Taxa present in the data but absent from the starting topology will be ignored during the search. ```julia -starttree = readTopology("(((English,German),Norwegian),Spanish);"); +starttree = readnewick("(((English,German),Norwegian),Spanish);"); net1 = maxParsimonyNet(starttree, dat, hmax=1, outgroup="Spanish", rootname="swadesh") ``` diff --git a/docs/src/man/snaq_plot.md b/docs/src/man/snaq_plot.md deleted file mode 100644 index e62d03e40..000000000 --- a/docs/src/man/snaq_plot.md +++ /dev/null @@ -1,389 +0,0 @@ -```@setup snaqplot -using PhyloNetworks -mkpath("../assets/figures") -raxmltrees = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","raxmltrees.tre") -raxmlCF = readTrees2CF(raxmltrees, writeTab=false, writeSummary=false) -astralfile = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","astral.tre") -astraltree = readMultiTopology(astralfile)[102] # 102th tree = last tree here -net0 = readTopology(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net0.out")) -net1 = readTopology(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net1.out")) -rotate!(net1, -6) -net2 = readTopology(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net2.out")) -net3 = readTopology(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","net3.out")) -net0.loglik = 53.53150526187732 -net1.loglik = 28.31506721890958 -net2.loglik = 28.31506721890957 -net3.loglik = 28.315067218909626 -``` -# Getting a Network - -## Network Estimation - -SNaQ implements the statistical inference method in -[Solís-Lemus & Ané 2016](http://journals.plos.org/plosgenetics/article?id=10.1371/journal.pgen.1005896). -The procedure involves a numerical optimization of branch lengths and inheritance -probabilities and a heuristic search in the space of phylogenetic networks. - -After [Input for SNaQ](@ref), we can estimate the network using the -input data `raxmlCF` and starting from tree (or network) `astraltree`. -We first impose the constraint of at most 0 hybrid node, -that is, we ask for a tree. -```julia -net0 = snaq!(astraltree,raxmlCF, hmax=0, filename="net0", seed=1234) -``` -Part of the screen output shows this: - - MaxNet is (C,D,((B,A):1.395762055180493,(O,E):0.48453400554506426):10.0); - with -loglik 53.53150526187732 - -This parenthetical (extended Newick) description is not very -human-friendly, so we plot the tree -(more about plotting networks below: [Network Visualization](@ref) ). - -```@example snaqplot -using PhyloPlots -using RCall # hide -R"name <- function(x) file.path('..', 'assets', 'figures', x)" # hide -R"svg(name('snaqplot_net0_1.svg'), width=4, height=3)" # hide -R"par"(mar=[0,0,0,0]) # hide -plot(net0); -R"dev.off()"; # hide -nothing # hide -``` -![net0_1](../assets/figures/snaqplot_net0_1.svg) - -We can use this tree as a starting point to search for the best -network allowing for at most `hmax=1` hybrid node (which is the default). -```julia -net1 = snaq!(net0, raxmlCF, hmax=1, filename="net1", seed=2345) -``` -part of screen output: - - best network and networks with different hybrid/gene flow directions printed to .networks file - MaxNet is (C,D,((O,(E,#H7:::0.19558838614943078):0.31352437658618976):0.6640664399202987,(B,(A)#H7:::0.8044116138505693):10.0):10.0); - with -loglik 28.31506721890958 - -We can visualize the estimated network and its inheritance values γ, which -measure the proportion of genes inherited via each parent at a reticulation event -(e.g. proportion of genes inherited via gene flow). -```@example snaqplot -R"svg(name('snaqplot_net1_1.svg'), width=4, height=3)"; # hide -R"par"(mar=[0,0,0,0]); # hide -plot(net1, showgamma=true); -R"dev.off()"; # hide -nothing # hide -``` -![net1_1](../assets/figures/snaqplot_net1_1.svg) - -This network has A as a hybrid, 80.4% sister to B, -and 19.6% sister to E (which is otherwise sister to O). -C & D are sister to each other. -We can also check the output files created by `snaq!`: -```julia -less("net1.err") # would provide info about errors, if any -less("net1.out") # main output file with the estimated network from each run -less("net1.networks") # extra info -``` -when viewing these result files with `less` -within Julia, use arrows to scroll down and type `q` to quit viewing the files. -The file `net1.networks` contains a list of networks that are slight modifications -of the best (estimated) network `net1`. The modifications changed the direction -of one reticulation at a time, by moving the placement of one hybrid node to another -node inside the same cycle. -For each modified network, the pseudolikelihood score was calculated -(the `loglik` or `-Ploglik` values give a pseudo deviance actually). - -The function name `snaq!` ends with ! because it modifies the argument `raxmlCF` -by including the expected CF. Type `?` then `snaq!` to get help on that function. - -The main output file, here `net1.out` (or `snaq.out` by default) has the estimated -network in parenthetical format, but we can also print it directly to the screen: -```@repl snaqplot -net1 -writeTopology(net1) # writes to screen, full precision for branch lengths and γ -writeTopology(net1, round=true, digits=2) -writeTopology(net1,di=true) # γ omitted: for dendroscope -writeTopology(net1, "bestnet_h1.tre") # writes to file: creates or overwrites file -rm("bestnet_h1.tre") # hide -``` -The option `di=true` is for the parenthetical format used by -[Dendroscope](http://dendroscope.org/) (without reticulation heritabilities). -Copy this parenthetical description and paste it into Dendroscope, -or use the plotting function described below. - -We can go on and let the network have up to 2 or 3 hybrid nodes: -```julia -net2 = snaq!(net1,raxmlCF, hmax=2, filename="net2", seed=3456) -net3 = snaq!(net0,raxmlCF, hmax=3, filename="net3", seed=4567) -``` -and plot them (they are identical and they both have a single reticulation): -```@example snaqplot -R"svg(name('snaqplot_net23.svg'), width=7, height=3)" # hide -using RCall # to be able to tweak our plot within R -R"layout(matrix(1:2, 1, 2))" # to get 2 plots into a single figure: 1 row, 2 columns -R"par"(mar=[0,0,1,0]) # for smaller margins -plot(net2, showgamma=true); -R"mtext"("hmax=2") # add text annotation: title here -plot(net3, showgamma=true); -R"mtext"("hmax=3") -R"dev.off()"; # hide -nothing # hide -``` -![net23](../assets/figures/snaqplot_net23.svg) - -with this screen output for net2 (only 1 hybrid node found): - - MaxNet is (C,D,((B,(A)#H7:::0.804411606649347):10.0,(O,(#H7:::0.19558839335065303,E):0.3135243143217013):0.664066456871298):10.0); - with -loglik 28.31506721890957 - -and this output for net3 (again, only 1 hybrid found): - - MaxNet is (D,C,((O,(E,#H7:::0.19558839257941849):0.3135243301652981):0.6640664138384673,(B,(A)#H7:::0.8044116074205815):10.0):10.0); - with -loglik 28.315067218909626 - -## parallel computations - -For network estimation, multiple runs can done in parallel. -For example, if your machine has 4 or more processors (or cores), -you can tell julia to use 4 processors by starting julia with `julia -p 4`, -or by starting julia the usual way (`julia`) and then adding processors with: - -```julia -using Distributed -addprocs(4) -``` - -If we load a package (`using PhyloNetworks`) before adding processors, -then we need to re-load it again so that all processors have access to it: - -```julia -@everywhere using PhyloNetworks -``` - -After that, running any of the `snaq!(...)` command will use -different cores for different runs, as processors become available. -Fewer details are printed to the log file when multiple cores -are used in parallel. - -When running `bootsnaq`, the analysis of each bootstrap replicate -will use multiple cores to parallelize separate runs of that particular -bootstrap replicate. You may parallelize things further by running -`bootsnaq` multiple times (on separate machines for instance), each time -for a small subset of bootstrap replicates, and with a different seed each time. - -We may tell julia to add more processors than our machine has, -but we will not receive any performance benefits. -At any time during the julia session, `nworkers()` tells us how many -worker processors julia has access to. - -Below is an example of how to use a cluster, to run many independent -`snaq!` searches in parallel on a cluster running the -[slurm](https://slurm.schedmd.com) job manager -(other managers would require a different, but similar submit file). -This example uses 2 files: -1. a julia script file, to do many runs of `snaq!` in parallel, - asking for many cores (default: 10 runs, asking for 10 cores). - This julia script can take arguments: the maximum allowed - number of hybridizations `hmax`, and the number of runs - (to run 50 runs instead of 10, say). -2. a submit file, to launch the julia script. - -**First**: the example julia script, below, is assumed (by the submit file) -to be called `runSNaQ.jl`. It uses a starting tree that -is assumed to be available in a file named `astraltree.tre`, but that -could be modified -(to use a network with h=1 to start the search with hmax=2 for instance). -It also assumes that the quartet concordance factor data are in file -`tableCF_speciesNames.csv`. Again, this file name should be adjusted. -To run this julia script for 50 runs and hmax=3, do `julia runSNaQ.jl 3 50`. - -```julia -#!/usr/bin/env julia - -# file "runSNaQ.jl". run in the shell like this in general: -# julia runSNaQ.jl hvalue nruns -# example for h=2 and default 10 runs: -# julia runSNaQ.jl 2 -# or example for h=3 and 50 runs: -# julia runSNaQ.jl 3 50 - -length(ARGS) > 0 || - error("need 1 or 2 arguments: # reticulations (h) and # runs (optional, 10 by default)") -h = parse(Int, ARGS[1]) -nruns = 10 -if length(ARGS) > 1 - nruns = parse(Int, ARGS[2]) -end -outputfile = string("net", h, "_", nruns, "runs") # example: "net2_10runs" -seed = 1234 + h # change as desired! Best to have it different for different h -@info "will run SNaQ with h=$h, # of runs=$nruns, seed=$seed, output will go to: $outputfile" - -using Distributed -addprocs(nruns) -@everywhere using PhyloNetworks -net0 = readTopology("astraltree.tre"); -using DataFrames, CSV -df_sp = DataFrame(CSV.File("tableCF_speciesNames.csv", pool=false); copycols=false); -d_sp = readTableCF!(df_sp); -net = snaq!(net0, d_sp, hmax=h, filename=outputfile, seed=seed, runs=nruns) -``` - -When julia is called on a script, whatever comes after "julia scriptname" -is given to julia in an array of values. This array is called `ARGS`. -So if we call a script like this: `julia runSNaQ.jl 2` -then the script will know the arguments through `ARGS`, -which would contain a single element, `"2"`. -This first element is just a string, at this stage. We want to use it as a number, -so we ask julia to parse the string into an integer. - -**Second**: we need a "submit" file to ask a job scheduler like -[slurm](https://slurm.schedmd.com) to submit our julia script to a cluster. -In the submit file below, the first 5 lines set things up for slurm. -They are most likely to be specific to your cluster. -The main idea here is to use a slurm "array" from 0 to 3, to run our -julia script multiple times, 4 times actually: from hmax=0 to hmax=3. -Each would do 30 runs -(and each would be allocated 30 cores in the submit script below). -Then log out of the cluster and go for coffee. - -```bash -#!/bin/bash -#SBATCH -o path/to/slurm/log/file/runsnaq_slurm%a.log -#SBATCH -J runsnaq -#SBATCH --array=0-3 -#SBATCH -c 30 -## --array: to run multiple instances of this script, -## one for each value in the array. -## 1 instance = 1 task -## -J job name -## -c number of cores (CPUs) per task - -echo "slurm task ID = $SLURM_ARRAY_TASK_ID used as hmax" -echo "start of SNaQ parallel runs on $(hostname)" -# finally: launch the julia script, using Julia executable appropriate for slurm, with full paths: -/workspace/software/bin/julia --history-file=no -- runSNaQ.jl $SLURM_ARRAY_TASK_ID 30 > net${SLURM_ARRAY_TASK_ID}_30runs.screenlog 2>&1 -echo "end of SNaQ run ..." -``` - -## choosing the number of hybridizations - -Each network has a `loglik` attribute, which is its pseudo deviance: -a multiple of the negative log-likelihood up to a constant (the constant is -such that the score is 0 if the network fits the data perfectly). -The lower the better. We can plot these scores across hybrid values: -```@example snaqplot -scores = [net0.loglik, net1.loglik, net2.loglik, net3.loglik] -hmax = collect(0:3) -R"svg(name('snaqplot_scores_heuristic.svg'), width=4, height=3)" # hide -R"par"(mar=[2.5,2.5,.5,.5], mgp=[1.4,.4,0], tck=-0.02, las=1, lab=[3,5,7]); # hide -R"plot"(hmax, scores, type="b", ylab="network score", xlab="hmax", col="blue"); -R"dev.off()"; # hide -nothing # hide -``` -![scores_heuristic](../assets/figures/snaqplot_scores_heuristic.svg) - -Here the slope heuristic suggests a single hybrid node: -the score does not get much better beyond h=1. - -We made the plot via R above. A more Julian way would use a Julia plotting -package such as [Gadfly](http://gadflyjl.org/stable/) or -[Plots](http://docs.juliaplots.org/latest/ecosystem/), like this for instance: -```julia -using Gadfly -plot(x=collect(0:3), y=scores, Geom.point, Geom.line) -``` -(btw, cool [blog](http://avt.im/blog/2018/03/23/R-packages-ggplot-in-julia) about using ggplot within julia) - -## Network Visualization - -To visualize the estimated network, we can use the companion package -[PhyloPlots](https://github.com/juliaphylo/PhyloPlots.jl). -In the example below, julia creates and sends the plot to R -via [RCall](https://github.com/JuliaInterop/RCall.jl), -so we can tweak the plot in various ways via commands sent to R. -To save the plot in a file: we first tell R to create an image file, -then we send the plot of the network, -then we tell R to wrap up and save its image file. - -```@example snaqplot -using PhyloPlots # to visualize networks -using RCall # to send additional commands to R like this: R"..." -imagefilename = "../assets/figures/snaqplot_net1_2.svg" -R"svg"(imagefilename, width=4, height=3) # starts image file -R"par"(mar=[0,0,0,0]) # to reduce margins (no margins at all here) -plot(net1, showgamma=true, showedgenumber=true); # network is plotted & sent to file -R"dev.off()"; # wrap up and save image file -nothing # hide -``` -![net1_2](../assets/figures/snaqplot_net1_2.svg) - -The plot function has many options, to annotate nodes and edges. In the -example above, hybrid edges were annotated with their γ inheritance values -(in blue: light blue for the minor edge with γ<0.5, and dark blue for the -major edge with γ>0.5), and edges were annotated with their internal numbers. - -Type `?` to switch to the help mode -of Julia, then type the name of the function, here `plot`. -Below are two visualizations. -The first uses the default style (`:fulltree`) and modified edge colors. -The second uses the `:majortree` style. -That style doesn't have an arrow by default for minor hybrid edges, -but we can ask for one by specifying a positive arrow length. -```@example snaqplot -R"svg(name('snaqplot_net1_3.svg'), width=7, height=3)" # hide -R"par"(mar=[0,0,0,0]) # hide -R"layout(matrix(1:2,1,2))"; -plot(net1, showedgelength=true, minorhybridedgecolor="tan"); -plot(net1, style=:majortree, arrowlen=0.07); -R"dev.off()"; # hide -nothing # hide -``` -![net1_3](../assets/figures/snaqplot_net1_3.svg) - -Edge lengths are shown, too. They were estimated in coalescent units: -number of generations / effective population size. -Some edge lengths are not identifiable, hence not shown. - -Below is another example, where space was added between the network and -the taxon names via the `tipoffset` option. -Also, edge colors were changed, and the nodes numbers are shown (used internally) - -```@example snaqplot -R"svg(name('snaqplot_net1_4.svg'), width=4, height=3)" # hide -R"par"(mar=[0,0,0,0]) # hide -plot(net1, tipoffset=0.5, shownodenumber=true, edgecolor="tomato4", - minorhybridedgecolor="skyblue", majorhybridedgecolor="tan"); -R"dev.off()"; # hide -nothing # hide -``` -![net1_4](../assets/figures/snaqplot_net1_4.svg) - -## Re-rooting networks - -SNaQ infers an unrooted semi-directed network. -The direction of hybrid edges can be inferred, -but the direction of tree edges cannot be inferred. -To obtain a representative visualization, -it is best to root the network first, using one or more outgroup. -Go to [Re-rooting trees and networks](@ref) for this. -If your outgroup conflicts with the direction of reticulations -in the estimated network, see section -[Candidate networks compatible with a known outgroup](@ref). - -## Candidate Network Evaluation - -From a set of candidate networks, one might simply need to score of each network -to pick the best. Here, the score is the negative log pseudo-likelihood, and the -lower the better. See the section to get the score of [Candidate Networks](@ref). - -## SNaQ error reporting - -Please report any bugs and errors by opening an -[issue](https://github.com/juliaphylo/PhyloNetworks.jl/issues/new). -The easiest way to provide information on the error is by checking the -`.err` file, which will show the number of runs that -failed and the corresponding seed to replicate the run. -In case of an error, the `.err` file might look like: -`Total errors: 1 in seeds [4545]`. -This file and any information that will help replicating the error -will be immensely helpful to fix the error/bug. diff --git a/docs/src/man/ticr_howtogetQuartetCFs.md b/docs/src/man/ticr_howtogetQuartetCFs.md deleted file mode 100644 index a531360be..000000000 --- a/docs/src/man/ticr_howtogetQuartetCFs.md +++ /dev/null @@ -1,260 +0,0 @@ -# TICR pipeline - -PhyloNetworks' [wiki](https://github.com/juliaphylo/PhyloNetworks.jl/wiki/TICR:-from-alignments-to-quartet-concordance-factors) -has a step-by-step tutorial, -to go from multiple sequence alignments -to a table of quartet gene frequencies (concordance factors: CFs), -through BUCKy (to integrate out gene tree uncertainty) or through RAxML. -To get the `raxml.pl` perl script to run RAxML on each gene, -download the content of that wiki with - -`git clone https://github.com/juliaphylo/PhyloNetworks.jl.wiki.git` - -then go to the `script/` folder. -Full information and code is [here](https://github.com/nstenz/TICR). -Below is more detail to insert data into the pipeline at various stages, -using one of **two pipelines**, depending on your machine configuration: - -- "no-scheduler" pipeline: original set of Perl scripts from the - TICR pipeline, well suited for a machine or a cluster of machines - without a job scheduler. - The scripts automatically parallelize the work across the available cores. - -- "slurm" pipeline: well suited for a cluster where users submit jobs - via a job scheduler like [SLURM](https://slurm.schedmd.com/) or - [SGE](https://en.wikipedia.org/wiki/Oracle_Grid_Engine). The job scheduler - does the work of parallelizing the work across available cores. - The scripts, in this second pipeline, were created to take full advantage - of job scheduler capabilities. They were developed for a cluster running SLURM. - Adjustments to the submit scripts will be needed, to adapt to your own - SLURM configuration or to the syntax that your job scheduler wants. - -## To run MrBayes: we already have alignments - -### no-scheduler pipeline - -We don't need to run `mdl.pl` if we already have aligned gene sequences -from separate loci. To run MrBayes on each locus, we can simply -create a tarball of the Nexus files we wish to use (fasta won't work at this stage). -The command below assumes that we want to use all the files ending with ".nex" -in the current directory, one file per locus: - -```bash -tar czf my-genes.tar.gz *.nex -``` - -Once the tarball has been successfully generated, we can then specify this -file as input for [mb.pl](https://github.com/nstenz/TICR/blob/master/scripts/mb.pl) -assuming we have a valid MrBayes block located in the file "bayes.txt": - -```bash -mb.pl my-genes.tar.gz -m bayes.txt -o my-genes-mb -``` - -If we get an error message like `mb.pl: Command not found`, it might be because -`mb.pl` has no execute permission, or the current directory is not in our "path". -An easy fix is to run this command instead: - -```bash -perl mb.pl my-genes.tar.gz -m bayes.txt -o my-genes-mb -``` - -The resulting output tarball would now be located in `my-genes-mb/my-genes.mb.tar`, -and can be used normally with -[bucky.pl](https://github.com/nstenz/TICR/blob/master/scripts/bucky.pl), -that is, like this: - -```bash -bucky.pl my-genes-mb/my-genes.mb.tar -o mygenes-bucky -``` - -The output, with the table of concordance factors for all sets of 4 taxa, -will be in a file named `my-genes.CFs.csv` inside a directory named `mygenes-bucky`. -That's the file containing the quartet concordance factors to give to SNaQ as input. -There is *no* need to do any of the steps below: they are already done by `bucky.pl`. - -### slurm pipeline - -SLURM will parallelize the MrBayes runs across genes. - -1. Navigate in some "working" directory where you place: - - a folder containing all nexus files, which we will call "nexusfolder" below - - a text file named `mb-block.txt` with the MrBayes block to be used - for all the genes (containing the options for MrBayes: model of sequence - evolution, number of generations etc.). - If we want a different MrBayes block for different genes, step 2 should be skipped, - and we should instead find some other way to put the specific MrBayes block - at the end of each nexus file. - -2. In the "working" directory above, run the julia script - [`paste-mb-block.jl`](https://github.com/nstenz/TICR/blob/master/scripts-cluster/paste-mb-block.jl) - with "nexusfolder" as argument, to tell the script where to find all the nexus files: - - ```bash - julia path/to/paste-mb-block.jl nexusfolder - ``` - This script will read all the nexus files in the directory `nexusfolder`, - will create a new directory `nexusfolder-block`, - and will create new nexus files (containing the MrBayes block found in file `mb-block.txt`) - as `1.nex, 2.nex, ...` in the new directory. A `translate.txt` file will also be created - to map the original gene file names to the new (numbered) file names. - If we named our MrBayes block file differently: we can edit the script and modify it - to replace `mb-block.txt` by our actual file name for the MrBayes block. - -3. Modify the submit script - [`mb-slurm-submit.sh`](https://github.com/nstenz/TICR/blob/master/scripts-cluster/mb-slurm-submit.sh), - which will parallelize all the individual-gene MrBayes runs with SLURM: - - - change `--array` to the correct number of genes - - change `--mail-user` to the user's email (if this is an option for your job scheduler) - - replace the `/workspace/software/bin` in `PATH="/workspace/software/bin:$PATH"` - to the path where the `mb` executable is located or put the whole path in the command: - `/s/mrbayes-3.2.6-1/bin/mb` - - In slurm, we can then submit the MrBayes array job with: - - ```bash - sbatch mb-slurm-submit.sh - ``` - - With this slurm pipeline, the steps below are needed: keep reading. - -## To run mbsum on the output of MrBayes for each gene - -If we have the output of MrBayes and want to run BUCKy, -we must first run `mbsum` on the output from MrBayes, separately for each gene. - -For a gene with output tree files named `gene1.run1.t`, `gene1.run2.t` and `gene1.run3.t`, -and a desired burnin of 1000 trees per tree file, we do this: - -```bash -mbsum -n 1000 -o gene1.in gene1.run1.t gene1.run2.t gene1.run3.t -``` - -This `mbsum` command will need to be executed for each gene. -Then we can continue to the next section to run bucky. - -Alternatively, we can use the julia script -[`mbsum-t-files.jl`](https://github.com/nstenz/TICR/blob/master/scripts-cluster/mbsum-t-files.jl), -and give it as argument the directory that has the output tree files from MrBayes, -to run mbsum for *all* the genes. -`mbsum` is fast, so there is no attempt to parallelize the various mbsum commands. - -```bash -julia mbsum-t-files.jl mbfolder outputfolder burnin # or -julia --color=yes -- mbsum-t-files.jl mbfolder outputfolder burnin # for colorized messages to the screen -``` -where `burnin` is replaced by the number of trees to ignore in each tree file -for burnin. This `burnin` argument is optional (default: 2501). -The `outputfolder` will contain the output of `mbsum`. - -## To run bucky on all 4-taxon sets: we already have the mbsum output - -### no-scheduler pipeline - -If we already ran `mbsum` on the output from MrBayes, for each individual gene, -we can simply create a tarball containing all the mbsum output files. -So if we had mbsum output in files named `gene1.in`, `gene2.in`, ... , `gene100.in`, -we would want to run something similar to the following command to create the tarball: - -```bash -tar czf my-genes-mbsum.tar.gz gene*.in -``` - -We can now use this tarball along with the `-s` option in -[bucky.pl](https://github.com/nstenz/TICR/blob/master/scripts/bucky.pl) like this: - -```bash -bucky.pl my-genes-mbsum.tar.gz -s -o mygenes-bucky -``` - -Again, if we get an error like `bucky.pl: Command not found`, we could run instead - -```bash -perl bucky.pl my-genes-mbsum.tar.gz -s -o mygenes-bucky -``` - -The output, with the table of concordance factors for all sets of 4 taxa, -will be in a file named `my-genes.CFs.csv` inside directory `mygenes-bucky`. -That's the file containing the quartet concordance factors to give to SNaQ as input. - -### slurm pipeline - -We want to run `bucky` on every 4-taxon set. -SLURM will parallelize these jobs with the submit script -[`bucky-slurm-submit.sh`](https://github.com/nstenz/TICR/blob/master/scripts-cluster/bucky-slurm-submit.sh), -which calls the perl script -[`bucky-slurm.pl`](https://github.com/nstenz/TICR/blob/master/scripts-cluster/bucky-slurm.pl). - -The perl script -[`bucky-slurm.pl`](https://github.com/nstenz/TICR/blob/master/scripts-cluster/bucky-slurm.pl) -runs `bucky` on a single 4-taxon set. -It takes the following arguments, which must be modified in the submit script -[`bucky-slurm-submit.sh`](https://github.com/nstenz/TICR/blob/master/scripts-cluster/bucky-slurm-submit.sh): -- name of the folder containing the `mbsum` output files (one per locus) from previous step. - This folder is named `mbsum` in the submit script: adapt if needed. -- output name: `-o` or `--out-dir` name of the directory to store output files in. - This option is not used in the default submit script -- bucky arguments: `-a` or `--alpha` for the prior alpha value, - and `-n` or `--ngen` number of generations. These options are not used either, - in the script: the defaults are used then (α=1, 1 million generations) -- integer for the given quartet, via option `-q`. - The quartet ID is specified by SLURM with its own array ID: `$SLURM_ARRAY_TASK_ID`. - -In the submit script that gives instructions to the job scheduler: -- adapt the name of the `$SLURM_ARRAY_TASK_ID` variable, which captures the task number - in the array of tasks, to your scheduler syntax -- change `--array` to the correct number of 4-taxon sets. - For example, if there are 15 taxa in the dataset, there are `1365` 4-taxon sets. - To get this number, if you are unsure, use `choose(15,4)` in R or `binomial(15,4)` in Julia, - but replace 15 by your actual number of individuals. -- change `--mail-user` to the user's email (if this is an option for your job scheduler) -- replace the `/workspace/software/bin` in `PATH="/workspace/software/bin:$PATH"` - by the path where the `bucky` executable is located. - Also, replace `/workspace/claudia/software/TICR/scripts/` by the full path where the - `bucky-slurm.pl` script is located. - - -In slurm, we would submit the BUCKy array job with: - -```bash -sbatch bucky-slurm-submit.sh -``` - -At the end, the array job will produce -- a `.concordance` file for every 4-taxon set -- a `.cf` file with the parsed output for that same 4-taxon set, - in the format needed for the final CF table. - -The `.cf` files can be concatenated to produce the file containing -the quartet concordance factors across all 4-taxon sets, to give to SNaQ as input: - -```bash -cat *.cf > CFtable.csv -``` - -Alternatively, if the list of `.cf` files is not easily captured by `*.cf` -(because the list is too long for a shell command), the following julia script -can do the concatenation. Just copy-paste the commands below within a Julia session, -started from the directory that contains the `.cf` files: - -```julia -files = String[] # empty vector of strings: will contain the .cf file names later -for f in filter(x -> endswith(x, ".cf"), readdir()) - push!(files,f) -end -println("found $(length(files)) cf files") # to check how many .cf output files were found -open("CFtable.csv","w") do f_out - # write the header: - write(f_out, "taxon1,taxon2,taxon3,taxon4,CF12_34,CF12_34_lo,CF12_34_hi,CF13_24,CF13_24_lo,CF13_24_hi,CF14_23,CF14_23_lo,CF14_23_hi,ngenes\n") - for file in files - @show file # to see the .cf file name: comment this out if that's too much screen output - open(file) do f_in - line = read(f_in, String) - write(f_out, string(line,"\n")) - end # closes "file" safely - end -end # closes "CFtable.csv" safely -``` -When this is done, we will have a file `CFtable.csv` containing the -quartet concordance factors, to give to SNaQ as input :smiley: diff --git a/docs/src/man/trait_tree.md b/docs/src/man/trait_tree.md deleted file mode 100644 index 4dc08cc6f..000000000 --- a/docs/src/man/trait_tree.md +++ /dev/null @@ -1,545 +0,0 @@ -```@setup tree_trait -using PhyloNetworks -mkpath("../assets/figures") -``` -# Continuous Trait Evolution - -Once the network is inferred, we can take -these species relationships into account when studying the distribution of quantitative -traits measured for extant species. -This is the goal of phylogenetic comparative methods (PCM). -More details can be found on the developments below in Bastide et al. 2018 [^B18] - -We assume a fixed network, correctly rooted, with branch lengths -proportional to calendar time. Here, we consider the true network that was -used in the previous sections, and which is ultrametric (all the tips are contemporary). -```@example tree_trait -truenet = readTopology("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); -``` -As previously, we can plot the network thanks to the `RCall` package. -The `name` function is only instrumental here, to ensure that the figure is -saved in the correct directory when the documentation is built. -We only show the commands to actually save the plot in this first example for -the interested reader, but we will hide those in the rest of the chapter, for -the sake of clarity. -```@example tree_trait -using PhyloPlots, RCall -R"name <- function(x) file.path('..', 'assets', 'figures', x)" -R"svg(name('truenet.svg'), width=8, height=4)" -R"par"(mar=[0,0,0,0]) -plot(truenet, useedgelength=true, showgamma=true); -R"dev.off()" -nothing # hide -``` -![truenet](../assets/figures/truenet.svg) - -## Model and Variance Matrix - -Assuming that the network is known and that the continuous traits evolve like a -Brownian Motion (BM) in time, it is possible to compute the expected variance -covariance matrix between tip measurements. This can be done using function -[`vcv`](@ref), whose syntax is inspired from the well known corresponding -[`ape`](https://CRAN.R-project.org/package=ape) function. -```@repl tree_trait -C = vcv(truenet) -``` -The matrix is returned as a `DataFrame`, with columns named by the -tips of the network to allow for easy identification. -Each row also corresponds to a tip in the network, and rows are -ordered in the same way as columns. - -The computation of this matrix is based on the more general function -[`sharedPathMatrix`](@ref). It is at the core of all the Phylogenetic -Comparative Methods described below. - - -## Trait simulation - -We start by generating continuous traits to study. We simulate three -traits on the network (two independent, one dependent), -using a Brownian Motion (BM) model of trait evolution on the network. We start -by choosing the parameters of the BM (ancestral mean and variance), by creating -objects of class [`ParamsBM`](@ref)`<:ParamsProcess`. -```@example tree_trait -params_trait1 = ParamsBM( 2, 0.5) # BM with mean 2 and variance 0.5 -params_trait2 = ParamsBM(-2, 1) # BM with mean -2 and variance 1.0 -nothing # hide -``` -We then simulate the independent traits according to these parameters, using -function [`simulate`](@ref) (fixing the seed, for reproducibility). -```@example tree_trait -using Random -Random.seed!(18480224); -sim1 = simulate(truenet, params_trait1) # simulate a BM on truenet -sim2 = simulate(truenet, params_trait2) -nothing # hide -``` -This creates objects of class [`TraitSimulation`](@ref), from which we can -extract the data at the tips, thanks to the method -[`getindex(::TraitSimulation, ::Symbol)`](@ref). -```@example tree_trait -trait1 = sim1[:Tips] # trait 1 at the tips (data) -trait2 = sim2[:Tips] -nothing # hide -``` -This extractor creates an `Array` with one column, and as many lines as the -number of tips there are in the phylogeny. It is sorted in the same order as -the tips of the phylogeny used to simulate it. -If needed, we could also extract the simulated values at the internal nodes -in the network: -```@example tree_trait -sim1[:InternalNodes] -nothing # hide -``` - -Finally, we generate the last trait correlated with trait 1 -(but not trait 2), with phylogenetic noise. -```@example tree_trait -Random.seed!(18700904); -noise = simulate(truenet, ParamsBM(0, 0.1)) # phylogenetic residuals -trait3 = 10 .+ 2 * trait1 .+ noise[:Tips] # trait to study. independent of trait2 -nothing # hide -``` - -## Phylogenetic regression - -Assume that we measured the three traits above, and that we wanted to study the -impact of traits 1 and 2 on trait 3. To do that, we can perform a phylogenetic -regression. - -In order to avoid confusion, the function takes in a `DataFrame`, that has an -extra column with the names of the tips of the network, labeled `tipNames`. -Here, we generated the traits ourselves, so they are all in the same order. -```@repl tree_trait -using DataFrames -dat = DataFrame(trait1 = trait1, trait2 = trait2, trait3 = trait3, - tipNames = tipLabels(sim1)) -``` - -Phylogenetic regression / ANOVA is based on the -[GLM](https://github.com/JuliaStats/GLM.jl) package, with the network as an -extra argument, using function [`phylolm`](@ref). -```@repl tree_trait -using StatsModels # for statistical model formulas -fitTrait3 = phylolm(@formula(trait3 ~ trait1 + trait2), dat, truenet) -``` -The REML criterion is used by default, for estimating the variance -parameter(s). ML could be used instead with option `reml=false`. -From this, we can see that the intercept, the coefficient for trait 1 -and the variance of the noise are correctly estimated -(given that there are only 6 taxa). -In addition, the Student T test for the coefficient -associated with trait 2 has a high p-value, which means that this coefficient -is not significantly different from 0. This is consistent with the -way we simulated trait 3. - -The function returns an object of type [`PhyloNetworkLinearModel`](@ref)`<:GLM.LinPredModel`. -It is a subtype of the GLM type `LinPredModel`, which means that all base -functions from Julia [StatsBase](https://github.com/JuliaStats/StatsBase.jl) can -be applied to it. See the documentation for this type for a list of all -functions that can be used. Some functions allow the user to retrieve directly -the estimated parameters of the BM, and are specific to this object. -```@repl tree_trait -sigma2_phylo(fitTrait3) # estimated variance of the BM -mu_phylo(fitTrait3) # estimated root value of the BM -``` - -## Ancestral State Reconstruction - - -### From known parameters - -If we assume that we know the exact model of evolution that generated the -traits, we can do ancestral trait reconstruction. Here, we simulated trait 1 -ourselves, so we can use the true process, with the true parameters. -In other words, we can reconstruct the state at the internal nodes, -given the values at the tips, the known value at the root -and the known BM variance. -```@example tree_trait -ancTrait1 = ancestralStateReconstruction(truenet, trait1, params_trait1) -nothing # hide -``` -Function [`ancestralStateReconstruction`](@ref) creates an object with type -[`ReconstructedStates`](@ref). Several extractors can be applied to it: -```@repl tree_trait -expectations(ancTrait1) # predictions -using StatsBase # for stderror(), aic(), likelihood() etc. -stderror(ancTrait1) # associated standard errors -predint(ancTrait1, level=0.9) # prediction interval (with level 90%) -``` -We can plot the ancestral states or prediction intervals on the tree, using the -`nodelabel` argument of the `plot` function. -```@example tree_trait -ancExpe = expectationsPlot(ancTrait1); # format expected ancestral states for the plot -R"svg(name('ancestral_expe.svg'), width=8, height=4)" # hide -R"par"(mar=[0,0,0,0]) # hide -plot(truenet, nodelabel = ancExpe); -R"dev.off()" # hide -nothing # hide -``` -![ancestral_expe](../assets/figures/ancestral_expe.svg) - -```@example tree_trait -ancInt = predintPlot(ancTrait1) # format the prediction intervals for the plot -R"svg(name('ancestral_predint.svg'), width=8, height=4)" # hide -R"par"(mar=[0,0,0,0]) # hide -plot(truenet, nodelabel = ancInt); -R"dev.off()" # hide -nothing # hide -``` -![ancestral_predint](../assets/figures/ancestral_predint.svg) - -The `predint` and `predintPlot` functions have an optional argument to state -the `level` of the prediction interval. If not given, the default value is -0.95. - -It is also possible to plot both the reconstructed state and the predicted value -on the same plot, using the optional keyword argument `withExp`. -As shown below, we could also use the `RCall` method from the -[`plot`](https://juliaphylo.github.io/PhyloPlots.jl/stable/lib/public/) function. -```@example tree_trait -plot(truenet, nodelabel = predintPlot(ancTrait1, withExp=true)); -nothing # hide -``` -These plots tend to be quite busy, even for small networks. - -As we know the true ancestral states here, we can compare them to our -estimation. -```@repl tree_trait -predictions = DataFrame(infPred=predint(ancTrait1)[1:7, 1], - trueValue=sim1[:InternalNodes], - supPred=predint(ancTrait1)[1:7, 2]) -``` - -### From estimated parameters - -In real applications though, we do not have access to the true parameters of the -process that generated the data. We can estimate it using the previous function. -To fit a regular BM, we just need to do a regression of trait 1 against a simple -intercept: -```@example tree_trait -fitTrait1 = phylolm(@formula(trait1 ~ 1), dat, truenet) -nothing # hide -``` -We can then apply the [`ancestralStateReconstruction`](@ref) function directly -to the fitted object: -```@example tree_trait -ancTrait1Approx = ancestralStateReconstruction(fitTrait1) -nothing # hide -``` -The prediction intervals ignore the fact that we estimated the process -parameters, so they are less accurate and the function throws a warning. -The output is an object of the same [`ReconstructedStates`](@ref) type as earlier, -and the same extractors can be applied to it: -```@example tree_trait -R"svg(name('ancestral1.svg'), width=8, height=4)" # hide -R"par"(mar=[0,0,0,0]) # hide -plot(truenet, nodelabel = expectationsPlot(ancTrait1Approx)); -R"dev.off()" # hide -nothing # hide -``` -![ancestral1](../assets/figures/ancestral1.svg) - -For convenience, the two steps described above (fitting against the -intercept, and then do ancestral state reconstruction) can be done all at once -with a single call of the function [`ancestralStateReconstruction`](@ref) on a -DataFrame with the trait to reconstruct, and the tip labels: -```@example tree_trait -datTrait1 = DataFrame(trait1 = trait1, tipNames = tipLabels(sim1)) -ancTrait1Approx = ancestralStateReconstruction(datTrait1, truenet) -nothing # hide -``` -```@example tree_trait -R"svg(name('ancestral2.svg'), width=8, height=4)" # hide -R"par"(mar=[0,0,0,0]) # hide -plot(truenet, nodelabel = predintPlot(ancTrait1Approx, level=0.9)); -R"dev.off()" # hide -nothing # hide -``` -![ancestral2](../assets/figures/ancestral2.svg) - -This produces the exact same results. Here, we chose a `level` of 90% for the -plotted prediction intervals. - -### Data imputation - -Note that there is no theoretical difference between an internal node, for which -we could not measure the value of the trait, and a missing value at a tip of the -network. Consequently, the previous [`ancestralStateReconstruction`](@ref) -function can be used to do data imputation. To see this, let's add some missing -values in trait 1. -```@example tree_trait -allowmissing!(datTrait1, :trait1) -datTrait1[2, :trait1] = missing; # second row: for taxon C -ancTrait1Approx = ancestralStateReconstruction(datTrait1, truenet) -nothing # hide -``` -```@example tree_trait -R"svg(name('ancestral3.svg'), width=8, height=4)" # hide -R"par"(mar=[0,0,0,0]) # hide -plot(truenet, nodelabel = predintPlot(ancTrait1Approx)); -R"dev.off()" # hide -nothing # hide -``` -![ancestral3](../assets/figures/ancestral3.svg) - -A prediction interval is shown for the missing values. - -### With known predictors - -At this point, it might be tempting to apply this function to trait 3 we -simulated earlier as a linear combination of trait 1 and a phylogenetic -noise. However, this cannot be done directly: -```julia -ancTrait3 = ancestralStateReconstruction(fitTrait3) # Throws an error ! -``` -This is because the model we used to fit the trait (a regression with one -predictor and an intercept) is not compatible with the simple model of Brownian -evolution that we assumed for the ancestral state reconstruction. As the -predictor used is not known for ancestral states, it is not possible to -reconstruct the trait for this particular model. - -The only option we have is to provide the function with the predictor's -ancestral states, if they are known. They are known indeed in this -toy example that we generated ourselves, so we can reconstruct our trait -doing the following: -```@example tree_trait -ancTrait3 = ancestralStateReconstruction(fitTrait3, - [ones(7, 1) sim1[:InternalNodes] sim2[:InternalNodes]]) -nothing # hide -``` -```@example tree_trait -R"svg(name('ancestral4.svg'), width=8, height=4)" # hide -R"par"(mar=[0,0,0,0]) # hide -plot(truenet, nodelabel = predintPlot(ancTrait3)); -R"dev.off()" # hide -nothing # hide -``` -![ancestral4](../assets/figures/ancestral4.svg) - -where we provided the ancestral predictors as a matrix, containing the -intercept, and the known predictor at the nodes. The user must be very careful -with this function, as no check is done for the order of the predictors, that -must be in the same order as the internal nodes of the phylogeny. As ancestral -predictors are often unknown, the use of this functionality is discouraged. - - -## Phylogenetic ANOVA - -The [`phylolm`](@ref) function is based on the `lm` function -from [GLM](https://github.com/JuliaStats/GLM.jl). This means that it -inherits from most of its features, and in particular, it can handle formulas -with factors or interactions. -For example, in lizards, we might want to do a regression of toe length against -body length and the region where each species is found, where this region is coded -into 4 categories (say). We might also want to include an interaction effect -between body length and region. -(This model has no biological basis. It is just meant to show the possibilities -of the function). - -To illustrate the use of categorical predictors of particular interest -in a network with reticulations, let's assume that some transgressive evolution took place -after the hybridization event, so that tips "A" and "B" have larger mean -compared to the others -(see [^B18] for transgressive evolution after a reticulation event). -```@example tree_trait -delta = 5.0; # value of heterosis -underHyb = [(n == "A" || n == "B") for n in tipLabels(sim1)] # tips under hybrid -underHyb -for i in 1:length(trait3) - underHyb[i] && (trait3[i]+=delta) # add delta to tips A and B -end -nothing # hide -``` -```@repl tree_trait -trait3 # changed: +5 was added by the previous loop to A and B -``` -The categorical variable `underHyb` separates tips "A" and "B" from the others. -We need to consider it as a factor, not a numerical variable. -One way is to make it a vector of strings, as done below. -An alternative way would be to add and use the `CategoricalArrays` package, -then transform the column `underHyb` to be `categorical` (shown in commments). -```@example tree_trait -dat = DataFrame(trait1 = trait1, trait2 = trait2, trait3 = trait3, - underHyb = string.(underHyb), - tipNames = tipLabels(sim1)) -# using CategoricalArrays -# transform!(dat, :underHyb => categorical, renamecols=false) -nothing # hide -``` -```@repl tree_trait -dat -``` -Now we can include this reticulation variable in the regression. -```@example tree_trait -fitTrait = phylolm(@formula(trait3 ~ trait1 + underHyb), dat, truenet) -``` -In this case, the categorical variable indicating which tips are descendants -of the reticulation event is indeed relevant, and the transgressive evolution effect -is recovered. - -This is a very simple example of how to include transgressive evolution, -but some general -functions to test for it, on networks with more than on hybrid, are also -available. - - -## Pagel's Lambda - -One classical question about trait evolution is the amount of -"phylogenetic signal" in a dataset, that is, the importance of the tree -structure to explain variation in the observed traits. -One way of doing measuring that is to use -Pagel's lambda transformation of the branch lengths [^P99]. -This model assumes a -BM on a tree where the internal branches are multiplied by a factor λ, -while the external branches are modified so that the total height of the tree is -constant. Hence, λ varies between 0 (the tree has no influence on -the data) and 1 (the tree is unchanged). -Using the same branch length transformations, this model can -be straightforwardly extended to phylogenetic networks. - -We can illustrate this with the predictor trait we used earlier. We use the -same function as before, only indicating the model we want to use: -```@example tree_trait -fitPagel = phylolm(@formula(trait1 ~ 1), dat, truenet, model="lambda") -``` -As it is indeed generated according to a plain BM on the phylogeny, the -estimated λ should be close to 1. It can be extracted with function -`lambda_estim`: -```@repl tree_trait -lambda_estim(fitPagel) -``` - -For models in which the covariance is estimated, like Pagel's lambda, -model comparisons should use a likelihood ratio test with the function `lrtest`, -because the f-test (see below) is not applicable. - -If the models being compared have different predictors, then models -should be fit with maximum likelihood instead of the default REML criterion -in order to do a likelihood ratio test: use option `reml=false` for this. - -## Shifts and transgressive evolution - -In the ANOVA section above, we showed how to include transgressive evolution -in a simple case. -In general, transgressive evolution can be seen as a particular example -of a *shifted BM* on the phylogenetic network. - -### Simulation of a Shifted BM - -In a shifted BM, the trait evolves as a BM on the network most of -the time, but *shifts* on some of the branches. -The positions and values of the shifts can be stored in a [`ShiftNet`](@ref) -object. For identifiability reasons, shifts are only allowed on tree-like -branches. The position of the shifts can be given using vector of edges. -To see this, let's first plot the network with its associated edges and node -numbers. -```@example tree_trait -R"svg(name('truenet_with_numbers.svg'), width=8, height=4)" # hide -R"par"(mar=[0,0,0,0]) # hide -plot(truenet, useedgelength=true, showedgenumber=true); -R"dev.off()" # hide -nothing # hide -``` -![truenet_with_numbers](../assets/figures/truenet_with_numbers.svg) - -Let's say that we want to add a shift with value 5.0 on the branch directly -following the hybridization event, in order to model transgressive evolution. -We can see on the -plot above that this branch is number 6, so we define the following object: -```@example tree_trait -shift = ShiftNet(truenet.edge[6], 5.0, truenet) -nothing # hide -``` -Note that the edge numbers and values of a `ShiftNet` object can be retrieved -thanks to functions [`getShiftEdgeNumber`](@ref) and [`getShiftValue`](@ref). -The constructor can take a single edge and associated value, like here, -or two vectors of edges and matching values. - -Because we often need to put shifts only on edges right after hybrids, -there is a special function [`shiftHybrid`](@ref) to do that, so that -we do not have to find out their edges number. Here, the `shift` object -could hence have been defined as: -```@example tree_trait -shift = shiftHybrid(5.0, truenet) -``` - -The parameters for the simulation are then defined as above, just adding -the `ShiftNet` object as a parameter. - -```@example tree_trait -params_sh = ParamsBM(2, 0.5, shift) # BM with mean 2, variance 0.5, and shifts. -nothing # hide -``` -The traits are simulated using the same function [`simulate`](@ref), and -extracted at the tips as before. -```@example tree_trait -Random.seed!(18700904) -sim_sh = simulate(truenet, params_sh) # simulate a shifted BM on truenet -trait_sh = sim_sh[:Tips] # trait at the tips (data) -nothing # hide -``` - -### Fit of a Shifted BM - -Let's assume that we measured `trait_sh`, and that we want to test whether -there were some ancestral hybridizations. To do that, we can use the -custom columns of the [`descendenceMatrix`](@ref), that can be directly -defined thanks to function [`regressorHybrid`](@ref). -```@example tree_trait -df_shift = regressorHybrid(truenet) # Regressors matching Hybrid Shifts -nothing # hide -``` -This creates a dataframe, with as many columns as the number of hybrids -in the network, each named according to the number of the edge after the -hybrid. -We can use this dataframe as regressors in the `phylolm` function. - -```@example tree_trait -dat = DataFrame(trait = trait_sh, tipNames = tipLabels(sim_sh)) # Data -dat = innerjoin(dat, df_shift, on=:tipNames) # join the two -fit_sh = phylolm(@formula(trait ~ shift_6), dat, truenet) # fit -``` -Here, because there is only one hybrid in the network, we can directly -see whether the ancestral transgressive evolution is significant or not thanks to the -Student T test on the coefficient associated with `shift_6`. In more -complex cases, it is possible to do a Fisher F test, thanks to the `GLM` -function `ftest`. -```@example tree_trait -fit_null = phylolm(@formula(trait ~ 1), dat, truenet) # fit against the null (no shift) -ftest(fit_null, fit_sh) # nested models -``` -Here, this test is equivalent to the Fisher F test, and gives the same p-value. - -!!! note "Warnings from GLM" - A warning may appear, saying - "Starting from GLM.jl 1.8, null model is defined as having no predictor at all when a model without an intercept is passed." - - Why? `ftest` is inherited from the GLM package, which does not know that - the intercept term is not a column of ones after transformation to remove - the phylogenetic correlation. This is why `ftest` sends a warning for - each model, when multiple models are compared. - - These specific warnings can be ignored: - * F values and p-values are correct - * R² values are also correct: they are obtained with the - `r2` function for phylogenetic linear models. - A future version of the package will attempt to remove these warnings - specifically. - -Note that models need to be ordered by complexity, when given to `ftest`: -either from most complex to most simple, or from most simple to most complex. -In the output table, models are listed in the order in which they were given. -If the most complex model is given first, as done above, the table -lists the most complex H₁ (with shifts) first, and the null model H₀ -is listed as the second model. - ---- - -### References - -[^B18]: Bastide, Solís-Lemus, Kriebel, Sparks, Ané (2018): - Phylogenetic Comparative Methods for Phylogenetic Networks with Reticulations. - Systematic Biology 67(5):800–820. doi:10.1093/sysbio/syy033 - -[^P99]: Pagel M (1999). Inferring the historical patterns of biological - evolution. Nature. 401: 877–884. doi:10.1038/44766 diff --git a/examples/Ae_bicornis_8_withrepeatingsites.aln b/examples/Ae_bicornis_8_withrepeatingsites.aln index e0b8600c3..90c8af129 100644 --- a/examples/Ae_bicornis_8_withrepeatingsites.aln +++ b/examples/Ae_bicornis_8_withrepeatingsites.aln @@ -1,12 +1,12 @@ ->test_1 -GCGCCGAG ->test_2 -GCACCGAG ->test_3 -GCACCGAG ->test_4 -GTACCGAG ->test_5 -GTACCGAG ->test_6 +>test_1 +GCGCCGAG +>test_2 +GCACCGAG +>test_3 +GCACCGAG +>test_4 +GTACCGAG +>test_5 +GTACCGAG +>test_6 GTACCGGG \ No newline at end of file diff --git a/examples/Ae_bicornis_8repeatingsites.aln b/examples/Ae_bicornis_8repeatingsites.aln index e0b8600c3..90c8af129 100644 --- a/examples/Ae_bicornis_8repeatingsites.aln +++ b/examples/Ae_bicornis_8repeatingsites.aln @@ -1,12 +1,12 @@ ->test_1 -GCGCCGAG ->test_2 -GCACCGAG ->test_3 -GCACCGAG ->test_4 -GTACCGAG ->test_5 -GTACCGAG ->test_6 +>test_1 +GCGCCGAG +>test_2 +GCACCGAG +>test_3 +GCACCGAG +>test_4 +GTACCGAG +>test_5 +GTACCGAG +>test_6 GTACCGGG \ No newline at end of file diff --git a/examples/Ae_bicornis_8sites.aln b/examples/Ae_bicornis_8sites.aln index 702dbd61e..ea17336b6 100644 --- a/examples/Ae_bicornis_8sites.aln +++ b/examples/Ae_bicornis_8sites.aln @@ -1,44 +1,44 @@ ->Ae_uniaristata_Tr357 -GCGCCGAC ->Ae_mutica_Tr237 -GCAGCGAC ->Ae_tauschii_Tr352 -GCAGCGAT ->Ae_searsii_Tr165 -GTAGCGAC ->Ae_sharonensis_Tr265 -GTAGCGAT ->Ae_bicornis_Tr407 -GTAGCGGC ->Ae_longissima_Tr241 -GTAGCGAC ->Ae_bicornis_Tr406 -GTAGCGGC ->Ae_caudata_Tr275 -GCGCCGAT ->H_vulgare_HVens23 -GTGCCAGT ->Ae_tauschii_Tr125 -GCAGCGGT ->Ae_uniaristata_Tr403 -GCGCCGAC ->Ae_uniaristata_Tr402 -GC------ ->Ae_comosa_Tr272 -GCGCCGAT ->Ae_longissima_Tr242 -GTAGCGAC ->Ae_comosa_Tr271 -GCGCCGAT ->Ae_searsii_Tr164 -GTAGCGAC ->Ae_speltoides_Tr251 -GTGCCAGT ->Ae_bicornis_Tr408 -GTAGCGGC ->Ae_tauschii_Tr351 -GCAGCGAT ->Ae_longissima_Tr355 -GTAGCGAC ->Ae_caudata_Tr139 -GCGCCGAT +>Ae_uniaristata_Tr357 +GCGCCGAC +>Ae_mutica_Tr237 +GCAGCGAC +>Ae_tauschii_Tr352 +GCAGCGAT +>Ae_searsii_Tr165 +GTAGCGAC +>Ae_sharonensis_Tr265 +GTAGCGAT +>Ae_bicornis_Tr407 +GTAGCGGC +>Ae_longissima_Tr241 +GTAGCGAC +>Ae_bicornis_Tr406 +GTAGCGGC +>Ae_caudata_Tr275 +GCGCCGAT +>H_vulgare_HVens23 +GTGCCAGT +>Ae_tauschii_Tr125 +GCAGCGGT +>Ae_uniaristata_Tr403 +GCGCCGAC +>Ae_uniaristata_Tr402 +GC------ +>Ae_comosa_Tr272 +GCGCCGAT +>Ae_longissima_Tr242 +GTAGCGAC +>Ae_comosa_Tr271 +GCGCCGAT +>Ae_searsii_Tr164 +GTAGCGAC +>Ae_speltoides_Tr251 +GTGCCAGT +>Ae_bicornis_Tr408 +GTAGCGGC +>Ae_tauschii_Tr351 +GCAGCGAT +>Ae_longissima_Tr355 +GTAGCGAC +>Ae_caudata_Tr139 +GCGCCGAT diff --git a/examples/Ae_bicornis_Tr406_Contig10132.aln b/examples/Ae_bicornis_Tr406_Contig10132.aln index 018e2ae6e..8c2641ed5 100644 --- a/examples/Ae_bicornis_Tr406_Contig10132.aln +++ b/examples/Ae_bicornis_Tr406_Contig10132.aln @@ -1,44 +1,44 @@ ->Ae_uniaristata_Tr357 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGAGTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCGCCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCGCATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACACCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCGCTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACGCGAGGGGGCAGCAAATCGCCAATGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCAAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGG------CAGCAGCAGCAATACTACCAGGCACAGCAGCATGGCTACTTCCAGGTGCAGCAGCAGCAGCAACATCAAATG---GCGGCGATGCCGCCG---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGAGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ ->Ae_mutica_Tr237 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------TTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTGTACAATATGCATTAGCCCTTGTTATAAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTCGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACC---AATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTGGATAGCCTATACGAAGACGATGCGAGGAGGCAGCAAATCGCCAATGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATG------CAGCAACAACATCAAATG---GCGGCGATGCCG--------------------------------------------------------------------------------------------------------------------------------- ->Ae_tauschii_Tr352 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------CTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTCTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACATTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCGGAAGAAGATGAACCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACGCAAGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATTGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGC---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---CTGGCGATGCCGTCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ ->Ae_searsii_Tr165 -TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTCTTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTTGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACC---AATGGGGATCTATTAAACTTGGATGAAGAATTGCGCCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCCTTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATG---CAGCAGCAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAGATT--- ->Ae_sharonensis_Tr265 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------CAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGATGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGCCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCTCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---GTGGCGATGCCGCCA---CAGATATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGCGCCCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ ->Ae_bicornis_Tr407 -TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATATGACGTAGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAATTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCATTCGCCATGTCCAGCAGCTTCGCGCCGCCATCGAACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATGGCGGCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGGGATCCGTTCAGCGCCCTCGTCCCCATGGCGAATCCGCCAAAGCAAAACAATCAGATT--- ->Ae_longissima_Tr241 -TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTCAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCTCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCAAATCCGCCAAAGCAAAACAATCAG------ ->Ae_bicornis_Tr406 -TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATATGACGTAGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAATTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCATTCGCCATGTCCAGCAGCTTCGCGCCGCCATCGAATGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATGGCGGCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGGGATCCGTTCAGCGCCCTCGTCCCCATGGCGAATCCGCCAAAGCAAAACAATCAG------ ->Ae_caudata_Tr275 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------AAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACCATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTTACCTAGTGACCACGAAGATGAAGCTCCACAGCAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCTATTGACAAAGCTGGGTGGGAATTGGCACTGGTCGCTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACACGAGGAGGCAGCAAATCGGCAATGTGACCTACACTGGCAGCGTCACGGTGAACCCATTTGACCCCAACGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTGGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAG---CAGCAACAACAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACAGCGAATCCGCCAAAGCAAAACAATCAGATT--- ->H_vulgare_HVens23 -------------------------------------------------------------------------------------------------------------------------------ATGAAATTACCGCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCGTGCGCAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAAGTGCAGCCTGCACAAATCACCTTGTACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAACCGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGACAGCAGGCAGAAAAGCTTTCTGCATATTATGACTACTGCAAACATCTTGAGCTCGCCAGGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAGGAGTACATCAGAGAAGCACCCCGTGTCAGCATCACGAGAAAGAGTGCGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACTGGAAGCCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAACCTGCACCTGAAGAAGAGCCACAATATATCGCTCTCTCAGAAGAAGATGAACCCCCACCATTGCCGCCAACC---ACTGGGGATCTATTAAACTTGGATGAGGAATTGCACCCCATGATTGCAGATCTCGAACAAAGCAACGCACTTGCTCTTGCTATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATGGACAAAGCTGGGTGGGAAATGGCACTGGTCACTGCACCAAGTAACCACACAAGCCAACCAGCTGTCAGCCAATTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGATGAGGCAAGGAGGCAGCAAATCGCCAGCGTGACCTACACCGGTGGCGTCACAGTGAACCCATTTGACCCCAACGACCCGTTCGCCATGTCCAACAGCTTCGCACCGCCATCGAATGTGCAGTTCGCCATGATGGGG------CAGCAGCAGCAGTACTACCAGGCACCGCAGCATGACTACTTCCAGATG---CAGCAGCAACAACATCAAATG---ATGTCGATGCCGCCACCCCAAACATACCAGCAGCAGCAGGCTCAGTATGCCGTGAACGCTGGATTATCCAACCCGTTCGGAGATCCGTTCAGCGCCCTTGTCACGATGGCGAATCCGCCAAAGCAAAACAAT------NNN ->Ae_tauschii_Tr125 -TTCAGGGATGACTCGAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCATTCTACCTACATGAACGCGCCGAATGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTCTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACCATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACACTCTCGGAAGAAGATGAACCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATTGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCGAACGTGCAGTTCGCCATGATGGGC---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---CTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCATTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ ->Ae_uniaristata_Tr403 -TTCAGGGATGACTCGAGCCCGTTAGCATGGGATTCCTCTGCTTGGGTTCGCTTGTATGCATTCTACCTACATGAACGTGTCGAATGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTATTAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGAGTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCGCCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCGCATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACACCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCGCTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACGCGAGGGGGCAGCAAATCGCCAATGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCAAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGG------CAGCAGCAGCAATACTACCAGGCACAGCAGCATGGCTACTTCCAGGTGCAGCAGCAGCAGCAACATCAAATG---GCGGCGATGCCGCCG---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGAGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAGATT--- ->Ae_uniaristata_Tr402 -TTCAGGGATGACTCGAGCCCGTTAGCATGGGATTCCTCTGCTTGGGTTCGCTTGTATGCATTCTACCTACATGAACGTGTCGAATGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTATTAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGAGTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCGCCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCGCATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACACCGGCCCCTCTAGACTTGTTTGCCATTGACAAA------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ->Ae_comosa_Tr272 -TTCAGGGATGACTCGAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCATTCTACCTACATGAACGCGTCGAGTGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGAACTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTATTAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGCAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCCGCCAACT---TCTGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTCGAACAGAGCAACGCACATGCTCTTGCCATTGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAACCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACACGAGGAGGCAGCAAATCGCCAGTGTGACCTACCCCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAGACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAGCAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCCTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ ->Ae_longissima_Tr242 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------GCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTCAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCTCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCAAATCCGCCAAAGCAAAACAATCAGATT--- ->Ae_comosa_Tr271 ----------------------------------------------------------------------------CGCGTCGAGTGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGAACTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTATTAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGCAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCCGCCAACT---TCTGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTCGAACAGAGCAACGCACATGCTCTTGCCATTGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAACCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACACGAGGAGGCAGCAAATCGCCAGTGTGACCTACCCCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAGACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAGCAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCCTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAGATT--- ->Ae_searsii_Tr164 -TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTCTTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTTGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACC---AATGGGGATCTATTAAACTTGGATGAAGAATTGCGCCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCCTTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATG---CAGCAGCAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ ->Ae_speltoides_Tr251 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCGTTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCGATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCAGACAAGCCAACAAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACACAAGGAGGCAGCAAATCGCCAGTGTGACCTACCCCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCCCGCCGCCATCGAACGTGCAGTTCGCCATGATGGGG------CAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGGTGCAGCAGCAGCAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCTGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAAT--------- ->Ae_bicornis_Tr408 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------TATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAATTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCATTCGCCATGTCCAGCAGCTTCGCGCCGCCATCGAACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATGGCGGCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGGGATCCGTTCAGCGCCCTCGTCCCCATGGCGAATCCGCCAAAGCAAAACAATCAG------ ->Ae_tauschii_Tr351 -TTCAGGGATGACTCGAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCATTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTCTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACATTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCGGAAGAAGATGAACCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACGCAAGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATTGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGC---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---CTGGCGATGCCGTCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ ->Ae_longissima_Tr355 -TTCAGAGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATATGACGTAGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTCAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACC---AAC---AATNNNNNNAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCTCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGCGCCCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAGATT--- ->Ae_caudata_Tr139 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------GCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACCATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTTACCTAGTGACCACGAAGATGAAGCTCCACAGCAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCTATTGACAAAGCTGGGTGGGAATTGGCACTGGTCGCTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACACGAGGAGGCAGCAAATCGGCAATGTGACCTACACTGGCAGCGTCACGGTGAACCCATTTGACCCCAACGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTGGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAG---CAACAACAACAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCCTTCGGCGATCCGTTCAGTGCTCTCGTCACGACAGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_uniaristata_Tr357 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGAGTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCGCCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCGCATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACACCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCGCTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACGCGAGGGGGCAGCAAATCGCCAATGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCAAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGG------CAGCAGCAGCAATACTACCAGGCACAGCAGCATGGCTACTTCCAGGTGCAGCAGCAGCAGCAACATCAAATG---GCGGCGATGCCGCCG---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGAGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_mutica_Tr237 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------TTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTGTACAATATGCATTAGCCCTTGTTATAAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTCGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACC---AATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTGGATAGCCTATACGAAGACGATGCGAGGAGGCAGCAAATCGCCAATGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATG------CAGCAACAACATCAAATG---GCGGCGATGCCG--------------------------------------------------------------------------------------------------------------------------------- +>Ae_tauschii_Tr352 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------CTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTCTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACATTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCGGAAGAAGATGAACCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACGCAAGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATTGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGC---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---CTGGCGATGCCGTCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_searsii_Tr165 +TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTCTTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTTGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACC---AATGGGGATCTATTAAACTTGGATGAAGAATTGCGCCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCCTTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATG---CAGCAGCAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_sharonensis_Tr265 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------CAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGATGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGCCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCTCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---GTGGCGATGCCGCCA---CAGATATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGCGCCCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_bicornis_Tr407 +TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATATGACGTAGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAATTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCATTCGCCATGTCCAGCAGCTTCGCGCCGCCATCGAACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATGGCGGCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGGGATCCGTTCAGCGCCCTCGTCCCCATGGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_longissima_Tr241 +TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTCAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCTCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCAAATCCGCCAAAGCAAAACAATCAG------ +>Ae_bicornis_Tr406 +TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATATGACGTAGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAATTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCATTCGCCATGTCCAGCAGCTTCGCGCCGCCATCGAATGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATGGCGGCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGGGATCCGTTCAGCGCCCTCGTCCCCATGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_caudata_Tr275 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------AAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACCATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTTACCTAGTGACCACGAAGATGAAGCTCCACAGCAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCTATTGACAAAGCTGGGTGGGAATTGGCACTGGTCGCTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACACGAGGAGGCAGCAAATCGGCAATGTGACCTACACTGGCAGCGTCACGGTGAACCCATTTGACCCCAACGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTGGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAG---CAGCAACAACAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACAGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>H_vulgare_HVens23 +------------------------------------------------------------------------------------------------------------------------------ATGAAATTACCGCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCGTGCGCAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAAGTGCAGCCTGCACAAATCACCTTGTACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAACCGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGACAGCAGGCAGAAAAGCTTTCTGCATATTATGACTACTGCAAACATCTTGAGCTCGCCAGGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAGGAGTACATCAGAGAAGCACCCCGTGTCAGCATCACGAGAAAGAGTGCGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACTGGAAGCCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAACCTGCACCTGAAGAAGAGCCACAATATATCGCTCTCTCAGAAGAAGATGAACCCCCACCATTGCCGCCAACC---ACTGGGGATCTATTAAACTTGGATGAGGAATTGCACCCCATGATTGCAGATCTCGAACAAAGCAACGCACTTGCTCTTGCTATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATGGACAAAGCTGGGTGGGAAATGGCACTGGTCACTGCACCAAGTAACCACACAAGCCAACCAGCTGTCAGCCAATTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGATGAGGCAAGGAGGCAGCAAATCGCCAGCGTGACCTACACCGGTGGCGTCACAGTGAACCCATTTGACCCCAACGACCCGTTCGCCATGTCCAACAGCTTCGCACCGCCATCGAATGTGCAGTTCGCCATGATGGGG------CAGCAGCAGCAGTACTACCAGGCACCGCAGCATGACTACTTCCAGATG---CAGCAGCAACAACATCAAATG---ATGTCGATGCCGCCACCCCAAACATACCAGCAGCAGCAGGCTCAGTATGCCGTGAACGCTGGATTATCCAACCCGTTCGGAGATCCGTTCAGCGCCCTTGTCACGATGGCGAATCCGCCAAAGCAAAACAAT------NNN +>Ae_tauschii_Tr125 +TTCAGGGATGACTCGAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCATTCTACCTACATGAACGCGCCGAATGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTCTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACCATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACACTCTCGGAAGAAGATGAACCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATTGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCGAACGTGCAGTTCGCCATGATGGGC---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---CTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCATTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_uniaristata_Tr403 +TTCAGGGATGACTCGAGCCCGTTAGCATGGGATTCCTCTGCTTGGGTTCGCTTGTATGCATTCTACCTACATGAACGTGTCGAATGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTATTAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGAGTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCGCCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCGCATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACACCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCGCTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACGCGAGGGGGCAGCAAATCGCCAATGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCAAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGG------CAGCAGCAGCAATACTACCAGGCACAGCAGCATGGCTACTTCCAGGTGCAGCAGCAGCAGCAACATCAAATG---GCGGCGATGCCGCCG---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGAGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_uniaristata_Tr402 +TTCAGGGATGACTCGAGCCCGTTAGCATGGGATTCCTCTGCTTGGGTTCGCTTGTATGCATTCTACCTACATGAACGTGTCGAATGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTATTAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGAGTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCGCCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCGCATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACACCGGCCCCTCTAGACTTGTTTGCCATTGACAAA------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +>Ae_comosa_Tr272 +TTCAGGGATGACTCGAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCATTCTACCTACATGAACGCGTCGAGTGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGAACTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTATTAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGCAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCCGCCAACT---TCTGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTCGAACAGAGCAACGCACATGCTCTTGCCATTGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAACCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACACGAGGAGGCAGCAAATCGCCAGTGTGACCTACCCCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAGACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAGCAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCCTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_longissima_Tr242 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------GCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTCAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCTCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCAAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_comosa_Tr271 +---------------------------------------------------------------------------CGCGTCGAGTGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGAACTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTATTAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGCAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCCGCCAACT---TCTGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTCGAACAGAGCAACGCACATGCTCTTGCCATTGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAACCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACACGAGGAGGCAGCAAATCGCCAGTGTGACCTACCCCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAGACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAGCAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCCTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_searsii_Tr164 +TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTCTTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTTGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACC---AATGGGGATCTATTAAACTTGGATGAAGAATTGCGCCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCCTTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATG---CAGCAGCAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_speltoides_Tr251 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCGTTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCGATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCAGACAAGCCAACAAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACACAAGGAGGCAGCAAATCGCCAGTGTGACCTACCCCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCCCGCCGCCATCGAACGTGCAGTTCGCCATGATGGGG------CAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGGTGCAGCAGCAGCAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCTGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAAT--------- +>Ae_bicornis_Tr408 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------TATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAATTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCATTCGCCATGTCCAGCAGCTTCGCGCCGCCATCGAACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATGGCGGCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGGGATCCGTTCAGCGCCCTCGTCCCCATGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_tauschii_Tr351 +TTCAGGGATGACTCGAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCATTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTCTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACATTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCGGAAGAAGATGAACCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACGCAAGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATTGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGC---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---CTGGCGATGCCGTCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_longissima_Tr355 +TTCAGAGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATATGACGTAGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTCAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACC---AAC---AATNNNNNNAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCTCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGCGCCCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_caudata_Tr139 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------GCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACCATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTTACCTAGTGACCACGAAGATGAAGCTCCACAGCAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCTATTGACAAAGCTGGGTGGGAATTGGCACTGGTCGCTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACACGAGGAGGCAGCAAATCGGCAATGTGACCTACACTGGCAGCGTCACGGTGAACCCATTTGACCCCAACGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTGGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAG---CAACAACAACAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCCTTCGGCGATCCGTTCAGTGCTCTCGTCACGACAGCGAATCCGCCAAAGCAAAACAATCAGATT--- diff --git a/examples/Ae_bicornis_Tr406_Contig10722.aln b/examples/Ae_bicornis_Tr406_Contig10722.aln index 3d4e33cf4..5a9702fcb 100644 --- a/examples/Ae_bicornis_Tr406_Contig10722.aln +++ b/examples/Ae_bicornis_Tr406_Contig10722.aln @@ -1,88 +1,88 @@ ->Ae_longissima_Tr242 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTTATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_mutica_Tr237 ----CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAAGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTACGCCGTGTCTCTCATCAAATGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATTGTCAGTTGATTCACTGAGTGAGGAACTTCAAGTATTAAACTCTGCAAAAAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGAAGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCTGGACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGAAAGAACTTGAAGCTACCGCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAATAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGCGAGATGTTGCGCCTAAGGAGGCAGATTAGCGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCTTATACTGTAAGAGTGAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_longissima_Tr241 ----------GAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTTATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_uniaristata_Tr357 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCAGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTAGAGAGCAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTTGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGACGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTCTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAACGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCCGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAACACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGAGAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_umbellulata_Tr266 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTGTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACAGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGGTGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCGGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGAGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCCAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTTGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAACAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTGGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTATGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_mutica_Tr329 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATAATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTACGCCGTGTCTCTCATCAAATGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATTGTCAGTTGATTCACTGAGTGAGGAACTTCAAGTATTAAACTCTGCAAAAAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGAAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGCTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCTTATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_tauschii_Tr125 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAGCTCCTCTGCTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTCTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTGGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAGTTGATTCACTCAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTAAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCTGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_searsii_Tr165 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGACGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAAATTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAAAATGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGCGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->H_vulgare_HVens23 ----CTTGATGAGACAAAGGATGTCCCAAAGGTGGATGAACCTCAGACTGGTGGGACTATGGTTGATGAACCTCAGACTGGTGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCTGAATCACCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCTGGCCTTCTGAATGCAATTGCAGTTATTGCCTCAGGCGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCAATCTCATCGATGAGGGAGACATATGAAAAAAGGTTATTAGAGCAGCAAGCGGCACAAAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGTCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGATTTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGCGATTAGAAAGTAGTATTGATAAAGCTGGGAATGATAAAGAAGTGCTTGAAGCCCAACTGACAGAAAAGTTTGGTGAAATGAGTGATTTGGAGGAAAAATTAAGTCTTCTCAGCCAACAGAATGATAGTAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACTAAAGAGAGTCTTGAATTTGCAAATGCTAAAATACAACAGCTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCTTCAATTGACTCACTGAATGAGAAACTTCAAGCATTAAACTCTGCAAAGAAGGAAGCTGATGAAAAAATAAATGAGCTAATCAAAGAGTGTACAGACTTGAAGGCTTCTTCTGAGATGAGAGCGAATCATGATTCTGAATTATTGTCTGAGAAAGATGATCTGATCAAACAACTGGAAGAAAAGCTCTCTGTTGCACTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGAGTTGAACAAGGAATTGGATTCCACCAAAGCAATGTTAGACGATGAAGTTGCGGCACTGAAAAGTCTTAGAGATCTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAATGAACAAGGACCTGTCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCAAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATGTAAAGCTCTATCAGATGAAGTGGTGTCAGCTAAAGAGATGGTTCAAAAGGGACAGGAAGAACTTGAAGCTACCTCTAATGGGCTTGCTTCTGCTGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAATTTGAATCCACCACACAGGAGCTTGTTGATGAAAGGAGAGTTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTGGACGAGATGAACACGAGTGCACTGTCACTATCTAAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAGGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACGAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGTCTAAGAAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTTCCCAGAACAAGTGTTGCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACGCAGAAGGCTGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGTGCATCGCGA ->Ae_caudata_Tr276 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGTTGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGACTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGGTTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTTTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACTAGATCACTAAACGAGATGAACACAAGCGCAGTGTCACTCTCAGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACGTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTT---------------CCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_uniaristata_Tr403 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCAGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTAGAGAGCAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTTGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGACGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTCTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAACGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCCGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAACACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGAGAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_sharonensis_Tr265 ----------GAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAATTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCGCAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_umbellulata_Tr257 ----CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTGTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACAGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGGTGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCGGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGAGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCCAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTTGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAACAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTGGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTATGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_speltoides_Tr223 -ATGCTTGATGAGACAAAAGATGTCCCAAAT------------------------------GTGGATGAACCTCAGAATGGCGGGACTTTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGACAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGGATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTCGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGTTGCCACCAAAGCAATGCTAGATGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAATGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATCTCAAATCTCCAAAGCGAGTTCAGTGAAATGCGAGAAGGTCTGACTCACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCCCTATCAGATGAACTGGTCTCAGCTAAAGAGACGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCTGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAATGTCACTCTCTGAGGCGCTCGAGAGCACTCATTCCAAGAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACGGAAAGGGAGACTTTTGAAATGAGGTCTCGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCGCAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCCGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_comosa_Tr272 -ATGCTTGATGAGACAAAGGATGTCCAAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAGAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATAGGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTGGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAAATTCACACAACTAAAATTGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCAAGGAAAAAATAAATGAGCTAATTAAAGAGAGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCAAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGACGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTCAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTGTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTTGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTCCCCGGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGTAGTACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_mutica_Tr244 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGACAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATAATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTACGCCGTGTCTCTCATCAAATGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATTGTCAGTTGATTCACTGAGTGAGGAACTTCAAGTATTAAACTCTGCAAAAAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGAAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTTGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCAAGAGCAAGTTCGCCCACAGAGACGAGCAATGCTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCTTATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_caudata_Tr139 ----GTGACTGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCAGGACTATGGTTGGTGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAACGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGACTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGGTTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCATGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTTTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAACGTACTCGAAGCAGACCTGGATGAAGCAACTAGATCACTAAACGAGATGAACACAAGCGCAGTGTCACTCTCAGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACGTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_uniaristata_Tr402 ----CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCAGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTAGAGAGCAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTTGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGACGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTCTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAACGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCCGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAACACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGAGAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->T_urartu_Tr232 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACTTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCGGAGTATCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGCACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGATGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAAAACTTGAAGCTACCTCTAATGAGTTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATCGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCCGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAG---ACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGT--------- ->T_urartu_Tr315 ----CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACTTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCGGAGTATCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGCACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGATGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAAAACTTGAAGCTACCTCTAATGAGTTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATCGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCCGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAG---ACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGTGGGCCG--- ->Ae_longissima_Tr355 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTTATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_comosa_Tr271 ----------GAGACAAAGGATGTCCAAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAGAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATAGGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTGGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAAATTCACACAACTAAAATTGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCAAGGAAAAAATAAATGAGCTAATTAAAGAGAGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCAAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGACGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTCAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTGTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTTGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTCCCCGGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGTAGTACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_uniaristata_Tr404 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCTGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCCCTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGATGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTGGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCACACAACTAAAATTGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAACTGAGCTAATTAAAGAGAGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCAAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTCAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAAGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTGTCAGCTAAAGAGATGATTCAAAAGGGTCAAGAAGAACTTGTAGTTACCTCTAATGGGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTTGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGCATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTCCCTGGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGTAGTACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_mutica_Tr332 ----------GAGACAAAGGATGTCCCAAAGGTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATGAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTACGCCGTGTCTCTCATCAAATGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAGAAATGATCTTGCTTCTAAGATATTGTCAGTTGATTCACTGAGTGAGGAACTTCAAGTATTAAACTCTGCAAAAAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATGCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGAAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAACTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGAGGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAAATGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAACCAGCACTGCTCCAAGAGCAAATTCGCCCACAGAGACCAGCAATGCTCCGAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_speltoides_Tr323 -ATGCTTGATGAGACAAAAGATGTCCCAAAT------------------------------GTGGATGAACCTCAGAATGGCGGGACTTTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGACAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGGATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTCGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGTTGCCACCAAAGCAATGCTAGATGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAATGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATCTCAAATCTCCAAAGCGAGTTCAGTGAAATGCGAGAAGGTCTGACTCACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCCCTATCAGATGAACTGGTCTCAGCTAAAGAGACGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCTGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAATGTCACTCTCTGAGGCGCTCGAGAGCACTCATTCCAAGAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACGGAAAGGGAGACTTTTGAAATGAGGTCTCGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCGCAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCCGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ta_caputMedusae_TB2 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------ATGGATGAACCTCAGGCTGGCGGGACTATGATTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCGACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCTATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAAGTGACAGAAAAGGTTGGTGAAATGAACGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAACAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCTGAGGAAAAAATAAATGAGTTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTCAATCCACTGAAGAGACCCTAATTGATTCCCGAACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTTTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTGGACGAGATGAACACGAGTGCATTGTCACTATCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAGGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACGAGGCTTCAGACAGAGAGGGAGACTTTTGAAATGAGGTCTAGGCACCTGGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_bicornis_Tr408 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAAGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCCCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_speltoides_Tr251 -ATGCTTGATGAGACAAAAGATGTCCCAAAG------------------------------GTGGATGAACCTCAGAATGGCGGGACTTTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCTGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGACAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGGATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTCGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTTTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCTGGATTGAACAAGGAATTGGTTGCCACCAAAGCAATGCTAGATGATGAAGTTGCGGTACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGAAGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGGAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCATTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCCCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACGGAAAGGGAGACTTTTGAAATGAGGTCTCGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGCGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCGCAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTCAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->T_boeoticum_TS10 -------------------------------------------------------------------------------------------------------------------------------------CTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCACTTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACGGAAGAAGCAAGCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAGTTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAAGAAAAAATAAGTCTACTCAGCCAACAGAATGATAGCAAGGGGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAATCACGATTCCAAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAGGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCCGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCAAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCTTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTACCCAGAACAAGTGTTCCCACAGAGACCAGTCAGGCCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAGGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->S_vavilovii_Tr279 ----CTTGATGAGACAAAAGATGTCCCAAAGGTGGATGAACCTCAGGCTGGCGGAACTATGGTTGATGATCCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAAAACCTCTACCTGAAGCCCCTCAACCTGAATCATCCTTACCGGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCGACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGCGGGAGACCTATGAAAAAAGGTTATCAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGACGAATTCAGAAGAGAGAAGGCACAGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGGTGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCACCAAACAAAAGAGAGTCTTGAAGTTGCAAATGCTAAAATACAACAGCTGGAGGAAGAGATTCATACGACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTTATTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGCAAGCCGAGGAAAATATAAATGAGCTAATCAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCGAACTACTGTTTCAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTATGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGAATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTCGCGGCACTGAAAAGCCTTCGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAACCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTCCAAGCTTGGAGAGGCAGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGGTTCAAAAGGGCCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAACTGCTGGATGTGTACAAGAAGTTCGAATCCACCACGCAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTGGACGAGATGAACACGAGTGCATTGTCACTATCTAAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAGGCAGAGAAAGAAATGCTATCAAAAGCTCTTGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACGAGGCTTCAGACGGAGAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTCCCCAGAACAAGTCCATCGCCAGAAACCAGCACTGCTCCCAGAGCAAATAAGCCCACGGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCCGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCG------ ->Ae_searsii_Tr164 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGACGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAAATTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAAAATGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_tauschii_Tr352 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAGCTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGATCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTGGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAGTTGATTCACTCAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTAAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAATGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->T_urartu_Tr317 ----------GAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACTTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCGGAGTATCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGCACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACGGATGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAAAACTTGAAGCTACCTCTAATGAGTTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATCGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCCATGTTCCCCGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGTGGGCCG--- ->Ae_caudata_Tr275 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGTTGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAGGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGACTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGGTTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGACTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTTTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACTAGATCACTAAACGAGATGAACACAAGCGCAGTGTCACTCTCAGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACGTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTT---------------CCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_tauschii_Tr180 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAGCTCCTCTGCTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTCTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTGGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAGTTGATTCACTCAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGGTGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTAAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_sharonensis_Tr264 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAGACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGAATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTAAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTTCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGGAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCAAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCAAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Er_bonaepartis_TB1 -------------ACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGACTGGCCGGACTATGATTGAAGAACCTCAGACTGGCAGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCAGCCTTACCAGTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCTGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCGACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAAGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAACTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGAGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGGTGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAATCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCACCAAACTAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAGCTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCTTCAATTGAGTCACTGAGTGAGAAACTTCAAACATTAAATTCTGCAAAGAAGGAAGCCGATGAAAAAGTAAATGAGCTAATCAAAGAATGTACAGACTTGAAGGCTTCTTCTGAGATAAGAGCGAATCATGATTCCGAATTATTGTCTGAGAAAGATGATCTGATCAAACAACTGGAAGAGAAGCTCTCTGTTGCACTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGAGTTGAACAAGGAGTTGGATGCCACCAAAGCAATGCTAGACGACGAAGTCGCGGCACTGAAAAGTCTTAGAGATTTACTCAAATCCACTGAAGAGACCCTAAGTGATTCCCGTACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAATGAACAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCAAGTTCGATGAAACGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGGTTCAAAAGGGACAGGAAAAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCTGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAATCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTGGACGAGATGAACACGAGTGCATTGTCACTATCTAAGGCGCTAGAGAGCACTCATTCCAAGAATGCGACTCTTGAGGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAAAGAAAATGACGATTGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGACAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCAGTGCTCCAAGAGCAAGTTCGCCCACAGAGATCAGCAATGTTCCCAGTACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGCCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACGGTAAGAGTAAAGGCTAGAAGAGGAAAAGGTGGTGCGTTGCGA ->Ae_bicornis_Tr406 ----CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCTATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCCTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTAGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAAGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCCCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_searsii_Tr161 ----------------------------------------------------------------------------------------------------------------------------------------------------CAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAAATTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAAAATGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->Ae_umbellulata_Tr268 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTGTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACAGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGGTGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCGGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGAGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCCAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTTGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAACAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTGGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTATGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- ->T_urartu_Tr309 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACTTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCGGAGTATCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGCACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACGGATGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAAAACTTGAAGCTACCTCTAATGAGTTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATCGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCCATGTTCCCCGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGT--------- ->Ae_tauschii_Tr351 -ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAGCTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGATCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTGGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAGTTGATTCACTCAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTAAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAATGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_bicornis_Tr407 ----CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCTATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTGTAAATGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCCTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTAGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAAGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCCCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA ->Ae_speltoides_Tr320 -ATGCTTGATGAGACAAAAGATGTCCCAAAG------------------------------GTGGATGAACCTCAGAATGGCGGGACTTTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCTGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGACAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGGATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTCGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTTTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCTGGATTGAACAAGGAATTGGTTGCCACCAAAGCAATGCTAGATGATGAAGTTGCGGTACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGAAGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGGAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCATTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCCCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACGGAAAGGGAGACTTTTGAAATGAGGTCTCGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGCGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCGCAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTCAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_longissima_Tr242 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTTATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_mutica_Tr237 +---CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAAGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTACGCCGTGTCTCTCATCAAATGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATTGTCAGTTGATTCACTGAGTGAGGAACTTCAAGTATTAAACTCTGCAAAAAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGAAGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCTGGACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGAAAGAACTTGAAGCTACCGCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAATAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGCGAGATGTTGCGCCTAAGGAGGCAGATTAGCGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCTTATACTGTAAGAGTGAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_longissima_Tr241 +---------GAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTTATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_uniaristata_Tr357 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCAGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTAGAGAGCAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTTGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGACGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTCTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAACGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCCGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAACACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGAGAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_umbellulata_Tr266 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTGTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACAGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGGTGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCGGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGAGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCCAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTTGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAACAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTGGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTATGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_mutica_Tr329 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATAATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTACGCCGTGTCTCTCATCAAATGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATTGTCAGTTGATTCACTGAGTGAGGAACTTCAAGTATTAAACTCTGCAAAAAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGAAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGCTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCTTATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_tauschii_Tr125 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAGCTCCTCTGCTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTCTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTGGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAGTTGATTCACTCAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTAAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCTGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_searsii_Tr165 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGACGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAAATTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAAAATGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGCGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>H_vulgare_HVens23 +---CTTGATGAGACAAAGGATGTCCCAAAGGTGGATGAACCTCAGACTGGTGGGACTATGGTTGATGAACCTCAGACTGGTGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCTGAATCACCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCTGGCCTTCTGAATGCAATTGCAGTTATTGCCTCAGGCGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCAATCTCATCGATGAGGGAGACATATGAAAAAAGGTTATTAGAGCAGCAAGCGGCACAAAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGTCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGATTTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGCGATTAGAAAGTAGTATTGATAAAGCTGGGAATGATAAAGAAGTGCTTGAAGCCCAACTGACAGAAAAGTTTGGTGAAATGAGTGATTTGGAGGAAAAATTAAGTCTTCTCAGCCAACAGAATGATAGTAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACTAAAGAGAGTCTTGAATTTGCAAATGCTAAAATACAACAGCTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCTTCAATTGACTCACTGAATGAGAAACTTCAAGCATTAAACTCTGCAAAGAAGGAAGCTGATGAAAAAATAAATGAGCTAATCAAAGAGTGTACAGACTTGAAGGCTTCTTCTGAGATGAGAGCGAATCATGATTCTGAATTATTGTCTGAGAAAGATGATCTGATCAAACAACTGGAAGAAAAGCTCTCTGTTGCACTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGAGTTGAACAAGGAATTGGATTCCACCAAAGCAATGTTAGACGATGAAGTTGCGGCACTGAAAAGTCTTAGAGATCTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAATGAACAAGGACCTGTCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCAAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATGTAAAGCTCTATCAGATGAAGTGGTGTCAGCTAAAGAGATGGTTCAAAAGGGACAGGAAGAACTTGAAGCTACCTCTAATGGGCTTGCTTCTGCTGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAATTTGAATCCACCACACAGGAGCTTGTTGATGAAAGGAGAGTTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTGGACGAGATGAACACGAGTGCACTGTCACTATCTAAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAGGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACGAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGTCTAAGAAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTTCCCAGAACAAGTGTTGCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACGCAGAAGGCTGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGTGCATCGCGA +>Ae_caudata_Tr276 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGTTGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGACTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGGTTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTTTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACTAGATCACTAAACGAGATGAACACAAGCGCAGTGTCACTCTCAGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACGTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTT---------------CCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_uniaristata_Tr403 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCAGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTAGAGAGCAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTTGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGACGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTCTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAACGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCCGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAACACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGAGAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_sharonensis_Tr265 +---------GAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAATTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCGCAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_umbellulata_Tr257 +---CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTGTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACAGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGGTGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCGGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGAGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCCAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTTGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAACAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTGGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTATGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_speltoides_Tr223 +ATGCTTGATGAGACAAAAGATGTCCCAAAT------------------------------GTGGATGAACCTCAGAATGGCGGGACTTTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGACAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGGATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTCGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGTTGCCACCAAAGCAATGCTAGATGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAATGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATCTCAAATCTCCAAAGCGAGTTCAGTGAAATGCGAGAAGGTCTGACTCACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCCCTATCAGATGAACTGGTCTCAGCTAAAGAGACGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCTGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAATGTCACTCTCTGAGGCGCTCGAGAGCACTCATTCCAAGAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACGGAAAGGGAGACTTTTGAAATGAGGTCTCGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCGCAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCCGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_comosa_Tr272 +ATGCTTGATGAGACAAAGGATGTCCAAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAGAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATAGGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTGGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAAATTCACACAACTAAAATTGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCAAGGAAAAAATAAATGAGCTAATTAAAGAGAGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCAAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGACGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTCAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTGTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTTGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTCCCCGGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGTAGTACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_mutica_Tr244 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGACAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATAATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTACGCCGTGTCTCTCATCAAATGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATTGTCAGTTGATTCACTGAGTGAGGAACTTCAAGTATTAAACTCTGCAAAAAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGAAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTTGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCAAGAGCAAGTTCGCCCACAGAGACGAGCAATGCTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCTTATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_caudata_Tr139 +---GTGACTGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCAGGACTATGGTTGGTGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAACGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGACTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGGTTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCATGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTTTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAACGTACTCGAAGCAGACCTGGATGAAGCAACTAGATCACTAAACGAGATGAACACAAGCGCAGTGTCACTCTCAGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACGTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_uniaristata_Tr402 +---CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCAGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTAGAGAGCAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTTGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGACGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTCTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAACGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCCGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAACACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGAGAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>T_urartu_Tr232 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACTTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCGGAGTATCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGCACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGATGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAAAACTTGAAGCTACCTCTAATGAGTTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATCGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCCGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAG---ACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGT--------- +>T_urartu_Tr315 +---CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACTTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCGGAGTATCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGCACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGATGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAAAACTTGAAGCTACCTCTAATGAGTTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATCGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCCGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAG---ACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGTGGGCCG--- +>Ae_longissima_Tr355 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTTATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_comosa_Tr271 +---------GAGACAAAGGATGTCCAAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAGAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATAGGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTGGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAAATTCACACAACTAAAATTGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCAAGGAAAAAATAAATGAGCTAATTAAAGAGAGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCAAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGACGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTCAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTGTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTTGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTCCCCGGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGTAGTACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_uniaristata_Tr404 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCTGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCCCTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGATGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTGGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCACACAACTAAAATTGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAACTGAGCTAATTAAAGAGAGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCAAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTCAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAAGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTGTCAGCTAAAGAGATGATTCAAAAGGGTCAAGAAGAACTTGTAGTTACCTCTAATGGGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTTGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGCATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTCCCTGGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGTAGTACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_mutica_Tr332 +---------GAGACAAAGGATGTCCCAAAGGTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATGAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTACGCCGTGTCTCTCATCAAATGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAGAAATGATCTTGCTTCTAAGATATTGTCAGTTGATTCACTGAGTGAGGAACTTCAAGTATTAAACTCTGCAAAAAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATGCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGAAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAACTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGAGGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAAATGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAACCAGCACTGCTCCAAGAGCAAATTCGCCCACAGAGACCAGCAATGCTCCGAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_speltoides_Tr323 +ATGCTTGATGAGACAAAAGATGTCCCAAAT------------------------------GTGGATGAACCTCAGAATGGCGGGACTTTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGACAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGGATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTCGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGTTGCCACCAAAGCAATGCTAGATGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAATGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATCTCAAATCTCCAAAGCGAGTTCAGTGAAATGCGAGAAGGTCTGACTCACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCCCTATCAGATGAACTGGTCTCAGCTAAAGAGACGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCTGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAATGTCACTCTCTGAGGCGCTCGAGAGCACTCATTCCAAGAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACGGAAAGGGAGACTTTTGAAATGAGGTCTCGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCGCAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCCGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ta_caputMedusae_TB2 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------ATGGATGAACCTCAGGCTGGCGGGACTATGATTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCGACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCTATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAAGTGACAGAAAAGGTTGGTGAAATGAACGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAACAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCTGAGGAAAAAATAAATGAGTTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTCAATCCACTGAAGAGACCCTAATTGATTCCCGAACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTTTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTGGACGAGATGAACACGAGTGCATTGTCACTATCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAGGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACGAGGCTTCAGACAGAGAGGGAGACTTTTGAAATGAGGTCTAGGCACCTGGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_bicornis_Tr408 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAAGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCCCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_speltoides_Tr251 +ATGCTTGATGAGACAAAAGATGTCCCAAAG------------------------------GTGGATGAACCTCAGAATGGCGGGACTTTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCTGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGACAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGGATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTCGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTTTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCTGGATTGAACAAGGAATTGGTTGCCACCAAAGCAATGCTAGATGATGAAGTTGCGGTACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGAAGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGGAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCATTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCCCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACGGAAAGGGAGACTTTTGAAATGAGGTCTCGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGCGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCGCAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTCAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>T_boeoticum_TS10 +------------------------------------------------------------------------------------------------------------------------------------CTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCACTTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACGGAAGAAGCAAGCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAGTTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAAGAAAAAATAAGTCTACTCAGCCAACAGAATGATAGCAAGGGGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAATCACGATTCCAAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAGGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCCGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCAAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCTTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTACCCAGAACAAGTGTTCCCACAGAGACCAGTCAGGCCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAGGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>S_vavilovii_Tr279 +---CTTGATGAGACAAAAGATGTCCCAAAGGTGGATGAACCTCAGGCTGGCGGAACTATGGTTGATGATCCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAAAACCTCTACCTGAAGCCCCTCAACCTGAATCATCCTTACCGGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCGACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGCGGGAGACCTATGAAAAAAGGTTATCAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGACGAATTCAGAAGAGAGAAGGCACAGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGGTGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCACCAAACAAAAGAGAGTCTTGAAGTTGCAAATGCTAAAATACAACAGCTGGAGGAAGAGATTCATACGACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTTATTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGCAAGCCGAGGAAAATATAAATGAGCTAATCAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCGAACTACTGTTTCAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTATGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGAATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTCGCGGCACTGAAAAGCCTTCGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAACCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTCCAAGCTTGGAGAGGCAGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGGTTCAAAAGGGCCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAACTGCTGGATGTGTACAAGAAGTTCGAATCCACCACGCAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTGGACGAGATGAACACGAGTGCATTGTCACTATCTAAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAGGCAGAGAAAGAAATGCTATCAAAAGCTCTTGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACGAGGCTTCAGACGGAGAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTCCCCAGAACAAGTCCATCGCCAGAAACCAGCACTGCTCCCAGAGCAAATAAGCCCACGGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCCGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCG------ +>Ae_searsii_Tr164 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGACGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAAATTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAAAATGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_tauschii_Tr352 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAGCTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGATCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTGGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAGTTGATTCACTCAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTAAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAATGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>T_urartu_Tr317 +---------GAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACTTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCGGAGTATCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGCACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACGGATGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAAAACTTGAAGCTACCTCTAATGAGTTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATCGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCCATGTTCCCCGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGTGGGCCG--- +>Ae_caudata_Tr275 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGTTGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAGGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGACTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGGTTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGACTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTTTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACTAGATCACTAAACGAGATGAACACAAGCGCAGTGTCACTCTCAGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACGTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTT---------------CCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_tauschii_Tr180 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAGCTCCTCTGCTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTCTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTGGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAGTTGATTCACTCAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGGTGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTAAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_sharonensis_Tr264 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAGACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGAATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTAAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTTCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGGAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCAAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCAAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Er_bonaepartis_TB1 +------------ACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGACTGGCCGGACTATGATTGAAGAACCTCAGACTGGCAGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCAGCCTTACCAGTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCTGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCGACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAAGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAACTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGAGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGGTGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAATCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCACCAAACTAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAGCTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCTTCAATTGAGTCACTGAGTGAGAAACTTCAAACATTAAATTCTGCAAAGAAGGAAGCCGATGAAAAAGTAAATGAGCTAATCAAAGAATGTACAGACTTGAAGGCTTCTTCTGAGATAAGAGCGAATCATGATTCCGAATTATTGTCTGAGAAAGATGATCTGATCAAACAACTGGAAGAGAAGCTCTCTGTTGCACTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGAGTTGAACAAGGAGTTGGATGCCACCAAAGCAATGCTAGACGACGAAGTCGCGGCACTGAAAAGTCTTAGAGATTTACTCAAATCCACTGAAGAGACCCTAAGTGATTCCCGTACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAATGAACAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCAAGTTCGATGAAACGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGGTTCAAAAGGGACAGGAAAAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCTGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAATCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTGGACGAGATGAACACGAGTGCATTGTCACTATCTAAGGCGCTAGAGAGCACTCATTCCAAGAATGCGACTCTTGAGGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAAAGAAAATGACGATTGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGACAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCAGTGCTCCAAGAGCAAGTTCGCCCACAGAGATCAGCAATGTTCCCAGTACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGCCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACGGTAAGAGTAAAGGCTAGAAGAGGAAAAGGTGGTGCGTTGCGA +>Ae_bicornis_Tr406 +---CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCTATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCCTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTAGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAAGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCCCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_searsii_Tr161 +---------------------------------------------------------------------------------------------------------------------------------------------------CAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAAATTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAAAATGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_umbellulata_Tr268 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTGTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACAGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGGTGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCGGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGAGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCCAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTTGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAACAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTGGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTATGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>T_urartu_Tr309 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACTTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCGGAGTATCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGCACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACGGATGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAAAACTTGAAGCTACCTCTAATGAGTTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATCGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCCATGTTCCCCGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGT--------- +>Ae_tauschii_Tr351 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAGCTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGATCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTGGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAGTTGATTCACTCAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTAAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAATGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_bicornis_Tr407 +---CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCTATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTGTAAATGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCCTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTAGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAAGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCCCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_speltoides_Tr320 +ATGCTTGATGAGACAAAAGATGTCCCAAAG------------------------------GTGGATGAACCTCAGAATGGCGGGACTTTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCTGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGACAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGGATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTCGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTTTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCTGGATTGAACAAGGAATTGGTTGCCACCAAAGCAATGCTAGATGATGAAGTTGCGGTACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGAAGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGGAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCATTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCCCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACGGAAAGGGAGACTTTTGAAATGAGGTCTCGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGCGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCGCAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTCAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- diff --git a/examples/Swadesh.csv b/examples/Swadesh.csv index 56b15cbe5..8275092bf 100644 --- a/examples/Swadesh.csv +++ b/examples/Swadesh.csv @@ -1,6 +1,6 @@ -taxon,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 -English,1,1,1,1,1,1,1,1,1,1 -German,1,2,2,1,2,2,1,2,1,2 -Norwegian,1,2,1,1,3,3,1,3,1,1 -Spanish,1,2,2,2,4,4,2,4,2,3 -Portuguese,1,2,2,2,4,4,2,4,2,3 +taxon,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 +English,1,1,1,1,1,1,1,1,1,1 +German,1,2,2,1,2,2,1,2,1,2 +Norwegian,1,2,1,1,3,3,1,3,1,1 +Spanish,1,2,2,2,4,4,2,4,2,3 +Portuguese,1,2,2,2,4,4,2,4,2,3 diff --git a/examples/astral.tre b/examples/astral.tre index b520b5d3e..276230bd4 100644 --- a/examples/astral.tre +++ b/examples/astral.tre @@ -1,102 +1,102 @@ -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)1:0.5436154465889816)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.97:0.3543734469504531)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:2.335374915817036,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:2.335374915817036,(B,A)1:1.4190841839428816)1:0.5436154465889816)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.97:0.3543734469504531)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.96:0.3543734469504531)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.97:0.3543734469504531)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.96:0.3543734469504531)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.96:0.32047189527477177)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.97:0.3543734469504531)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.92:0.2876820724517809)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.97:0.3543734469504531)); -(E,(O,((C,D)1:2.335374915817036,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.97:0.3543734469504531)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.1567199194753903)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4258324109325983)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); -(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.97:0.3543734469504531)); -(E,(O,((C,D)100.0,(A,B)100.0)100.0)); -(E,(O,((C,D)100.0:3.0285220963769826,(B,A)100.0:1.3237740041385568)100.0:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)1:0.5436154465889816)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.97:0.3543734469504531)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:2.335374915817036,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:2.335374915817036,(B,A)1:1.4190841839428816)1:0.5436154465889816)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.97:0.3543734469504531)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.96:0.3543734469504531)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.97:0.3543734469504531)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.96:0.3543734469504531)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.96:0.32047189527477177)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.2367626271489267)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.97:0.3543734469504531)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.92:0.2876820724517809)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.97:0.3543734469504531)); +(E,(O,((C,D)1:2.335374915817036,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.98:0.38946476676172315)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.97:0.3543734469504531)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.1567199194753903)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4258324109325983)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.4190841839428816)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.3237740041385568)0.99:0.4635727389154453)); +(E,(O,((C,D)1:3.0285220963769826,(B,A)1:1.524444699600708)0.97:0.3543734469504531)); +(E,(O,((C,D)100.0,(A,B)100.0)100.0)); +(E,(O,((C,D)100.0:3.0285220963769826,(B,A)100.0:1.3237740041385568)100.0:0.4635727389154453)); diff --git a/examples/bootsnaq.out b/examples/bootsnaq.out index e69e17a0e..304b2c745 100644 --- a/examples/bootsnaq.out +++ b/examples/bootsnaq.out @@ -1,100 +1,100 @@ -(C,D,((O,(E,#H7:::0.2321667195572249):0.40655870487080714):0.7083042224722244,(B,(A)#H7:::0.7678332804427751):10.0):10.0); -(C,D,((B,(A,#H7:9.892577202482824::0.11665493805886627):10.0):10.0,((O,E):0.435587525156129)#H7:0.17193616611414575::0.8833450619411337):9.95053465816285); -(C,D,((O,(E,#H7:::0.19558839012818185):0.31352433304125926):0.6640664435018641,(B,(A)#H7:::0.8044116098718181):10.0):10.0); -(C,D,((O,(E,#H7:::0.1955883903824113):0.313524366220726):0.6640664368936309,(B,(A)#H7:::0.8044116096175887):10.0):10.0); -(D,C,((B,(A,#H7:0.0::0.13415559781660125):10.0):9.988699830436277,((O,E):0.5829060893442204)#H7:0.0449729377813761::0.8658444021833988):9.961978587463063); -(C,D,((B,(A,#H7:0.0::0.11718743486337257):10.0):10.0,((O,E):0.468504710673929)#H7:0.13482820785981894::0.8828125651366274):9.909919198520198); -(C,D,((B,(A,#H7:0.0::0.1511542639383855):10.0):10.0,((O,E):0.46504356355623194)#H7:0.2550668661544012::0.8488457360616145):9.97287442391765); -(((O,(E,#H7:::0.19558839208203896):0.3135243164215907):0.6640664514648749,(B,(A)#H7:::0.8044116079179611):10.0):10.0,C,D); -(E,(O,((D,C):9.932243142414118,((A,B):0.7493504367804144)#H7:1.331829076044156::0.8330795130108796):0.7340864405537864):6.781383887343575,#H7:0.0::0.16692048698912043); -(D,C,((O,(E)#H7:::0.7181931299869297):1.1070630443653242,((A,B):0.48203049522991215,#H7:::0.28180687001307025):1.4649652615878772):10.0); -(C,D,((B,(A,#H7:0.0::0.1341627386478353):10.0):10.0,((O,E):0.583090406185628)#H7:0.044590891042569955::0.8658372613521648):9.999993325952085); -(C,D,((B,(A)#H7:::0.8044116111566435):10.0,(O,(E,#H7:::0.19558838884335655):0.3135242885110219):0.6640664151068564):10.0); -((D,C):9.84717967499181,(B,(A,#H7:0.0::0.1511110961266464):10.0):10.0,((O,E):0.46566821900769817)#H7:0.0026245166139281764::0.8488889038733536); -(D,C,((B,(A)#H7:::0.8044116100568192):10.0,(O,(E,#H7:::0.19558838994318084):0.3135238838874375):0.664066323224167):10.0); -(D,C,((O,(E,#H7:0.13335213183106956::0.234821671482812):5.0618371696268785):0.941302735356526,((B,A):0.8530487403638968)#H7:8.666542817250052::0.765178328517188):9.987373910219889); -((C,D):10.0,((B,A):0.7304500768590576,#H7:::0.4021080085238761):1.2234254426958329,(O,(E)#H7:::0.5978919914761238):1.9685438861985707); -(D,C,((B,(A)#H7:::0.7617640368527635):10.0,((O,#H7:::0.23823596314723652):0.18795323511409373,E):0.5381548125076079):10.0); -(C,D,((O,(E,#H7:::0.1955884077759933):0.31352401644418537):0.6640664135398032,(B,(A)#H7:::0.8044115922240067):10.0):10.0); -(C,D,((B,(A,#H7:0.0::0.15115420414107697):10.0):10.0,((O,E):0.4650415515372562)#H7:0.25506701399407505::0.8488457958589231):9.847694427161125); -(D,C,((O,(E,#H7:::0.19558839126040634):0.31352433394343593):0.6640664308569804,(B,(A)#H7:::0.8044116087395936):10.0):10.0); -(D,((B,(A,#H7:0.0::0.1675692564170113):1.2136437446611428):9.896650055044885,((O,E):0.46194048923448355)#H7:0.1529943637068513::0.8324307435829887):9.834944122917381,C); -(C,D,((B,(A)#H9:::0.79020152601114):10.0,(O,(E,#H9:::0.20979847398885995):1.1761675487346626):0.7730461289415069):10.0); -(C,D,(((A,#H7:0.0::0.13416262039349006):10.0,B):10.0,((O,E):0.5830967435455383)#H7:0.04458045907767828::0.86583737960651):9.869793129910137); -(C,D,((O,(E,#H7:0.0::0.20953431964558786):3.0995330453893786):1.000674325544878,((B,A):0.8520018507741483)#H7:1.3893861605440414::0.7904656803544121):9.988549674143021); -(C,D,((B,(A,#H7:0.0::0.15115430194154264):10.0):10.0,((O,E):0.4650451691346974)#H7:0.25506274046581884::0.8488456980584573):9.99954212528844); -(C,D,((B,(A,#H7:0.0::0.11718734196473335):10.0):10.0,((O,E):0.46850475327611696)#H7:0.13482814254362344::0.8828126580352667):9.999999074934715); -(C,D,(((O,E):0.5830960797898145)#H7:0.04458208742040545::0.8658372264322444,(B,(A,#H7:0.0::0.1341627735677556):10.0):10.0):9.882690089749653); -(C,D,((B,(A,#H7:0.0::0.13416246745527352):10.0):10.0,((O,E):0.5830895408090304)#H7:0.0445926434637898::0.8658375325447265):9.880186829782836); -(C,D,((B,(A)#H7:::0.8044116078537964):10.0,(O,(E,#H7:::0.19558839214620366):0.3135243069601881):0.6640664356944485):10.0); -(C,D,(((A,(B)#H7:::0.8636409086366929):10.0,(E,O):0.3715655386806172):10.0,#H7:::0.13635909136330718):8.053354724622574); -(C,D,((B,(A,#H7:0.0::0.13406755269912377):10.0):10.0,((E,O):0.36644131188922646)#H7:0.32077428798424595::0.8659324473008763):9.937376645123631); -(C,D,((B,(A,#H7:::0.1889424477026188):0.5628757071862271):2.0304319953420893,(O,(E)#H7:::0.8110575522973812):0.7047228687348902):10.0); -(C,D,((B,(A,#H7:0.0::0.1511542318360146):10.0):10.0,((O,E):0.46504576985732504)#H7:0.2550622337558699::0.8488457681639854):9.997562973958468); -(C,D,(((O,E):0.5343840607512291)#H7:0.0::0.8670199187941983,(B,(A,#H7:0.0::0.13298008120580174):10.0):10.0):9.865968868413901); -(C,D,((O,(E,#H7:::0.19558839435006736):0.31352413804757445):0.6640664251542547,(B,(A)#H7:::0.8044116056499326):10.0):10.0); -(C,D,((O,(E,#H7:::0.19558839247155368):0.31352431122410984):0.664066434953675,(B,(A)#H7:::0.8044116075284463):10.0):10.0); -(C,D,(((E,#H7:::0.19558839159222377):0.3135243347812405,O):0.6640664350695882,(B,(A)#H7:::0.8044116084077763):10.0):10.0); -(C,D,((O,(E)#H7:::0.7181925452316203):1.1070651219069176,((A,B):0.48203274320792816,#H7:::0.28180745476837965):1.4649633950281848):10.0); -(C,D,((O,(E,#H7:::0.19558838379861246):0.31352484091019284):0.6640663700788761,(B,(A)#H7:::0.8044116162013876):10.0):10.0); -(C,D,((O,(E,#H7:0.14058512566998274::0.23335184811216048):9.409387759083):0.9383077238258151,((A,B):0.8503263030700275)#H7:6.051081597693156::0.7666481518878395):9.990842664228794); -(C,D,((B,(A)#H7:::0.8044116074192188):10.0,(O,(E,#H7:::0.19558839258078117):0.31352437074354134):0.6640664412336827):10.0); -(C,D,((B,(A)#H7:::0.8044115827712203):10.0,(O,(E,#H7:::0.1955884172287797):0.3135232289353376):0.6640661010772118):10.0); -(C,D,((B,(A,#H7:0.0::0.11718734334525986):10.0):10.0,((O,E):0.46850284006504506)#H7:0.1348311641875659::0.8828126566547402):9.87792225382094); -(C,D,((B,(A,#H7:0.0::0.13297976613770618):10.0):10.0,((O,E):0.5343837395678875)#H7:0.0::0.8670202338622939):9.868211076535882); -(C,D,((B,(A,#H7:0.0::0.134162333195769):10.0):10.0,((O,E):0.5830884253403075)#H7:0.044592792495524475::0.865837666804231):9.872949233479575); -(C,D,((O,(E)#H7:::0.7181926032343305):1.1070639124653643,((B,A):0.482032083433577,#H7:::0.28180739676566946):1.4649619729255592):10.0); -(C,D,((B,(A,#H7:0.0::0.13406741263105032):10.0):10.0,((O,E):0.36644501943706387)#H7:0.3207657482275593::0.8659325873689496):9.999511171860279); -(C,D,((B,(A,#H7:0.0::0.15112695616740066):10.0):9.998353066011395,((O,E):0.46544374180031683)#H7:0.12077547692260805::0.8488730438325993):9.890015681211091); -(C,D,((B,(A,#H7:::0.19977943415418306):0.2488288806254244):2.159609608598549,(O,(E)#H7:::0.8002205658458169):0.9265712154066109):3.0599070511570243); -(C,D,((O,(E,#H7:0.0::0.20073283364107858):10.0):0.9745562665468471,((B,A):0.6139843229799435)#H7:10.0::0.7992671663589215):9.984050303063723); -(C,D,((B,(A,#H7:0.0::0.15115425215487888):10.0):10.0,((E,O):0.46504406876024246)#H7:0.25506419434222327::0.8488457478451211):9.87205348371995); -(C,D,((O,(E,#H7:::0.1845549929401468):1.7678209630626083):0.7447135084770502,(B,(A)#H7:::0.8154450070598532):10.0):10.0); -(D,C,((O,(E)#H7:::0.7181928230530086):1.1070636427623974,((B,A):0.4820322123457603,#H7:::0.2818071769469914):1.4649634999468808):10.0); -(D,C,((O,(E)#H7:::0.718192965965228):1.1070637658433597,((A,B):0.48203160864296085,#H7:::0.281807034034772):1.4649643801956547):10.0); -(C,D,((B,(A,#H7:0.0::0.13416267536658122):10.0):10.0,((O,E):0.583092881938582)#H7:0.0445871934870257::0.8658373246334188):9.998345938292625); -(C,D,((B,(A,#H7:0.0::0.13406728472743762):10.0):10.0,((O,E):0.36644426064357233)#H7:0.32076530179858936::0.8659327152725624):9.967520195546259); -(C,D,((O,(E,#H7:::0.19558839532828878):0.3135242602766149):0.6640664422599571,(B,(A)#H7:::0.8044116046717112):10.0):10.0); -(C,D,((O,(E,#H7:::0.1942002228875086):0.3149606561939673):0.6716635821447843,(B,(A)#H7:::0.8057997771124914):10.0):3.1085227284244215); -(C,D,(((O,E):0.33342970856858706)#H7:0.27490904929272025::0.8824820212453731,(B,(#H7:0.0::0.11751797875462688,A):8.13764106109905):2.866863536876749):9.97289963718264); -(C,D,((O,(E,#H7:::0.16508761868855204):1.6308101609508339):0.730391324918484,(B,(A)#H7:::0.834912381311448):10.0):10.0); -(C,D,((B,(A,#H7:0.0::0.1511953671413606):10.0):9.998333156872203,((O,E):0.4661171341250832)#H7:0.2533263305244876::0.8488046328586394):9.986237366345678); -(C,D,((B,(A,#H7:0.0::0.11858531934389191):4.6286993364265605):2.884678671044414,((O,E):0.33766418172147805)#H7:0.2701472337502917::0.8814146806561081):9.955568735530822); -(C,D,((B,(A,#H7:0.0::0.15112705596597545):10.0):10.0,((O,E):0.4654443211987999)#H7:0.12077399825773304::0.8488729440340246):9.99152501370758); -(C,D,(((O,E):0.4650442338864693)#H7:0.255063845030042::0.8488457530512488,(B,(A,#H7:0.0::0.1511542469487512):10.0):10.0):9.94850664006651); -(C,D,((B,(A,#H7:0.0::0.15111241543842693):10.0):10.0,((O,E):0.46567574417927904)#H7:0.0026122798977595923::0.8488875845615731):9.836829587073813); -(C,D,((O,(E,#H7:0.0::0.200732841873748):10.0):0.9745565181459647,((A,B):0.6139842430992303)#H7:10.0::0.799267158126252):9.910846273878983); -(C,D,((B,(A,#H7:::0.25001888963222807):0.6229824394994538):2.0893619515446287,(O,(E)#H7:::0.7499811103677719):0.9025301046957056):10.0); -(C,D,((B,(A)#H7:::0.8044116078302216):10.0,(O,(E,#H7:::0.19558839216977839):0.31352432262467406):0.6640664414054268):10.0); -(C,D,((B,(A,#H7:0.0::0.13297976947467927):10.0):10.0,((O,E):0.5343837039322803)#H7:0.0::0.8670202305253207):9.97645333438959); -(C,D,(((O,E):0.5830526512424845)#H7:0.04465057905932189::0.8658384697466008,(B,(#H7:0.0::0.13416153025339922,A):10.0):10.0):9.99149447133872); -(C,D,((O,(E,#H7:::0.19558839508419165):0.3135242563314496):0.6640664408937432,(B,(A)#H7:::0.8044116049158083):10.0):10.0); -(C,D,((B,(A,#H7:0.0::0.13406750671246734):10.0):10.0,((O,E):0.3664467168484901)#H7:0.32076337073865135::0.8659324932875326):9.877452054361305); -(C,D,((B,(A)#H7:::0.8044116086968263):10.0,(O,(#H7:::0.1955883913031737,E):0.3135244934011642):0.6640664786115202):10.0); -(C,D,((B,(A,#H9:0.0::0.15115250786824871):10.0):9.982486862358755,((O,E):0.4650408525140116)#H9:0.2550603760620874::0.8488474921317513):9.933579969978949); -(D,C,(((A,(B)#H7:::0.8464720209044769):10.0,(O,E):0.40121211524787154):10.0,#H7:::0.15352797909552304):9.243899538681974); -(C,((O,(E,#H7:::0.19558838969086373):0.313524456984185):0.6640664304037742,(B,(A)#H7:::0.8044116103091363):9.999999999999998):10.0,D); -(C,D,((B,(A,#H7:0.0::0.13416279973123874):10.0):10.0,((O,E):0.5830970027623557)#H7:0.04458040474940073::0.8658372002687613):9.859389049799022); -((B,((D,C):9.998293269554932,((O,E):0.4650450347000087)#H7:0.2550631011169392::0.8488457454435167):10.0):10.0,A,#H7:0.0::0.15115425455648338); -(C,D,((O,(E,#H7:::0.1955883897527049):0.3135244326643673):0.6640664266674219,(B,(A)#H7:::0.8044116102472951):10.0):10.0); -(C,D,((B,(A,#H7:0.0::0.13416268062912812):10.0):10.0,((O,E):0.5830612416587746)#H7:0.044633021750371794::0.8658373193708719):9.964997467765448); -(C,D,((O,(E,#H7:8.788850443231865::0.3172200231539885):1.3330362944059353):1.4152878628519385,((B,A):0.8951666500547869)#H7:9.999368288617557::0.6827799768460114):9.755665820033132); -(C,((B,(A,#H7:0.0::0.11752214122295564):7.976441445894574):2.8669812430132713,((O,E):0.3333958799481794)#H7:0.2749700238163984::0.8824778587770443):9.999989709512052,D); -(D,C,((O,(E)#H7:::0.785428043723932):1.066179357385685,((A,#H7:::0.21457195627606798):0.7271837838790415,B):1.8834232574566363):10.0); -(((B,(A)#H7:::0.8154450056029091):10.0,(O,(E,#H7:::0.18455499439709086):1.7678210063313078):0.7447135193145014):10.0,C,D); -(C,D,((B,(A,#H7:0.0::0.11757539879686588):7.145648955176491):2.867966052176756,((O,E):0.3335576887041395)#H7:0.2748270242237591::0.8824246012031342):9.99508012259847); -(D,C,((O,(E)#H7:::0.7683956850808571):1.0343221414276265,(B,(#H7:::0.23160431491914288,A):0.2165495184051004):1.7070669574138668):10.0); -(C,D,((B,(#H7:0.0::0.1340537935248692,A):10.0):10.0,((O,E):0.3666351088234092)#H7:0.1957655582725551::0.8659462064751308):9.99998356749523); -(C,D,((O,(E,#H7:0.0::0.16717632248073983):9.723451812954236):0.7291842268539358,((B,A):0.44790238633320234)#H7:10.0::0.8328236775192601):10.0); -(C,D,((B,(A)#H7:::0.8044116112662316):10.0,((E,#H7:::0.19558838873376833):0.3135243235750905,O):0.6640664528630428):10.0); -(C,D,((O,(E,#H7:::0.19558842613119162):0.31352444339152713):0.6640664795731094,(B,(A)#H7:::0.8044115738688083):10.0):10.0); -(C,D,((B,(A,#H7:0.0::0.13416281725947196):10.0):10.0,((O,E):0.5830966830477248)#H7:0.04458143337802764::0.865837182740528):9.996908811975388); -(C,D,((O,(E,#H7:0.13505001537956496::0.2347598663664569):5.101598826556241):0.9411561984908896,((B,A):0.8526759579446712)#H7:9.635445985422477::0.765240133633543):9.986243392503871); -(C,D,((B,(A,#H7:0.0::0.13416255666818308):10.0):10.0,((O,E):0.5830869433055834)#H7:0.04459570701654978::0.8658374433318169):9.956681619696353); -(C,D,(((O,E):0.46850394609748747)#H7:0.13482863722320987::0.8828126224785788,(B,(A,#H7:0.0::0.11718737752142115):10.0):10.0):9.991800420171193); -(C,D,((O,(E)#H7:::0.7386833867678969):1.0536818106650097,((A,B):0.17308136493936416,#H7:::0.2613166132321031):1.7672640238265143):10.0); -((D,C):10.0,(O,(E,#H7:::0.19558842732752724):0.313524406128918):0.6640666222028861,(B,(A)#H7:::0.8044115726724728):10.0); -(C,D,((B,(A,#H7:0.0::0.1511265519320929):10.0):10.0,((O,E):0.4654393960818361)#H7:0.1207821903812405::0.8488734480679071):9.905218666161169); -(C,D,((B,(A)#H7:::0.8044116097751598):10.0,(O,(E,#H7:::0.1955883902248402):0.3135243578173061):0.6640664281120963):10.0); -(C,D,(((E,#H7:::0.16972583795735827):1.0141622466298166,O):0.637571795993754,(B,(A)#H7:::0.8302741620426417):10.0):10.0); -(C,D,((B,(A)#H7:::0.8140813408679294):10.0,(O,(E,#H7:::0.18591865913207065):0.9621522173588949):0.7222748543266707):10.0); +(C,D,((O,(E,#H7:::0.2321667195572249):0.40655870487080714):0.7083042224722244,(B,(A)#H7:::0.7678332804427751):10.0):10.0); +(C,D,((B,(A,#H7:9.892577202482824::0.11665493805886627):10.0):10.0,((O,E):0.435587525156129)#H7:0.17193616611414575::0.8833450619411337):9.95053465816285); +(C,D,((O,(E,#H7:::0.19558839012818185):0.31352433304125926):0.6640664435018641,(B,(A)#H7:::0.8044116098718181):10.0):10.0); +(C,D,((O,(E,#H7:::0.1955883903824113):0.313524366220726):0.6640664368936309,(B,(A)#H7:::0.8044116096175887):10.0):10.0); +(D,C,((B,(A,#H7:0.0::0.13415559781660125):10.0):9.988699830436277,((O,E):0.5829060893442204)#H7:0.0449729377813761::0.8658444021833988):9.961978587463063); +(C,D,((B,(A,#H7:0.0::0.11718743486337257):10.0):10.0,((O,E):0.468504710673929)#H7:0.13482820785981894::0.8828125651366274):9.909919198520198); +(C,D,((B,(A,#H7:0.0::0.1511542639383855):10.0):10.0,((O,E):0.46504356355623194)#H7:0.2550668661544012::0.8488457360616145):9.97287442391765); +(((O,(E,#H7:::0.19558839208203896):0.3135243164215907):0.6640664514648749,(B,(A)#H7:::0.8044116079179611):10.0):10.0,C,D); +(E,(O,((D,C):9.932243142414118,((A,B):0.7493504367804144)#H7:1.331829076044156::0.8330795130108796):0.7340864405537864):6.781383887343575,#H7:0.0::0.16692048698912043); +(D,C,((O,(E)#H7:::0.7181931299869297):1.1070630443653242,((A,B):0.48203049522991215,#H7:::0.28180687001307025):1.4649652615878772):10.0); +(C,D,((B,(A,#H7:0.0::0.1341627386478353):10.0):10.0,((O,E):0.583090406185628)#H7:0.044590891042569955::0.8658372613521648):9.999993325952085); +(C,D,((B,(A)#H7:::0.8044116111566435):10.0,(O,(E,#H7:::0.19558838884335655):0.3135242885110219):0.6640664151068564):10.0); +((D,C):9.84717967499181,(B,(A,#H7:0.0::0.1511110961266464):10.0):10.0,((O,E):0.46566821900769817)#H7:0.0026245166139281764::0.8488889038733536); +(D,C,((B,(A)#H7:::0.8044116100568192):10.0,(O,(E,#H7:::0.19558838994318084):0.3135238838874375):0.664066323224167):10.0); +(D,C,((O,(E,#H7:0.13335213183106956::0.234821671482812):5.0618371696268785):0.941302735356526,((B,A):0.8530487403638968)#H7:8.666542817250052::0.765178328517188):9.987373910219889); +((C,D):10.0,((B,A):0.7304500768590576,#H7:::0.4021080085238761):1.2234254426958329,(O,(E)#H7:::0.5978919914761238):1.9685438861985707); +(D,C,((B,(A)#H7:::0.7617640368527635):10.0,((O,#H7:::0.23823596314723652):0.18795323511409373,E):0.5381548125076079):10.0); +(C,D,((O,(E,#H7:::0.1955884077759933):0.31352401644418537):0.6640664135398032,(B,(A)#H7:::0.8044115922240067):10.0):10.0); +(C,D,((B,(A,#H7:0.0::0.15115420414107697):10.0):10.0,((O,E):0.4650415515372562)#H7:0.25506701399407505::0.8488457958589231):9.847694427161125); +(D,C,((O,(E,#H7:::0.19558839126040634):0.31352433394343593):0.6640664308569804,(B,(A)#H7:::0.8044116087395936):10.0):10.0); +(D,((B,(A,#H7:0.0::0.1675692564170113):1.2136437446611428):9.896650055044885,((O,E):0.46194048923448355)#H7:0.1529943637068513::0.8324307435829887):9.834944122917381,C); +(C,D,((B,(A)#H9:::0.79020152601114):10.0,(O,(E,#H9:::0.20979847398885995):1.1761675487346626):0.7730461289415069):10.0); +(C,D,(((A,#H7:0.0::0.13416262039349006):10.0,B):10.0,((O,E):0.5830967435455383)#H7:0.04458045907767828::0.86583737960651):9.869793129910137); +(C,D,((O,(E,#H7:0.0::0.20953431964558786):3.0995330453893786):1.000674325544878,((B,A):0.8520018507741483)#H7:1.3893861605440414::0.7904656803544121):9.988549674143021); +(C,D,((B,(A,#H7:0.0::0.15115430194154264):10.0):10.0,((O,E):0.4650451691346974)#H7:0.25506274046581884::0.8488456980584573):9.99954212528844); +(C,D,((B,(A,#H7:0.0::0.11718734196473335):10.0):10.0,((O,E):0.46850475327611696)#H7:0.13482814254362344::0.8828126580352667):9.999999074934715); +(C,D,(((O,E):0.5830960797898145)#H7:0.04458208742040545::0.8658372264322444,(B,(A,#H7:0.0::0.1341627735677556):10.0):10.0):9.882690089749653); +(C,D,((B,(A,#H7:0.0::0.13416246745527352):10.0):10.0,((O,E):0.5830895408090304)#H7:0.0445926434637898::0.8658375325447265):9.880186829782836); +(C,D,((B,(A)#H7:::0.8044116078537964):10.0,(O,(E,#H7:::0.19558839214620366):0.3135243069601881):0.6640664356944485):10.0); +(C,D,(((A,(B)#H7:::0.8636409086366929):10.0,(E,O):0.3715655386806172):10.0,#H7:::0.13635909136330718):8.053354724622574); +(C,D,((B,(A,#H7:0.0::0.13406755269912377):10.0):10.0,((E,O):0.36644131188922646)#H7:0.32077428798424595::0.8659324473008763):9.937376645123631); +(C,D,((B,(A,#H7:::0.1889424477026188):0.5628757071862271):2.0304319953420893,(O,(E)#H7:::0.8110575522973812):0.7047228687348902):10.0); +(C,D,((B,(A,#H7:0.0::0.1511542318360146):10.0):10.0,((O,E):0.46504576985732504)#H7:0.2550622337558699::0.8488457681639854):9.997562973958468); +(C,D,(((O,E):0.5343840607512291)#H7:0.0::0.8670199187941983,(B,(A,#H7:0.0::0.13298008120580174):10.0):10.0):9.865968868413901); +(C,D,((O,(E,#H7:::0.19558839435006736):0.31352413804757445):0.6640664251542547,(B,(A)#H7:::0.8044116056499326):10.0):10.0); +(C,D,((O,(E,#H7:::0.19558839247155368):0.31352431122410984):0.664066434953675,(B,(A)#H7:::0.8044116075284463):10.0):10.0); +(C,D,(((E,#H7:::0.19558839159222377):0.3135243347812405,O):0.6640664350695882,(B,(A)#H7:::0.8044116084077763):10.0):10.0); +(C,D,((O,(E)#H7:::0.7181925452316203):1.1070651219069176,((A,B):0.48203274320792816,#H7:::0.28180745476837965):1.4649633950281848):10.0); +(C,D,((O,(E,#H7:::0.19558838379861246):0.31352484091019284):0.6640663700788761,(B,(A)#H7:::0.8044116162013876):10.0):10.0); +(C,D,((O,(E,#H7:0.14058512566998274::0.23335184811216048):9.409387759083):0.9383077238258151,((A,B):0.8503263030700275)#H7:6.051081597693156::0.7666481518878395):9.990842664228794); +(C,D,((B,(A)#H7:::0.8044116074192188):10.0,(O,(E,#H7:::0.19558839258078117):0.31352437074354134):0.6640664412336827):10.0); +(C,D,((B,(A)#H7:::0.8044115827712203):10.0,(O,(E,#H7:::0.1955884172287797):0.3135232289353376):0.6640661010772118):10.0); +(C,D,((B,(A,#H7:0.0::0.11718734334525986):10.0):10.0,((O,E):0.46850284006504506)#H7:0.1348311641875659::0.8828126566547402):9.87792225382094); +(C,D,((B,(A,#H7:0.0::0.13297976613770618):10.0):10.0,((O,E):0.5343837395678875)#H7:0.0::0.8670202338622939):9.868211076535882); +(C,D,((B,(A,#H7:0.0::0.134162333195769):10.0):10.0,((O,E):0.5830884253403075)#H7:0.044592792495524475::0.865837666804231):9.872949233479575); +(C,D,((O,(E)#H7:::0.7181926032343305):1.1070639124653643,((B,A):0.482032083433577,#H7:::0.28180739676566946):1.4649619729255592):10.0); +(C,D,((B,(A,#H7:0.0::0.13406741263105032):10.0):10.0,((O,E):0.36644501943706387)#H7:0.3207657482275593::0.8659325873689496):9.999511171860279); +(C,D,((B,(A,#H7:0.0::0.15112695616740066):10.0):9.998353066011395,((O,E):0.46544374180031683)#H7:0.12077547692260805::0.8488730438325993):9.890015681211091); +(C,D,((B,(A,#H7:::0.19977943415418306):0.2488288806254244):2.159609608598549,(O,(E)#H7:::0.8002205658458169):0.9265712154066109):3.0599070511570243); +(C,D,((O,(E,#H7:0.0::0.20073283364107858):10.0):0.9745562665468471,((B,A):0.6139843229799435)#H7:10.0::0.7992671663589215):9.984050303063723); +(C,D,((B,(A,#H7:0.0::0.15115425215487888):10.0):10.0,((E,O):0.46504406876024246)#H7:0.25506419434222327::0.8488457478451211):9.87205348371995); +(C,D,((O,(E,#H7:::0.1845549929401468):1.7678209630626083):0.7447135084770502,(B,(A)#H7:::0.8154450070598532):10.0):10.0); +(D,C,((O,(E)#H7:::0.7181928230530086):1.1070636427623974,((B,A):0.4820322123457603,#H7:::0.2818071769469914):1.4649634999468808):10.0); +(D,C,((O,(E)#H7:::0.718192965965228):1.1070637658433597,((A,B):0.48203160864296085,#H7:::0.281807034034772):1.4649643801956547):10.0); +(C,D,((B,(A,#H7:0.0::0.13416267536658122):10.0):10.0,((O,E):0.583092881938582)#H7:0.0445871934870257::0.8658373246334188):9.998345938292625); +(C,D,((B,(A,#H7:0.0::0.13406728472743762):10.0):10.0,((O,E):0.36644426064357233)#H7:0.32076530179858936::0.8659327152725624):9.967520195546259); +(C,D,((O,(E,#H7:::0.19558839532828878):0.3135242602766149):0.6640664422599571,(B,(A)#H7:::0.8044116046717112):10.0):10.0); +(C,D,((O,(E,#H7:::0.1942002228875086):0.3149606561939673):0.6716635821447843,(B,(A)#H7:::0.8057997771124914):10.0):3.1085227284244215); +(C,D,(((O,E):0.33342970856858706)#H7:0.27490904929272025::0.8824820212453731,(B,(#H7:0.0::0.11751797875462688,A):8.13764106109905):2.866863536876749):9.97289963718264); +(C,D,((O,(E,#H7:::0.16508761868855204):1.6308101609508339):0.730391324918484,(B,(A)#H7:::0.834912381311448):10.0):10.0); +(C,D,((B,(A,#H7:0.0::0.1511953671413606):10.0):9.998333156872203,((O,E):0.4661171341250832)#H7:0.2533263305244876::0.8488046328586394):9.986237366345678); +(C,D,((B,(A,#H7:0.0::0.11858531934389191):4.6286993364265605):2.884678671044414,((O,E):0.33766418172147805)#H7:0.2701472337502917::0.8814146806561081):9.955568735530822); +(C,D,((B,(A,#H7:0.0::0.15112705596597545):10.0):10.0,((O,E):0.4654443211987999)#H7:0.12077399825773304::0.8488729440340246):9.99152501370758); +(C,D,(((O,E):0.4650442338864693)#H7:0.255063845030042::0.8488457530512488,(B,(A,#H7:0.0::0.1511542469487512):10.0):10.0):9.94850664006651); +(C,D,((B,(A,#H7:0.0::0.15111241543842693):10.0):10.0,((O,E):0.46567574417927904)#H7:0.0026122798977595923::0.8488875845615731):9.836829587073813); +(C,D,((O,(E,#H7:0.0::0.200732841873748):10.0):0.9745565181459647,((A,B):0.6139842430992303)#H7:10.0::0.799267158126252):9.910846273878983); +(C,D,((B,(A,#H7:::0.25001888963222807):0.6229824394994538):2.0893619515446287,(O,(E)#H7:::0.7499811103677719):0.9025301046957056):10.0); +(C,D,((B,(A)#H7:::0.8044116078302216):10.0,(O,(E,#H7:::0.19558839216977839):0.31352432262467406):0.6640664414054268):10.0); +(C,D,((B,(A,#H7:0.0::0.13297976947467927):10.0):10.0,((O,E):0.5343837039322803)#H7:0.0::0.8670202305253207):9.97645333438959); +(C,D,(((O,E):0.5830526512424845)#H7:0.04465057905932189::0.8658384697466008,(B,(#H7:0.0::0.13416153025339922,A):10.0):10.0):9.99149447133872); +(C,D,((O,(E,#H7:::0.19558839508419165):0.3135242563314496):0.6640664408937432,(B,(A)#H7:::0.8044116049158083):10.0):10.0); +(C,D,((B,(A,#H7:0.0::0.13406750671246734):10.0):10.0,((O,E):0.3664467168484901)#H7:0.32076337073865135::0.8659324932875326):9.877452054361305); +(C,D,((B,(A)#H7:::0.8044116086968263):10.0,(O,(#H7:::0.1955883913031737,E):0.3135244934011642):0.6640664786115202):10.0); +(C,D,((B,(A,#H9:0.0::0.15115250786824871):10.0):9.982486862358755,((O,E):0.4650408525140116)#H9:0.2550603760620874::0.8488474921317513):9.933579969978949); +(D,C,(((A,(B)#H7:::0.8464720209044769):10.0,(O,E):0.40121211524787154):10.0,#H7:::0.15352797909552304):9.243899538681974); +(C,((O,(E,#H7:::0.19558838969086373):0.313524456984185):0.6640664304037742,(B,(A)#H7:::0.8044116103091363):9.999999999999998):10.0,D); +(C,D,((B,(A,#H7:0.0::0.13416279973123874):10.0):10.0,((O,E):0.5830970027623557)#H7:0.04458040474940073::0.8658372002687613):9.859389049799022); +((B,((D,C):9.998293269554932,((O,E):0.4650450347000087)#H7:0.2550631011169392::0.8488457454435167):10.0):10.0,A,#H7:0.0::0.15115425455648338); +(C,D,((O,(E,#H7:::0.1955883897527049):0.3135244326643673):0.6640664266674219,(B,(A)#H7:::0.8044116102472951):10.0):10.0); +(C,D,((B,(A,#H7:0.0::0.13416268062912812):10.0):10.0,((O,E):0.5830612416587746)#H7:0.044633021750371794::0.8658373193708719):9.964997467765448); +(C,D,((O,(E,#H7:8.788850443231865::0.3172200231539885):1.3330362944059353):1.4152878628519385,((B,A):0.8951666500547869)#H7:9.999368288617557::0.6827799768460114):9.755665820033132); +(C,((B,(A,#H7:0.0::0.11752214122295564):7.976441445894574):2.8669812430132713,((O,E):0.3333958799481794)#H7:0.2749700238163984::0.8824778587770443):9.999989709512052,D); +(D,C,((O,(E)#H7:::0.785428043723932):1.066179357385685,((A,#H7:::0.21457195627606798):0.7271837838790415,B):1.8834232574566363):10.0); +(((B,(A)#H7:::0.8154450056029091):10.0,(O,(E,#H7:::0.18455499439709086):1.7678210063313078):0.7447135193145014):10.0,C,D); +(C,D,((B,(A,#H7:0.0::0.11757539879686588):7.145648955176491):2.867966052176756,((O,E):0.3335576887041395)#H7:0.2748270242237591::0.8824246012031342):9.99508012259847); +(D,C,((O,(E)#H7:::0.7683956850808571):1.0343221414276265,(B,(#H7:::0.23160431491914288,A):0.2165495184051004):1.7070669574138668):10.0); +(C,D,((B,(#H7:0.0::0.1340537935248692,A):10.0):10.0,((O,E):0.3666351088234092)#H7:0.1957655582725551::0.8659462064751308):9.99998356749523); +(C,D,((O,(E,#H7:0.0::0.16717632248073983):9.723451812954236):0.7291842268539358,((B,A):0.44790238633320234)#H7:10.0::0.8328236775192601):10.0); +(C,D,((B,(A)#H7:::0.8044116112662316):10.0,((E,#H7:::0.19558838873376833):0.3135243235750905,O):0.6640664528630428):10.0); +(C,D,((O,(E,#H7:::0.19558842613119162):0.31352444339152713):0.6640664795731094,(B,(A)#H7:::0.8044115738688083):10.0):10.0); +(C,D,((B,(A,#H7:0.0::0.13416281725947196):10.0):10.0,((O,E):0.5830966830477248)#H7:0.04458143337802764::0.865837182740528):9.996908811975388); +(C,D,((O,(E,#H7:0.13505001537956496::0.2347598663664569):5.101598826556241):0.9411561984908896,((B,A):0.8526759579446712)#H7:9.635445985422477::0.765240133633543):9.986243392503871); +(C,D,((B,(A,#H7:0.0::0.13416255666818308):10.0):10.0,((O,E):0.5830869433055834)#H7:0.04459570701654978::0.8658374433318169):9.956681619696353); +(C,D,(((O,E):0.46850394609748747)#H7:0.13482863722320987::0.8828126224785788,(B,(A,#H7:0.0::0.11718737752142115):10.0):10.0):9.991800420171193); +(C,D,((O,(E)#H7:::0.7386833867678969):1.0536818106650097,((A,B):0.17308136493936416,#H7:::0.2613166132321031):1.7672640238265143):10.0); +((D,C):10.0,(O,(E,#H7:::0.19558842732752724):0.313524406128918):0.6640666222028861,(B,(A)#H7:::0.8044115726724728):10.0); +(C,D,((B,(A,#H7:0.0::0.1511265519320929):10.0):10.0,((O,E):0.4654393960818361)#H7:0.1207821903812405::0.8488734480679071):9.905218666161169); +(C,D,((B,(A)#H7:::0.8044116097751598):10.0,(O,(E,#H7:::0.1955883902248402):0.3135243578173061):0.6640664281120963):10.0); +(C,D,(((E,#H7:::0.16972583795735827):1.0141622466298166,O):0.637571795993754,(B,(A)#H7:::0.8302741620426417):10.0):10.0); +(C,D,((B,(A)#H7:::0.8140813408679294):10.0,(O,(E,#H7:::0.18591865913207065):0.9621522173588949):0.7222748543266707):10.0); diff --git a/examples/bootstrapNets_h1.tre b/examples/bootstrapNets_h1.tre index 5f42beab3..4425aece1 100644 --- a/examples/bootstrapNets_h1.tre +++ b/examples/bootstrapNets_h1.tre @@ -1,10 +1,10 @@ -(2,(((5,(6)#H7:::0.6650218546611727):1.1160083091119883,3):0.5090975899277024,4):0.5323252478852302,(1,#H7:::0.3349781453388273):0.8125268943722683); -((((5,#H9:::0.3360313273136808):10.0,6):0.7736785793339899,4):0.018472836547273882,(2,1):0.4108019865248041,(3)#H9:::0.6639686726863192); -((2,1):0.509693200305383,(6,(5,#H7:::0.33743481415411847):9.779938468190114):0.7413356869230413,(4,(3)#H7:::0.6625651858458815):0.0005404926254454046); -((5,6):0.2689717885063597,(1,(2,#H7:::0.32653281231145237):9.762564392864972):1.0941639423846203,(3,(4)#H7:::0.6734671876885476):0.04779781973052391); -((3,(5,(6)#H7:::0.7073393957714003):1.0356741824276234):0.472921852492718,(2,(1,#H7:::0.29266060422859974):1.149455851605173):0.575813061768127,4); -(3,(4,(2,(1,#H7:::0.3041468375578982):1.1610564920212356):0.5435114497669337):0.4589435700719094,(5,(6)#H7:::0.6958531624421018):1.2850948300406806); -((2,(1,#H7:::0.3743023138059271):0.868604417741626):0.5328318534897231,(3,(5,(6)#H7:::0.6256976861940728):1.4497390126514094):0.4860459210601703,4); -(((5,(6,#H7:::0.24232137008631016):10.0):0.3832925707895322,3):0.4739536925265445,(2,(1)#H7:::0.7576786299136898):1.0480199345830288,4); -(1,(3,((5,6):0.2497533731217098,(4)#H9:::0.6739556560253647):0.0025672092406959):1.030037379541674,(2,#H9:::0.32604434397463533):9.904366253139811); -((4,((5,(6)#H7:::0.6553192671416874):1.3201442158060364,3):0.5225681819266704):0.5667001972407862,(1,#H7:::0.3446807328583125):0.6625823681800114,2); +(2,(((5,(6)#H7:::0.6650218546611727):1.1160083091119883,3):0.5090975899277024,4):0.5323252478852302,(1,#H7:::0.3349781453388273):0.8125268943722683); +((((5,#H9:::0.3360313273136808):10.0,6):0.7736785793339899,4):0.018472836547273882,(2,1):0.4108019865248041,(3)#H9:::0.6639686726863192); +((2,1):0.509693200305383,(6,(5,#H7:::0.33743481415411847):9.779938468190114):0.7413356869230413,(4,(3)#H7:::0.6625651858458815):0.0005404926254454046); +((5,6):0.2689717885063597,(1,(2,#H7:::0.32653281231145237):9.762564392864972):1.0941639423846203,(3,(4)#H7:::0.6734671876885476):0.04779781973052391); +((3,(5,(6)#H7:::0.7073393957714003):1.0356741824276234):0.472921852492718,(2,(1,#H7:::0.29266060422859974):1.149455851605173):0.575813061768127,4); +(3,(4,(2,(1,#H7:::0.3041468375578982):1.1610564920212356):0.5435114497669337):0.4589435700719094,(5,(6)#H7:::0.6958531624421018):1.2850948300406806); +((2,(1,#H7:::0.3743023138059271):0.868604417741626):0.5328318534897231,(3,(5,(6)#H7:::0.6256976861940728):1.4497390126514094):0.4860459210601703,4); +(((5,(6,#H7:::0.24232137008631016):10.0):0.3832925707895322,3):0.4739536925265445,(2,(1)#H7:::0.7576786299136898):1.0480199345830288,4); +(1,(3,((5,6):0.2497533731217098,(4)#H9:::0.6739556560253647):0.0025672092406959):1.030037379541674,(2,#H9:::0.32604434397463533):9.904366253139811); +((4,((5,(6)#H7:::0.6553192671416874):1.3201442158060364,3):0.5225681819266704):0.5667001972407862,(1,#H7:::0.3446807328583125):0.6625823681800114,2); diff --git a/examples/buckyCF.csv b/examples/buckyCF.csv index efd285492..05b971e0c 100644 --- a/examples/buckyCF.csv +++ b/examples/buckyCF.csv @@ -1,16 +1,16 @@ -taxon1,taxon2,taxon3,taxon4,CF12.34,CF12.34_lo,CF12.34_hi,CF13.24,CF13.24_lo,CF13.24_hi,CF14.23,CF14.23_lo,CF14.23_hi,ngenes -D,A,E,O,0.565033333333333,0.5,0.633333333333333,0.0903,0.0666666666666667,0.133333333333333,0.344666666666667,0.3,0.4,30 -D,A,E,B,0.0005,0,0,0.8599,0.833333333333333,0.866666666666667,0.139566666666667,0.133333333333333,0.166666666666667,30 -C,A,E,B,0.0005,0,0,0.8599,0.833333333333333,0.866666666666667,0.139566666666667,0.133333333333333,0.166666666666667,30 -C,A,E,O,0.565033333333333,0.5,0.633333333333333,0.0903,0.0666666666666667,0.133333333333333,0.344666666666667,0.3,0.4,30 -D,A,O,B,3.33333333333333e-05,0,0,0.8885,0.866666666666667,0.9,0.111466666666667,0.1,0.133333333333333,30 -C,D,E,O,0.999866666666667,1,1,6.66666666666667e-05,0,0,6.66666666666667e-05,0,0,30 -C,E,O,B,0.0401666666666667,0.0333333333333333,0.0666666666666667,0.263066666666667,0.233333333333333,0.333333333333333,0.696766666666667,0.633333333333333,0.733333333333333,30 -C,D,A,E,1,1,1,0,0,0,0,0,0,30 -C,D,O,B,0.999866666666667,1,1,6.66666666666667e-05,0,0,6.66666666666667e-05,0,0,30 -C,D,E,B,1,1,1,0,0,0,0,0,0,30 -D,E,O,B,0.0401666666666667,0.0333333333333333,0.0666666666666667,0.263066666666667,0.233333333333333,0.333333333333333,0.696766666666667,0.633333333333333,0.733333333333333,30 -C,D,A,O,0.999866666666667,1,1,6.66666666666667e-05,0,0,6.66666666666667e-05,0,0,30 -C,D,A,B,1,1,1,0,0,0,0,0,0,30 -A,E,O,B,0.0731666666666667,0.0666666666666667,0.1,0.0424666666666667,0.0333333333333333,0.0666666666666667,0.884366666666667,0.833333333333333,0.9,30 -C,A,O,B,3.33333333333333e-05,0,0,0.8885,0.866666666666667,0.9,0.111466666666667,0.1,0.133333333333333,30 +taxon1,taxon2,taxon3,taxon4,CF12.34,CF12.34_lo,CF12.34_hi,CF13.24,CF13.24_lo,CF13.24_hi,CF14.23,CF14.23_lo,CF14.23_hi,ngenes +D,A,E,O,0.565033333333333,0.5,0.633333333333333,0.0903,0.0666666666666667,0.133333333333333,0.344666666666667,0.3,0.4,30 +D,A,E,B,0.0005,0,0,0.8599,0.833333333333333,0.866666666666667,0.139566666666667,0.133333333333333,0.166666666666667,30 +C,A,E,B,0.0005,0,0,0.8599,0.833333333333333,0.866666666666667,0.139566666666667,0.133333333333333,0.166666666666667,30 +C,A,E,O,0.565033333333333,0.5,0.633333333333333,0.0903,0.0666666666666667,0.133333333333333,0.344666666666667,0.3,0.4,30 +D,A,O,B,3.33333333333333e-05,0,0,0.8885,0.866666666666667,0.9,0.111466666666667,0.1,0.133333333333333,30 +C,D,E,O,0.999866666666667,1,1,6.66666666666667e-05,0,0,6.66666666666667e-05,0,0,30 +C,E,O,B,0.0401666666666667,0.0333333333333333,0.0666666666666667,0.263066666666667,0.233333333333333,0.333333333333333,0.696766666666667,0.633333333333333,0.733333333333333,30 +C,D,A,E,1,1,1,0,0,0,0,0,0,30 +C,D,O,B,0.999866666666667,1,1,6.66666666666667e-05,0,0,6.66666666666667e-05,0,0,30 +C,D,E,B,1,1,1,0,0,0,0,0,0,30 +D,E,O,B,0.0401666666666667,0.0333333333333333,0.0666666666666667,0.263066666666667,0.233333333333333,0.333333333333333,0.696766666666667,0.633333333333333,0.733333333333333,30 +C,D,A,O,0.999866666666667,1,1,6.66666666666667e-05,0,0,6.66666666666667e-05,0,0,30 +C,D,A,B,1,1,1,0,0,0,0,0,0,30 +A,E,O,B,0.0731666666666667,0.0666666666666667,0.1,0.0424666666666667,0.0333333333333333,0.0666666666666667,0.884366666666667,0.833333333333333,0.9,30 +C,A,O,B,3.33333333333333e-05,0,0,0.8885,0.866666666666667,0.9,0.111466666666667,0.1,0.133333333333333,30 diff --git a/examples/carnivores_trait.txt b/examples/carnivores_trait.txt index 02a1ad71e..0df921b23 100644 --- a/examples/carnivores_trait.txt +++ b/examples/carnivores_trait.txt @@ -1,17 +1,17 @@ -"tipNames","trait" -"Ailuridae",1.64288816228843 -"Canidae",1.67724405797551 -"Eupleridae",0.331567884748627 -"Felidae",2.27394657977653 -"Herpestidae",0.27523721665008 -"Hyaenidae",3.39093820521727 -"Mephitidae",0.355798965678337 -"Mustelidae",0.542564685398103 -"Nandiniidae",0.773436011788748 -"Odobenidae",6.94985285959642 -"Otariidae",4.78323112624972 -"Phocidae",5.33016498299617 -"Prionodontidae",-0.122604133046084 -"Procyonidae",0.739890139901583 -"Ursidae",4.84235723118862 -"Viverridae",1.0694997360571 +"tipNames","trait" +"Ailuridae",1.64288816228843 +"Canidae",1.67724405797551 +"Eupleridae",0.331567884748627 +"Felidae",2.27394657977653 +"Herpestidae",0.27523721665008 +"Hyaenidae",3.39093820521727 +"Mephitidae",0.355798965678337 +"Mustelidae",0.542564685398103 +"Nandiniidae",0.773436011788748 +"Odobenidae",6.94985285959642 +"Otariidae",4.78323112624972 +"Phocidae",5.33016498299617 +"Prionodontidae",-0.122604133046084 +"Procyonidae",0.739890139901583 +"Ursidae",4.84235723118862 +"Viverridae",1.0694997360571 diff --git a/examples/carnivores_tree.txt b/examples/carnivores_tree.txt index 4c3127b85..bfb41e2c6 100644 --- a/examples/carnivores_tree.txt +++ b/examples/carnivores_tree.txt @@ -1 +1 @@ -((((Prionodontidae:33.3,Felidae:33.3):5.3,(Viverridae:37.4,((Herpestidae:25.5,Eupleridae:25.5):6.7,Hyaenidae:32.2):5.2):1.2):5.9,Nandiniidae:44.5):14.7,(Canidae:48.9,(Ursidae:42.6,(((Odobenidae:14.1,Otariidae:14.1):10.4,Phocidae:24.5):16,(Mephitidae:32,(Ailuridae:30,(Mustelidae:27.4,Procyonidae:27.4):2.6):2):8.5):2.1):6.3):10.3); +((((Prionodontidae:33.3,Felidae:33.3):5.3,(Viverridae:37.4,((Herpestidae:25.5,Eupleridae:25.5):6.7,Hyaenidae:32.2):5.2):1.2):5.9,Nandiniidae:44.5):14.7,(Canidae:48.9,(Ursidae:42.6,(((Odobenidae:14.1,Otariidae:14.1):10.4,Phocidae:24.5):16,(Mephitidae:32,(Ailuridae:30,(Mustelidae:27.4,Procyonidae:27.4):2.6):2):8.5):2.1):6.3):10.3); diff --git a/examples/case_f_example.jl b/examples/case_f_example.jl deleted file mode 100644 index 2fc7dc77c..000000000 --- a/examples/case_f_example.jl +++ /dev/null @@ -1,63 +0,0 @@ -# example "Case f" (plot in ipad) -# this is the bad diamond case -# Claudia August 2014 -# -# in julia: include("case_f_example.jl") - -ed1=Edge(1,0.6,true,0.7); -ed2=Edge(2,0.7,true,0.3); -ed3=Edge(3,0.9); -ed4=Edge(4,0.1); -ed5=Edge(5,0.2); -ed6=Edge(6,0.1); -ed7=Edge(7,0.1); -ed8=Edge(8,0.1); -ed9=Edge(9,0.1); -ed10=Edge(10,0.1); - -n1=Node(1,false,false,[ed1,ed5,ed6]); -n2=Node(2,false,true,[ed1,ed2,ed3]); -n3=Node(3,false,false,[ed2,ed4,ed7]); -n4=Node(4,true,false,[ed3]); -n5=Node(5,false,false,[ed4,ed5,ed9]); -n6=Node(6,true, false,[ed6]); -n7=Node(7,true, false,[ed7]); -n8=Node(8,true, false,[ed8]); -n9=Node(9,false,false,[ed8,ed9,ed10]); -n10=Node(10,true, false,[ed10]); - -setNode!(ed1,n1) -setNode!(ed1,n2) -setNode!(ed2,n2); -setNode!(ed2,n3); -setNode!(ed5,[n5,n1]); -setNode!(ed4,[n3,n5]); -setNode!(ed3,n2); -setNode!(ed3,n4); -setNode!(ed6,[n1,n6]); -setNode!(ed7,[n3,n7]); -setNode!(ed8,[n8,n9]); -setNode!(ed9,[n5,n9]); -setNode!(ed10,[n9,n10]); - -#ed1.inCycle=2; -#ed2.inCycle=2; -#ed4.inCycle=2; -#ed5.inCycle=2; - -net=HybridNetwork([n1,n2,n3,n4,n5,n6,n7,n8,n9,n10],[ed1,ed2,ed3,ed4,ed5,ed6,ed7,ed8,ed9,ed10]); -node=searchHybridNode(net); -n2.name = "H1"; n4.name = "4"; n6.name = "6"; n7.name = "7"; -n8.name = "8"; n10.name = "10" -net.names=["1","2","3","4","5","6","7","8","9","10"] - -flag, nocycle,edges, nodes = updateInCycle!(net,node[1]); -flag2, edges2 = updateContainRoot!(net,node[1]); -flag3, edges3 = updateGammaz!(net,node[1]); - -#printEdges(net) - -#deleteHybrid!(node[1],net,false) - -#changeDirectionUpdate!(node[1],net); - diff --git a/examples/case_g_example.jl b/examples/case_g_example.jl deleted file mode 100644 index 159d9c29b..000000000 --- a/examples/case_g_example.jl +++ /dev/null @@ -1,11 +0,0 @@ -# Case G example -# Claudia December 2014 - -tree = "((((6:0.1,4:1.5)1:0.2,(7)11#H1)5:0.1,(11#H1,8)),10:0.1);" # Case G -#f = open("prueba_tree.txt","w") -#write(f,tree) -#close(f) -net = readTopologyLevel1(tree) - -#printEdges(net) -#printNodes(net) diff --git a/examples/case_i_example.jl b/examples/case_i_example.jl deleted file mode 100644 index 494812db7..000000000 --- a/examples/case_i_example.jl +++ /dev/null @@ -1,11 +0,0 @@ -# Case I example: Bad diamond II -# Claudia January 2015 - -tree = "((((8,10))#H1,7),6,(4,#H1));" # Case I Bad diamond II -#f = open("prueba_tree.txt","w") -#write(f,tree) -#close(f) -net = readTopologyLevel1(tree) - -#printEdges(net) -#printNodes(net) diff --git a/examples/caudata_Phytools.txt b/examples/caudata_Phytools.txt index 82f4bf83e..1a1675ecb 100644 --- a/examples/caudata_Phytools.txt +++ b/examples/caudata_Phytools.txt @@ -1,197 +1,197 @@ -"trait","var" -4.67899890013259,0.109314410039819 -4.64311270571125,0.0698292915157906 -4.56976732699187,0.0553208146307361 -4.47122308926633,0.0637961125038939 -4.43930886351158,0.0780114436509626 -4.54413277790729,0.0266618708375659 -4.50621723981732,0.0183944596337243 -4.33235509318675,0.0252202820979854 -4.32770932002891,0.0236251122765271 -4.3327607245234,0.0183873684820126 -4.32890246447158,0.0182835570000748 -4.32610133513444,0.0198698643619857 -4.3489400904391,0.0246377707989465 -4.37349019541877,0.012683585757044 -4.31227626094053,0.0231102768292935 -4.27343537929314,0.0297840453123283 -4.38048358948841,0.0250524182947867 -4.40698730387776,0.0243156746810081 -4.41635664540065,0.0180161704198968 -4.34297694043103,0.0327375515158743 -4.18529459785425,0.0456889263799745 -4.08480885217138,0.040530871644948 -4.11952288595595,0.036837058031155 -4.38451821517461,0.0295438454444307 -4.11078294231073,0.0386365146583892 -4.15453245710416,0.0315978821201537 -4.10247652274494,0.0282518734243502 -4.08187449132479,0.0326815392179899 -4.23833187265699,0.0303199231384712 -4.25707227867322,0.0285526796918543 -3.99722036552212,0.0384475520332369 -3.94375798837552,0.0399111527121271 -4.01990955837853,0.0260432089842571 -4.01636434921841,0.0263331742940494 -3.76919113052195,0.0311961953152167 -3.7512153189483,0.0140929682689123 -3.67954781367588,0.0284804103025293 -4.10945162915407,0.0204200653480381 -4.10917044173029,0.020183018272656 -4.09420180355453,0.0269345025340272 -4.08524504552715,0.0248761056629811 -4.10932999529206,0.0203403190688002 -4.24444530466793,0.0276910051237845 -4.22195047944959,0.0227397271846079 -4.14645886222557,0.0124995586683843 -4.28564425796037,0.0200818603803941 -4.26640413644308,0.0162533827450683 -4.26456762453504,0.0135632240304726 -4.21524533614564,0.0395660065857571 -4.26160596048333,0.040472555024852 -4.2487776838365,0.0347102859074777 -4.3182463740002,0.0232306177329807 -4.5679273313009,0.0547185023008954 -4.47182842562339,0.0594481274490567 -4.46006659871382,0.0593280919374199 -4.08079006605161,0.0378350118442234 -3.98686231734448,0.0364369827304945 -3.90263454896072,0.0294914268477531 -3.82754578669576,0.0263905089183132 -3.7371193344236,0.0218887002676623 -3.73053662943123,0.0208841692658154 -3.72477902794296,0.0219844961298652 -3.79031117410085,0.0186203415374133 -3.91355447392164,0.0171486856442945 -3.93673168830398,0.0231246056727114 -3.92387140724521,0.015810542492652 -3.93788995261353,0.0160155138424257 -3.99827057809444,0.0177850261278542 -4.03541990331576,0.0192761866706572 -3.86532881699773,0.0168532834939069 -3.92862084078755,0.0183267135194587 -4.07864823137636,0.0185556116979347 -4.08195830296188,0.0119644596443707 -3.72006976565046,0.0191700511310791 -3.77417129770844,0.0186683936780537 -3.72945350552682,0.0203724569439805 -3.76102877143299,0.0216541102474904 -3.84709049006807,0.0238431390332153 -3.61997760367219,0.0187971667075353 -3.60159902470977,0.0121047455967402 -3.87556414789326,0.0253723308918168 -3.86849707484505,0.0243850799691118 -3.46018462598235,0.0221205791113163 -3.46668557803925,0.0188769266889322 -3.49658209071477,0.0159169693296282 -3.41010301339311,0.013825520693419 -3.70477683927952,0.0254981791739015 -3.67198364921292,0.0284043019314907 -3.70064038715898,0.0292228231467017 -3.73467979766918,0.0247652809022266 -3.59318451643607,0.012054058016927 -3.79868905240838,0.0233385851790114 -3.8356443279728,0.0397601776018479 -3.86575538016918,0.0398887363613873 -3.94270275611983,0.0347558514814494 -4.16276212649559,0.0268570858711541 -4.17092882594927,0.0281570164614328 -4.1916994606418,0.0280756745009395 -3.76093614059894,0.0181653853544619 -3.75161505329369,0.0202174118365854 -3.73470790970804,0.023393437377973 -3.74529377608786,0.0159847052082019 -3.75162737736798,0.0155591712145376 -3.77824362176149,0.0158729430084499 -3.99099674155283,0.0180824710437005 -3.72199088171876,0.0146921524249186 -3.71735334161905,0.0155950660641471 -3.67537062773419,0.0118964525488157 -3.67649748544402,0.010423501424044 -3.68090655469955,0.0124371419666096 -3.43593751044351,0.00290330536201637 -3.44685826884209,0.00242479493062794 -3.52832002345012,0.00183371225369777 -4.03888041448228,0.0274926298436421 -4.0092565478052,0.0305151894136195 -4.00052736372841,0.0289934712473055 -3.9979801406852,0.0304361898883555 -4.00567591995215,0.0296901272617857 -4.00031802921111,0.0297032757331755 -3.89142187798065,0.0153417205139238 -3.95011539169467,0.0238818517576036 -3.86793604062405,0.0231881584654679 -3.87795459826058,0.0136213858600441 -3.87819636152945,0.0123033934666079 -3.85333563763199,0.0126516592384117 -3.90181542444216,0.0104077540702241 -3.90069609712315,0.0101296794563937 -3.97004100971081,0.0191219208543058 -3.93808498893775,0.0196877375524917 -4.08235374425903,0.0115250659061056 -3.85911379624722,0.019488589276692 -3.79116966042657,0.0153667378194603 -3.77104315458489,0.0143791193929351 -4.08215389603982,0.0125313977617946 -4.07569320117954,0.0100173167149317 -4.07003583429668,0.00883786985999436 -4.06453755120777,0.014446756574711 -4.06684841902109,0.00855747224373044 -3.99504088999451,0.0135384611260499 -4.08010097976485,0.00891032523879438 -4.07181618539405,0.0102280253004767 -4.06955234140947,0.00901507802355138 -4.10085301721402,0.00535434717368554 -4.06317933723037,0.00640766821166191 -4.05056253414683,0.00663579343371508 -4.08515806804706,0.00629332303195367 -4.22417106412224,0.00452886540912638 -4.14520794581829,0.0113062713115813 -4.1642085976819,0.00904943462033821 -4.16744729579908,0.00809461309136364 -4.04396722048839,0.0259433686989069 -3.98489789757831,0.0413232442061479 -4.04919661198704,0.0257589485109312 -4.0513061337723,0.0261867513806219 -4.06309066688248,0.0357984757450229 -4.11745386447842,0.0306486553990582 -4.17495580369649,0.0284823887312932 -4.05274972281571,0.0315418327472608 -3.90294694997991,0.0308783644174905 -3.92115614932133,0.019053537621469 -3.98078533786807,0.0158123823491711 -4.04665033881598,0.0186668808921013 -3.98848144066389,0.0144302805011662 -4.02569094550892,0.0115813645064581 -4.00007364542004,0.0122164756988997 -4.02882252742083,0.0127189983375407 -4.06596814938632,0.0120673974623446 -4.08815884823344,0.0130684741137234 -5.96052648673321,0.00859508253343634 -5.79256514055283,0.00358190937228995 -3.84705582917961,0.00881631858643411 -3.84858095829371,0.00758389691126407 -3.85263712756421,0.00239550068687239 -4.69204466948456,0.0755725774712499 -4.884965507576,0.0587518335456658 -4.91961099305853,0.0521026994179491 -4.91802263560587,0.0527669273514701 -4.77008490781907,0.0917822653127358 -5.50992353396366,0.078603180832452 -4.37820011005071,0.0327039469025437 -4.36046735944414,0.0278081318712985 -4.3112733676559,0.0237663739352408 -4.29701350993971,0.0244551850610755 -4.33188528003585,0.0266279229941756 -4.45685162234265,0.0255786619368063 -4.18153644024446,0.0140419658445707 -4.17447660773753,0.0133751163033331 -4.16828117632518,0.0131676964978828 -4.1527356216972,0.0136705890281972 -4.15850153336582,0.0126951984375721 -4.15900363047967,0.0107173040085419 -4.17574722692131,0.0152621706167468 -4.19100769117827,0.015800769201849 -4.37668498481547,0.0390331749998527 -4.93020226108198,0.0860093273478187 -5.3445831084132,0.0263401817963831 +"trait","var" +4.67899890013259,0.109314410039819 +4.64311270571125,0.0698292915157906 +4.56976732699187,0.0553208146307361 +4.47122308926633,0.0637961125038939 +4.43930886351158,0.0780114436509626 +4.54413277790729,0.0266618708375659 +4.50621723981732,0.0183944596337243 +4.33235509318675,0.0252202820979854 +4.32770932002891,0.0236251122765271 +4.3327607245234,0.0183873684820126 +4.32890246447158,0.0182835570000748 +4.32610133513444,0.0198698643619857 +4.3489400904391,0.0246377707989465 +4.37349019541877,0.012683585757044 +4.31227626094053,0.0231102768292935 +4.27343537929314,0.0297840453123283 +4.38048358948841,0.0250524182947867 +4.40698730387776,0.0243156746810081 +4.41635664540065,0.0180161704198968 +4.34297694043103,0.0327375515158743 +4.18529459785425,0.0456889263799745 +4.08480885217138,0.040530871644948 +4.11952288595595,0.036837058031155 +4.38451821517461,0.0295438454444307 +4.11078294231073,0.0386365146583892 +4.15453245710416,0.0315978821201537 +4.10247652274494,0.0282518734243502 +4.08187449132479,0.0326815392179899 +4.23833187265699,0.0303199231384712 +4.25707227867322,0.0285526796918543 +3.99722036552212,0.0384475520332369 +3.94375798837552,0.0399111527121271 +4.01990955837853,0.0260432089842571 +4.01636434921841,0.0263331742940494 +3.76919113052195,0.0311961953152167 +3.7512153189483,0.0140929682689123 +3.67954781367588,0.0284804103025293 +4.10945162915407,0.0204200653480381 +4.10917044173029,0.020183018272656 +4.09420180355453,0.0269345025340272 +4.08524504552715,0.0248761056629811 +4.10932999529206,0.0203403190688002 +4.24444530466793,0.0276910051237845 +4.22195047944959,0.0227397271846079 +4.14645886222557,0.0124995586683843 +4.28564425796037,0.0200818603803941 +4.26640413644308,0.0162533827450683 +4.26456762453504,0.0135632240304726 +4.21524533614564,0.0395660065857571 +4.26160596048333,0.040472555024852 +4.2487776838365,0.0347102859074777 +4.3182463740002,0.0232306177329807 +4.5679273313009,0.0547185023008954 +4.47182842562339,0.0594481274490567 +4.46006659871382,0.0593280919374199 +4.08079006605161,0.0378350118442234 +3.98686231734448,0.0364369827304945 +3.90263454896072,0.0294914268477531 +3.82754578669576,0.0263905089183132 +3.7371193344236,0.0218887002676623 +3.73053662943123,0.0208841692658154 +3.72477902794296,0.0219844961298652 +3.79031117410085,0.0186203415374133 +3.91355447392164,0.0171486856442945 +3.93673168830398,0.0231246056727114 +3.92387140724521,0.015810542492652 +3.93788995261353,0.0160155138424257 +3.99827057809444,0.0177850261278542 +4.03541990331576,0.0192761866706572 +3.86532881699773,0.0168532834939069 +3.92862084078755,0.0183267135194587 +4.07864823137636,0.0185556116979347 +4.08195830296188,0.0119644596443707 +3.72006976565046,0.0191700511310791 +3.77417129770844,0.0186683936780537 +3.72945350552682,0.0203724569439805 +3.76102877143299,0.0216541102474904 +3.84709049006807,0.0238431390332153 +3.61997760367219,0.0187971667075353 +3.60159902470977,0.0121047455967402 +3.87556414789326,0.0253723308918168 +3.86849707484505,0.0243850799691118 +3.46018462598235,0.0221205791113163 +3.46668557803925,0.0188769266889322 +3.49658209071477,0.0159169693296282 +3.41010301339311,0.013825520693419 +3.70477683927952,0.0254981791739015 +3.67198364921292,0.0284043019314907 +3.70064038715898,0.0292228231467017 +3.73467979766918,0.0247652809022266 +3.59318451643607,0.012054058016927 +3.79868905240838,0.0233385851790114 +3.8356443279728,0.0397601776018479 +3.86575538016918,0.0398887363613873 +3.94270275611983,0.0347558514814494 +4.16276212649559,0.0268570858711541 +4.17092882594927,0.0281570164614328 +4.1916994606418,0.0280756745009395 +3.76093614059894,0.0181653853544619 +3.75161505329369,0.0202174118365854 +3.73470790970804,0.023393437377973 +3.74529377608786,0.0159847052082019 +3.75162737736798,0.0155591712145376 +3.77824362176149,0.0158729430084499 +3.99099674155283,0.0180824710437005 +3.72199088171876,0.0146921524249186 +3.71735334161905,0.0155950660641471 +3.67537062773419,0.0118964525488157 +3.67649748544402,0.010423501424044 +3.68090655469955,0.0124371419666096 +3.43593751044351,0.00290330536201637 +3.44685826884209,0.00242479493062794 +3.52832002345012,0.00183371225369777 +4.03888041448228,0.0274926298436421 +4.0092565478052,0.0305151894136195 +4.00052736372841,0.0289934712473055 +3.9979801406852,0.0304361898883555 +4.00567591995215,0.0296901272617857 +4.00031802921111,0.0297032757331755 +3.89142187798065,0.0153417205139238 +3.95011539169467,0.0238818517576036 +3.86793604062405,0.0231881584654679 +3.87795459826058,0.0136213858600441 +3.87819636152945,0.0123033934666079 +3.85333563763199,0.0126516592384117 +3.90181542444216,0.0104077540702241 +3.90069609712315,0.0101296794563937 +3.97004100971081,0.0191219208543058 +3.93808498893775,0.0196877375524917 +4.08235374425903,0.0115250659061056 +3.85911379624722,0.019488589276692 +3.79116966042657,0.0153667378194603 +3.77104315458489,0.0143791193929351 +4.08215389603982,0.0125313977617946 +4.07569320117954,0.0100173167149317 +4.07003583429668,0.00883786985999436 +4.06453755120777,0.014446756574711 +4.06684841902109,0.00855747224373044 +3.99504088999451,0.0135384611260499 +4.08010097976485,0.00891032523879438 +4.07181618539405,0.0102280253004767 +4.06955234140947,0.00901507802355138 +4.10085301721402,0.00535434717368554 +4.06317933723037,0.00640766821166191 +4.05056253414683,0.00663579343371508 +4.08515806804706,0.00629332303195367 +4.22417106412224,0.00452886540912638 +4.14520794581829,0.0113062713115813 +4.1642085976819,0.00904943462033821 +4.16744729579908,0.00809461309136364 +4.04396722048839,0.0259433686989069 +3.98489789757831,0.0413232442061479 +4.04919661198704,0.0257589485109312 +4.0513061337723,0.0261867513806219 +4.06309066688248,0.0357984757450229 +4.11745386447842,0.0306486553990582 +4.17495580369649,0.0284823887312932 +4.05274972281571,0.0315418327472608 +3.90294694997991,0.0308783644174905 +3.92115614932133,0.019053537621469 +3.98078533786807,0.0158123823491711 +4.04665033881598,0.0186668808921013 +3.98848144066389,0.0144302805011662 +4.02569094550892,0.0115813645064581 +4.00007364542004,0.0122164756988997 +4.02882252742083,0.0127189983375407 +4.06596814938632,0.0120673974623446 +4.08815884823344,0.0130684741137234 +5.96052648673321,0.00859508253343634 +5.79256514055283,0.00358190937228995 +3.84705582917961,0.00881631858643411 +3.84858095829371,0.00758389691126407 +3.85263712756421,0.00239550068687239 +4.69204466948456,0.0755725774712499 +4.884965507576,0.0587518335456658 +4.91961099305853,0.0521026994179491 +4.91802263560587,0.0527669273514701 +4.77008490781907,0.0917822653127358 +5.50992353396366,0.078603180832452 +4.37820011005071,0.0327039469025437 +4.36046735944414,0.0278081318712985 +4.3112733676559,0.0237663739352408 +4.29701350993971,0.0244551850610755 +4.33188528003585,0.0266279229941756 +4.45685162234265,0.0255786619368063 +4.18153644024446,0.0140419658445707 +4.17447660773753,0.0133751163033331 +4.16828117632518,0.0131676964978828 +4.1527356216972,0.0136705890281972 +4.15850153336582,0.0126951984375721 +4.15900363047967,0.0107173040085419 +4.17574722692131,0.0152621706167468 +4.19100769117827,0.015800769201849 +4.37668498481547,0.0390331749998527 +4.93020226108198,0.0860093273478187 +5.3445831084132,0.0263401817963831 diff --git a/examples/caudata_Rphylopars.txt b/examples/caudata_Rphylopars.txt index 9567f7da7..4062e3e0c 100644 --- a/examples/caudata_Rphylopars.txt +++ b/examples/caudata_Rphylopars.txt @@ -1,394 +1,394 @@ -"trait","var" -4.42184812886055,0 -4.51743127168008,0 -4.68213122712422,0 -4.43355115232727,0 -4.3210617205896,0 -4.47966365074837,0 -3.98713047791495,0 -4.44135041075727,0 -4.00551334851548,0 -4.40854684448328,0 -4.46791759256172,0 -4.37682400470252,0 -4.43698819274786,0 -4.51961229762644,0 -4.0943445622221,0 -4.39911725446659,0 -4.35502150652934,0 -3.52547778217249,0 -4.20123141243846,0 -4.76294286986063,0 -3.82537519870247,0 -4.30271282795416,0 -4.29387824789718,0 -4.35169628486605,0 -4.23555473077362,0 -3.79323946943818,0 -3.76699723337789,0 -3.99231183665695,0 -3.85142338329922,0 -3.70480201465775,0 -3.79098467705109,0 -3.6988297849671,0 -3.41772668361337,0 -4.00551334851548,0 -4.15304576682959,0 -4.05817319508393,0 -3.89182029811063,0 -4.32057002622753,0 -4.30811095172371,0 -4.15543966158191,0 -4.10791868224922,0 -4.22829253473184,0 -4.16278172377533,0 -4.36246147917904,0 -4.60266705576997,0 -4.41279829334063,0 -4.23916614676084,0 -4.4672864786247,0 -4.07584109065754,0 -4.50454842467744,0 -3.69424006035603,0 -3.98898404656427,0 -3.84801767545223,0 -4.01241117945941,0 -4.63812128612778,0 -3.94893335944824,0 -3.82319179172153,0 -3.80058852498184,0 -4.37866473983298,0 -4.12552017969055,0 -4.04129534113228,0 -3.55105313720653,0 -3.60114053980593,0 -2.96225304647982,0 -4.06263887373527,0 -3.97066920086088,0 -3.8649313978943,0 -3.3178157727231,0 -3.4904285153901,0 -4.29907292330404,0 -3.80291101734437,0 -3.92395157629342,0 -3.22286784613774,0 -3.40119738166216,0 -3.87057581551397,0 -3.38777436133001,0 -3.18013499655177,0 -3.75185425327532,0 -3.44680789291421,0 -3.68260984110034,0 -3.89792408104864,0 -3.90801498403061,0 -3.27336401015227,0 -3.68637632389582,0 -3.38777436133001,0 -3.79773385902602,0 -3.79773385902602,0 -3.9759363311718,0 -3.90197266957464,0 -4.50468664740977,0 -4.31715472463507,0 -4.32446372727274,0 -3.71332813451625,0 -3.50480636428118,0 -3.92592591059714,0 -3.40734511224839,0 -4.14128380814951,0 -4.07889245766318,0 -3.65970807681366,0 -3.7536132686805,0 -3.58351893845611,0 -3.77292184468871,0 -3.60086757679072,0 -3.99452422693989,0 -3.25848107946056,0 -3.30688670219091,0 -3.5548765217606,0 -3.62667154831465,0 -3.96128924673106,0 -3.9383435604935,0 -4.09217554493726,0 -4.12834333139423,0 -3.97687397774776,0 -3.77620328228561,0 -3.67545221079991,0 -3.89406268005115,0 -3.81308625756812,0 -3.84801767545223,0 -3.96043214463583,0 -3.80832776908938,0 -3.98555223871626,0 -4.0515240442057,0 -4.16037415865418,0 -3.75419892023458,0 -3.77007918448618,0 -3.73766961828337,0 -3.71153340467847,0 -4.40575536824794,0 -4.11998794220208,0 -4.00369019395397,0 -4.11414718951828,0 -3.70990682130601,0 -4.02980604108453,0 -4.00733318523247,0 -4.11087386417331,0 -4.11903717481247,0 -4.00914971615887,0 -3.96081316959758,0 -3.93116855415038,0 -4.26127043353808,0 -4.31160417037734,0 -4.26275029709698,0 -4.18677180246803,0 -4.26436859120565,0 -4.08092154188996,0 -3.94931879017184,0 -3.96651119071222,0 -4.16666522380173,0 -3.90841650983403,0 -3.98898404656427,0 -4.37332639712838,0 -4.17899203628239,0 -4.68203863024467,0 -3.37142522332849,0 -3.2557861788883,0 -4.3391191336626,0 -4.2850337899827,0 -3.81286543389493,0 -3.70831436675254,0 -4.19968007756742,0 -4.02168425963766,0 -4.14938499397991,0 -4.32714797316389,0 -4.01223026584517,0 -5.24372917626363,0 -6.22455842927536,0 -6.32051106692587,0 -3.89100363820407,0 -3.8155121050473,0 -3.85333400907947,0 -3.79773385902602,0 -4.98907111618042,0 -4.88225252927326,0 -4.92667380691538,0 -5.22666292049755,0 -4.83707524297087,0 -5.80211837537706,0 -5.73172184334544,0 -4.65538790214871,0 -4.42157782206069,0 -4.31079912538551,0 -3.82209829790016,0 -4.14472076954717,0 -4.17438726989564,0 -4.16666522380173,0 -3.94449019556565,0 -4.30541553230204,0 -4.11414718951828,0 -4.20841701848195,0 -4.25773810913054,0 -4.05644364442232,0 -4.67888522381037,0 -4.2941307757363,0 -4.45408563411598,0 -4.5013640172625,0 -5.55218409050509,0 -5.28421844216853,0 -4.67899890013258,0.108759514557383 -4.64311270571124,0.0694748281070804 -4.56976732699186,0.0550399983128131 -4.47122308926633,0.0634722743693561 -4.43930886351157,0.0776154464750694 -4.54413277790728,0.0265265313916899 -4.50621723981732,0.0183010867421825 -4.33235509318675,0.0250922603614475 -4.32770932002891,0.0235051878487275 -4.3327607245234,0.0182940315861649 -4.32890246447157,0.0181907470660643 -4.32610133513444,0.0197690021063412 -4.3489400904391,0.0245127059725559 -4.37349019541877,0.0126192020729981 -4.31227626094052,0.0229929657793986 -4.27343537929314,0.0296328572650577 -4.3804835894884,0.0249252486587726 -4.40698730387776,0.0241922448602923 -4.41635664540065,0.0179247177781714 -4.34297694043103,0.0325713710513268 -4.18529459785424,0.0454570028958121 -4.08480885217138,0.0403251311797452 -4.11952288595596,0.0366500678888648 -4.38451821517461,0.0293938766858295 -4.11078294231073,0.0384403902184989 -4.15453245710416,0.0314374867794422 -4.10247652274493,0.0281084628993535 -4.08187449132479,0.0325156430798275 -4.23833187265699,0.0301660148991896 -4.25707227867322,0.0284077422314895 -3.99722036552211,0.0382523867944894 -3.94375798837552,0.0397085580283092 -4.01990955837853,0.0259110099538802 -4.01636434921841,0.0261995033585466 -3.76919113052195,0.0310378389938197 -3.75121531894831,0.0140214303589178 -3.67954781367588,0.0283358396918565 -4.10945162915407,0.0203164101939872 -4.10917044173029,0.0200805664032517 -4.09420180355453,0.0267977791709103 -4.08524504552714,0.0247498310149456 -4.10932999529205,0.0202370687181971 -4.24444530466793,0.0275504416459988 -4.22195047944959,0.0226242970973764 -4.14645886222557,0.0124361091319965 -4.28564425796037,0.0199799220028286 -4.26640413644308,0.0161708782641289 -4.26456762453504,0.013494375177526 -4.21524533614563,0.0393651639127329 -4.26160596048332,0.0402671105831014 -4.2487776838365,0.0345340915627697 -4.3182463740002,0.0231126958155544 -4.5679273313009,0.0544407434059665 -4.47182842562339,0.0591463603046446 -4.46006659871382,0.0590269341103257 -4.08079006605161,0.0376429559465366 -3.98686231734447,0.0362520234272936 -3.90263454896071,0.0293417241733987 -3.82754578669576,0.0262565469441084 -3.7371193344236,0.0217775901140193 -3.73053662943123,0.0207781582543137 -3.72477902794297,0.02187289970281 -3.79031117410085,0.0185258220372234 -3.91355447392165,0.0170616364785874 -3.93673168830398,0.0230072218875707 -3.92387140724521,0.0157302859317756 -3.93788995261353,0.0159342168178449 -3.99827057809444,0.0176947468074083 -4.03541990331576,0.0191783380073544 -3.86532881699773,0.0167677338315013 -3.92862084078756,0.0182336845168218 -4.07864823137637,0.0184614207756101 -4.08195830296188,0.0119037263466836 -3.72006976565046,0.0190727412268604 -3.77417129770844,0.0185736302583682 -3.72945350552683,0.0202690434569552 -3.76102877143299,0.0215441909061326 -3.84709049006808,0.0237221078706102 -3.61997760367219,0.0187017496176494 -3.60159902470977,0.0120433001876197 -3.87556414789326,0.0252435373339904 -3.86849707484505,0.0242612978372889 -3.46018462598235,0.0220082919077056 -3.46668557803925,0.0187811047260442 -3.49658209071477,0.0158361725310006 -3.41010301339311,0.0137553403853305 -3.70477683927952,0.025368746792308 -3.67198364921292,0.0282601176577267 -3.70064038715898,0.0290744839429113 -3.73467979766918,0.0246395688164284 -3.59318451643607,0.0119928699051659 -3.79868905240838,0.0232201152034834 -3.83564432797281,0.039558349289148 -3.86575538016918,0.0396862554661517 -3.94270275611981,0.0345794258394112 -4.16276212649558,0.0267207554860212 -4.17092882594926,0.028014087443862 -4.19169946064179,0.0279331583867214 -3.76093614059892,0.0180731752765203 -3.75161505329368,0.020114785380562 -3.73470790970804,0.0232746889648867 -3.74529377608784,0.0159035645726272 -3.75162737736797,0.0154801906499967 -3.77824362176148,0.0157923696936861 -3.99099674155283,0.0179906818505852 -3.72199088171875,0.014617572970985 -3.71735334161905,0.0155159032922479 -3.67537062773419,0.0118360644648115 -3.67649748544402,0.0103705902493027 -3.68090655469952,0.0123740092662714 -3.4359375104435,0.00288856777134622 -3.44685826884209,0.00241248632691916 -3.52832002345011,0.00182440406966884 -4.03888041448229,0.0273530733469738 -4.0092565478052,0.0303602899749716 -4.00052736372841,0.0288462962663547 -3.9979801406852,0.0302816914625263 -4.00567591995215,0.0295394159558883 -4.00031802921111,0.0295524976837685 -3.89142187798065,0.0152638437600461 -3.95011539169467,0.0237606240837073 -3.86793604062404,0.0230704520773183 -3.87795459826058,0.013552241769384 -3.87819636152944,0.0122409396926657 -3.85333563763199,0.0125874376179121 -3.90181542444216,0.0103549228312889 -3.90069609712315,0.0100782597637216 -3.97004100971081,0.019024855266213 -3.93808498893775,0.0195877997984182 -4.08235374425903,0.0114665630334857 -3.85911379624722,0.0193896624275718 -3.79116966042657,0.0152887340741839 -3.77104315458489,0.0143061289391639 -4.08215389603982,0.0124677866056434 -4.07569320117954,0.00996646739150563 -4.07003583429668,0.0087930075764411 -4.06453755120777,0.0143734227849917 -4.06684841902109,0.0085140332983308 -3.99504088999451,0.0134697379731258 -4.08010097976486,0.00886509516144011 -4.07181618539405,0.010176106390322 -4.06955234140947,0.00896931620617295 -4.10085301721402,0.00532716774640795 -4.06317933723036,0.00637514197708495 -4.05056253414682,0.00660210920308709 -4.08515806804706,0.00626137722976101 -4.22417106412224,0.00450587624461304 -4.14520794581829,0.011248879071421 -4.1642085976819,0.00900349840399131 -4.16744729579908,0.00805352368480849 -4.0439672204884,0.0258116764720089 -3.98489789757831,0.041113481545203 -4.04919661198704,0.0256281924271194 -4.0513061337723,0.026053823708639 -4.06309066688248,0.0356167575940329 -4.11745386447842,0.0304930784680985 -4.17495580369649,0.0283378080778349 -4.05274972281571,0.0313817219211325 -3.90294694997991,0.0307216214509042 -3.92115614932133,0.0189568191563854 -3.98078533786806,0.0157321164489215 -4.04665033881598,0.0185721251515323 -3.98848144066389,0.014357030346338 -4.02569094550892,0.011522575854141 -4.00007364542004,0.0121544631319002 -4.02882252742083,0.0126544348942029 -4.06596814938631,0.0120061416376626 -4.08815884823344,0.013002136681674 -5.96052648673317,0.00855145267286051 -5.79256514055282,0.00356372709121233 -3.84705582917972,0.00877156570020868 -3.84858095829379,0.00754539997262829 -3.85263712756422,0.00238334078490857 -4.69204466948456,0.0751889603267253 -4.88496550757599,0.0584536008880735 -4.91961099305853,0.0518382187102437 -4.91802263560587,0.0524990749283662 -4.77008490781906,0.0913163654888126 -5.50992353396366,0.0782041799145207 -4.3782001100507,0.0325379370197896 -4.36046735944413,0.0276669738414949 -4.31127336765589,0.0236457324431837 -4.2970135099397,0.0243310470658416 -4.33188528003584,0.0264927558723777 -4.45685162234265,0.0254488210132692 -4.18153644024445,0.0139706868301312 -4.17447660773752,0.0133072223119456 -4.16828117632517,0.0131008553989087 -4.1527356216972,0.0136011951752622 -4.15850153336582,0.0126307558059093 -4.15900363047967,0.0106629014501229 -4.1757472269213,0.0151846976694536 -4.19100769117827,0.0157205622515858 -4.37668498481546,0.0388350370556909 -4.93020226108197,0.0855727317775253 -5.3445831084132,0.0262064752898024 +"trait","var" +4.42184812886055,0 +4.51743127168008,0 +4.68213122712422,0 +4.43355115232727,0 +4.3210617205896,0 +4.47966365074837,0 +3.98713047791495,0 +4.44135041075727,0 +4.00551334851548,0 +4.40854684448328,0 +4.46791759256172,0 +4.37682400470252,0 +4.43698819274786,0 +4.51961229762644,0 +4.0943445622221,0 +4.39911725446659,0 +4.35502150652934,0 +3.52547778217249,0 +4.20123141243846,0 +4.76294286986063,0 +3.82537519870247,0 +4.30271282795416,0 +4.29387824789718,0 +4.35169628486605,0 +4.23555473077362,0 +3.79323946943818,0 +3.76699723337789,0 +3.99231183665695,0 +3.85142338329922,0 +3.70480201465775,0 +3.79098467705109,0 +3.6988297849671,0 +3.41772668361337,0 +4.00551334851548,0 +4.15304576682959,0 +4.05817319508393,0 +3.89182029811063,0 +4.32057002622753,0 +4.30811095172371,0 +4.15543966158191,0 +4.10791868224922,0 +4.22829253473184,0 +4.16278172377533,0 +4.36246147917904,0 +4.60266705576997,0 +4.41279829334063,0 +4.23916614676084,0 +4.4672864786247,0 +4.07584109065754,0 +4.50454842467744,0 +3.69424006035603,0 +3.98898404656427,0 +3.84801767545223,0 +4.01241117945941,0 +4.63812128612778,0 +3.94893335944824,0 +3.82319179172153,0 +3.80058852498184,0 +4.37866473983298,0 +4.12552017969055,0 +4.04129534113228,0 +3.55105313720653,0 +3.60114053980593,0 +2.96225304647982,0 +4.06263887373527,0 +3.97066920086088,0 +3.8649313978943,0 +3.3178157727231,0 +3.4904285153901,0 +4.29907292330404,0 +3.80291101734437,0 +3.92395157629342,0 +3.22286784613774,0 +3.40119738166216,0 +3.87057581551397,0 +3.38777436133001,0 +3.18013499655177,0 +3.75185425327532,0 +3.44680789291421,0 +3.68260984110034,0 +3.89792408104864,0 +3.90801498403061,0 +3.27336401015227,0 +3.68637632389582,0 +3.38777436133001,0 +3.79773385902602,0 +3.79773385902602,0 +3.9759363311718,0 +3.90197266957464,0 +4.50468664740977,0 +4.31715472463507,0 +4.32446372727274,0 +3.71332813451625,0 +3.50480636428118,0 +3.92592591059714,0 +3.40734511224839,0 +4.14128380814951,0 +4.07889245766318,0 +3.65970807681366,0 +3.7536132686805,0 +3.58351893845611,0 +3.77292184468871,0 +3.60086757679072,0 +3.99452422693989,0 +3.25848107946056,0 +3.30688670219091,0 +3.5548765217606,0 +3.62667154831465,0 +3.96128924673106,0 +3.9383435604935,0 +4.09217554493726,0 +4.12834333139423,0 +3.97687397774776,0 +3.77620328228561,0 +3.67545221079991,0 +3.89406268005115,0 +3.81308625756812,0 +3.84801767545223,0 +3.96043214463583,0 +3.80832776908938,0 +3.98555223871626,0 +4.0515240442057,0 +4.16037415865418,0 +3.75419892023458,0 +3.77007918448618,0 +3.73766961828337,0 +3.71153340467847,0 +4.40575536824794,0 +4.11998794220208,0 +4.00369019395397,0 +4.11414718951828,0 +3.70990682130601,0 +4.02980604108453,0 +4.00733318523247,0 +4.11087386417331,0 +4.11903717481247,0 +4.00914971615887,0 +3.96081316959758,0 +3.93116855415038,0 +4.26127043353808,0 +4.31160417037734,0 +4.26275029709698,0 +4.18677180246803,0 +4.26436859120565,0 +4.08092154188996,0 +3.94931879017184,0 +3.96651119071222,0 +4.16666522380173,0 +3.90841650983403,0 +3.98898404656427,0 +4.37332639712838,0 +4.17899203628239,0 +4.68203863024467,0 +3.37142522332849,0 +3.2557861788883,0 +4.3391191336626,0 +4.2850337899827,0 +3.81286543389493,0 +3.70831436675254,0 +4.19968007756742,0 +4.02168425963766,0 +4.14938499397991,0 +4.32714797316389,0 +4.01223026584517,0 +5.24372917626363,0 +6.22455842927536,0 +6.32051106692587,0 +3.89100363820407,0 +3.8155121050473,0 +3.85333400907947,0 +3.79773385902602,0 +4.98907111618042,0 +4.88225252927326,0 +4.92667380691538,0 +5.22666292049755,0 +4.83707524297087,0 +5.80211837537706,0 +5.73172184334544,0 +4.65538790214871,0 +4.42157782206069,0 +4.31079912538551,0 +3.82209829790016,0 +4.14472076954717,0 +4.17438726989564,0 +4.16666522380173,0 +3.94449019556565,0 +4.30541553230204,0 +4.11414718951828,0 +4.20841701848195,0 +4.25773810913054,0 +4.05644364442232,0 +4.67888522381037,0 +4.2941307757363,0 +4.45408563411598,0 +4.5013640172625,0 +5.55218409050509,0 +5.28421844216853,0 +4.67899890013258,0.108759514557383 +4.64311270571124,0.0694748281070804 +4.56976732699186,0.0550399983128131 +4.47122308926633,0.0634722743693561 +4.43930886351157,0.0776154464750694 +4.54413277790728,0.0265265313916899 +4.50621723981732,0.0183010867421825 +4.33235509318675,0.0250922603614475 +4.32770932002891,0.0235051878487275 +4.3327607245234,0.0182940315861649 +4.32890246447157,0.0181907470660643 +4.32610133513444,0.0197690021063412 +4.3489400904391,0.0245127059725559 +4.37349019541877,0.0126192020729981 +4.31227626094052,0.0229929657793986 +4.27343537929314,0.0296328572650577 +4.3804835894884,0.0249252486587726 +4.40698730387776,0.0241922448602923 +4.41635664540065,0.0179247177781714 +4.34297694043103,0.0325713710513268 +4.18529459785424,0.0454570028958121 +4.08480885217138,0.0403251311797452 +4.11952288595596,0.0366500678888648 +4.38451821517461,0.0293938766858295 +4.11078294231073,0.0384403902184989 +4.15453245710416,0.0314374867794422 +4.10247652274493,0.0281084628993535 +4.08187449132479,0.0325156430798275 +4.23833187265699,0.0301660148991896 +4.25707227867322,0.0284077422314895 +3.99722036552211,0.0382523867944894 +3.94375798837552,0.0397085580283092 +4.01990955837853,0.0259110099538802 +4.01636434921841,0.0261995033585466 +3.76919113052195,0.0310378389938197 +3.75121531894831,0.0140214303589178 +3.67954781367588,0.0283358396918565 +4.10945162915407,0.0203164101939872 +4.10917044173029,0.0200805664032517 +4.09420180355453,0.0267977791709103 +4.08524504552714,0.0247498310149456 +4.10932999529205,0.0202370687181971 +4.24444530466793,0.0275504416459988 +4.22195047944959,0.0226242970973764 +4.14645886222557,0.0124361091319965 +4.28564425796037,0.0199799220028286 +4.26640413644308,0.0161708782641289 +4.26456762453504,0.013494375177526 +4.21524533614563,0.0393651639127329 +4.26160596048332,0.0402671105831014 +4.2487776838365,0.0345340915627697 +4.3182463740002,0.0231126958155544 +4.5679273313009,0.0544407434059665 +4.47182842562339,0.0591463603046446 +4.46006659871382,0.0590269341103257 +4.08079006605161,0.0376429559465366 +3.98686231734447,0.0362520234272936 +3.90263454896071,0.0293417241733987 +3.82754578669576,0.0262565469441084 +3.7371193344236,0.0217775901140193 +3.73053662943123,0.0207781582543137 +3.72477902794297,0.02187289970281 +3.79031117410085,0.0185258220372234 +3.91355447392165,0.0170616364785874 +3.93673168830398,0.0230072218875707 +3.92387140724521,0.0157302859317756 +3.93788995261353,0.0159342168178449 +3.99827057809444,0.0176947468074083 +4.03541990331576,0.0191783380073544 +3.86532881699773,0.0167677338315013 +3.92862084078756,0.0182336845168218 +4.07864823137637,0.0184614207756101 +4.08195830296188,0.0119037263466836 +3.72006976565046,0.0190727412268604 +3.77417129770844,0.0185736302583682 +3.72945350552683,0.0202690434569552 +3.76102877143299,0.0215441909061326 +3.84709049006808,0.0237221078706102 +3.61997760367219,0.0187017496176494 +3.60159902470977,0.0120433001876197 +3.87556414789326,0.0252435373339904 +3.86849707484505,0.0242612978372889 +3.46018462598235,0.0220082919077056 +3.46668557803925,0.0187811047260442 +3.49658209071477,0.0158361725310006 +3.41010301339311,0.0137553403853305 +3.70477683927952,0.025368746792308 +3.67198364921292,0.0282601176577267 +3.70064038715898,0.0290744839429113 +3.73467979766918,0.0246395688164284 +3.59318451643607,0.0119928699051659 +3.79868905240838,0.0232201152034834 +3.83564432797281,0.039558349289148 +3.86575538016918,0.0396862554661517 +3.94270275611981,0.0345794258394112 +4.16276212649558,0.0267207554860212 +4.17092882594926,0.028014087443862 +4.19169946064179,0.0279331583867214 +3.76093614059892,0.0180731752765203 +3.75161505329368,0.020114785380562 +3.73470790970804,0.0232746889648867 +3.74529377608784,0.0159035645726272 +3.75162737736797,0.0154801906499967 +3.77824362176148,0.0157923696936861 +3.99099674155283,0.0179906818505852 +3.72199088171875,0.014617572970985 +3.71735334161905,0.0155159032922479 +3.67537062773419,0.0118360644648115 +3.67649748544402,0.0103705902493027 +3.68090655469952,0.0123740092662714 +3.4359375104435,0.00288856777134622 +3.44685826884209,0.00241248632691916 +3.52832002345011,0.00182440406966884 +4.03888041448229,0.0273530733469738 +4.0092565478052,0.0303602899749716 +4.00052736372841,0.0288462962663547 +3.9979801406852,0.0302816914625263 +4.00567591995215,0.0295394159558883 +4.00031802921111,0.0295524976837685 +3.89142187798065,0.0152638437600461 +3.95011539169467,0.0237606240837073 +3.86793604062404,0.0230704520773183 +3.87795459826058,0.013552241769384 +3.87819636152944,0.0122409396926657 +3.85333563763199,0.0125874376179121 +3.90181542444216,0.0103549228312889 +3.90069609712315,0.0100782597637216 +3.97004100971081,0.019024855266213 +3.93808498893775,0.0195877997984182 +4.08235374425903,0.0114665630334857 +3.85911379624722,0.0193896624275718 +3.79116966042657,0.0152887340741839 +3.77104315458489,0.0143061289391639 +4.08215389603982,0.0124677866056434 +4.07569320117954,0.00996646739150563 +4.07003583429668,0.0087930075764411 +4.06453755120777,0.0143734227849917 +4.06684841902109,0.0085140332983308 +3.99504088999451,0.0134697379731258 +4.08010097976486,0.00886509516144011 +4.07181618539405,0.010176106390322 +4.06955234140947,0.00896931620617295 +4.10085301721402,0.00532716774640795 +4.06317933723036,0.00637514197708495 +4.05056253414682,0.00660210920308709 +4.08515806804706,0.00626137722976101 +4.22417106412224,0.00450587624461304 +4.14520794581829,0.011248879071421 +4.1642085976819,0.00900349840399131 +4.16744729579908,0.00805352368480849 +4.0439672204884,0.0258116764720089 +3.98489789757831,0.041113481545203 +4.04919661198704,0.0256281924271194 +4.0513061337723,0.026053823708639 +4.06309066688248,0.0356167575940329 +4.11745386447842,0.0304930784680985 +4.17495580369649,0.0283378080778349 +4.05274972281571,0.0313817219211325 +3.90294694997991,0.0307216214509042 +3.92115614932133,0.0189568191563854 +3.98078533786806,0.0157321164489215 +4.04665033881598,0.0185721251515323 +3.98848144066389,0.014357030346338 +4.02569094550892,0.011522575854141 +4.00007364542004,0.0121544631319002 +4.02882252742083,0.0126544348942029 +4.06596814938631,0.0120061416376626 +4.08815884823344,0.013002136681674 +5.96052648673317,0.00855145267286051 +5.79256514055282,0.00356372709121233 +3.84705582917972,0.00877156570020868 +3.84858095829379,0.00754539997262829 +3.85263712756422,0.00238334078490857 +4.69204466948456,0.0751889603267253 +4.88496550757599,0.0584536008880735 +4.91961099305853,0.0518382187102437 +4.91802263560587,0.0524990749283662 +4.77008490781906,0.0913163654888126 +5.50992353396366,0.0782041799145207 +4.3782001100507,0.0325379370197896 +4.36046735944413,0.0276669738414949 +4.31127336765589,0.0236457324431837 +4.2970135099397,0.0243310470658416 +4.33188528003584,0.0264927558723777 +4.45685162234265,0.0254488210132692 +4.18153644024445,0.0139706868301312 +4.17447660773752,0.0133072223119456 +4.16828117632517,0.0131008553989087 +4.1527356216972,0.0136011951752622 +4.15850153336582,0.0126307558059093 +4.15900363047967,0.0106629014501229 +4.1757472269213,0.0151846976694536 +4.19100769117827,0.0157205622515858 +4.37668498481546,0.0388350370556909 +4.93020226108197,0.0855727317775253 +5.3445831084132,0.0262064752898024 diff --git a/examples/caudata_dist.txt b/examples/caudata_dist.txt index 559f5f6dc..f75491dc5 100644 --- a/examples/caudata_dist.txt +++ b/examples/caudata_dist.txt @@ -1,198 +1,198 @@ -"Dicamptodon_copei","Dicamptodon_tenebrosus","Dicamptodon_ensatus","Ambystoma_texanum","Ambystoma_barbouri","Ambystoma_opacum","Ambystoma_cingulatum","Ambystoma_annulatum","Ambystoma_laterale","Ambystoma_jeffersonianum","Ambystoma_ordinarium","Ambystoma_mavortium","Ambystoma_velasci","Ambystoma_californiense","Ambystoma_macrodactylum","Ambystoma_maculatum","Ambystoma_gracile","Salamandrina_terdigitata","Salamandra_atra","Salamandra_salamandra","Chioglossa_lusitanica","Mertensiella_caucasica","Taricha_granulosa","Taricha_torosa","Taricha_rivularis","Notophthalmus_meridionalis","Notophthalmus_perstriatus","Notophthalmus_viridescens","Ichthyosaura_alpestris","Lissotriton_vulgaris","Lissotriton_montandoni","Lissotriton_helveticus","Lissotriton_boscai","Triturus_pygmaeus","Triturus_cristatus","Calotriton_asper","Ommatotriton_vittatus","Neurergus_crocatus","Neurergus_strauchii","Cynops_pyrrhogaster","Cynops_ensicauda","Paramesotriton_caudopunctatus","Paramesotriton_chinensis","Paramesotriton_hongkongensis","Pachytriton_brevipes","Echinotriton_andersoni","Tylototriton_verrucosus","Tylototriton_kweichowensis","Tylototriton_asperrimus","Pleurodeles_waltl","Hemidactylium_scutatum","Bolitoglossa_adspersa","Bolitoglossa_palmata","Bolitoglossa_subpalmata","Bolitoglossa_dofleini","Bolitoglossa_morio","Bolitoglossa_engelhardti","Bolitoglossa_rostrata","Bolitoglossa_platydactyla","Bolitoglossa_mexicana","Bolitoglossa_yucatana","Bolitoglossa_occidentalis","Bolitoglossa_rufescens","Parvimolge_townsendi","Pseudoeurycea_leprosa","Pseudoeurycea_werleri","Pseudoeurycea_robertsi","Pseudoeurycea_gadovii","Pseudoeurycea_rex","Pseudoeurycea_bellii","Pseudoeurycea_cephalica","Pseudoeurycea_galeanae","Chiropterotriton_dimidiatus","Chiropterotriton_lavae","Chiropterotriton_priscus","Chiropterotriton_multidentatus","Chiropterotriton_chondrostega","Bradytriton_silus","Oedipina_complex","Oedipina_parvipes","Oedipina_cyclocauda","Oedipina_uniformis","Nototriton_picadoi","Nyctanolis_pernix","Cryptotriton_nasalis","Batrachoseps_wrighti","Batrachoseps_attenuatus","Batrachoseps_major","Stereochilus_marginatus","Gyrinophilus_porphyriticus","Pseudotriton_montanus","Pseudotriton_ruber","Eurycea_multiplicata","Eurycea_tynerensis","Eurycea_spelaea","Eurycea_quadridigitata","Eurycea_lucifuga","Eurycea_longicauda","Eurycea_cirrigera","Eurycea_bislineata","Eurycea_aquatica","Eurycea_junaluska","Eurycea_wilderae","Eurycea_rathbuni","Eurycea_nana","Eurycea_sosorum","Eurycea_neotenes","Eurycea_tridentifera","Plethodon_elongatus","Plethodon_vehiculum","Plethodon_dunni","Plethodon_neomexicanus","Plethodon_vandykei","Plethodon_idahoensis","Plethodon_serratus","Plethodon_hoffmani","Plethodon_cinereus","Plethodon_shenandoah","Plethodon_richmondi","Plethodon_nettingi","Plethodon_hubrichti","Plethodon_wehrlei","Plethodon_punctatus","Plethodon_welleri","Plethodon_angusticlavius","Plethodon_ventralis","Plethodon_dorsalis","Plethodon_yonahlossee","Plethodon_kentucki","Plethodon_metcalfi","Plethodon_jordani","Plethodon_caddoensis","Plethodon_ouachitae","Plethodon_montanus","Plethodon_amplus","Plethodon_meridianus","Plethodon_shermani","Plethodon_cheoah","Plethodon_chlorobryonis","Plethodon_teyahalee","Plethodon_cylindraceus","Plethodon_glutinosus","Plethodon_mississippi","Plethodon_albagula","Plethodon_grobmani","Hydromantes_italicus","Hydromantes_platycephalus","Ensatina_eschscholtzii","Aneides_aeneus","Aneides_hardii","Aneides_lugubris","Aneides_flavipunctatus","Phaeognathus_hubrichti","Desmognathus_wrighti","Desmognathus_aeneus","Desmognathus_quadramaculatus","Desmognathus_marmoratus","Desmognathus_imitator","Desmognathus_ochrophaeus","Desmognathus_welteri","Desmognathus_fuscus","Desmognathus_monticola","Desmognathus_brimleyorum","Desmognathus_auriculatus","Amphiuma_pholeter","Amphiuma_means","Amphiuma_tridactylum","Rhyacotriton_olympicus","Rhyacotriton_kezeri","Rhyacotriton_cascadae","Rhyacotriton_variegatus","Proteus_anguinus","Necturus_alabamensis","Necturus_beyeri","Necturus_maculosus","Necturus_punctatus","Andrias_davidianus","Cryptobranchus_alleganiensis","Batrachuperus_pinchonii","Batrachuperus_yenyuanensis","Liua_shihi","Salamandrella_keyserlingii","Hynobius_nebulosus","Hynobius_dunni","Hynobius_tsuensis","Hynobius_leechii","Hynobius_naevius","Hynobius_stejnegeri","Hynobius_nigrescens","Hynobius_lichenatus","Hynobius_abei","Pachyhynobius_shangchengensis","Paradactylodon_mustersi","Ranodon_sibiricus","Pseudobranchus_axanthus","Siren_lacertina","Siren_intermedia" -0,31.76812578,48.23322428,235.99708805,235.99708805,235.99708806,235.99708807,235.99708806,235.99708805,235.99708805,235.99708803,235.99708804,235.99708803,235.99708804,235.99708804,235.99708804,235.99708804,325.99688205,325.99698504,325.99698505,325.99688207,325.99688207,325.99677902,325.99688203,325.99688205,325.99688207,325.99688206,325.99688206,325.99698502,325.99688206,325.99688206,325.99698505,325.99698505,325.99688206,325.99698502,325.99688202,325.99698505,325.99698506,325.99698511,325.99688205,325.99688205,325.99688209,325.99698506,325.99698511,325.99698505,325.99698508,325.99698507,325.99698507,325.99698507,325.99688206,361.97922212,361.97922214,361.97922213,361.9613562,361.97922212,361.96135619,361.9613562,361.9613562,361.97922212,361.99708804,361.99708804,361.97922212,361.97922212,361.9613562,361.96135619,361.99708803,361.96135621,361.97922212,361.96135621,361.97922213,361.97922213,361.97922213,361.9613562,361.9613562,361.96135619,361.96135619,361.9613562,361.9613562,361.96135621,361.96135621,361.94349028,361.94349029,361.96135619,361.97922212,361.9613562,361.9613562,361.96135619,361.96135619,361.97922212,361.97922212,361.97922211,361.97922211,361.97922213,361.99708806,361.99708806,361.97922212,361.97922212,361.97922212,361.99708805,361.99708805,361.99708805,361.99708805,361.99708805,361.97922213,361.97922213,361.97922213,361.97922213,361.97922213,361.96135618,361.97922211,361.97922211,361.96135619,361.97922211,361.97922211,361.96135619,361.94349028,361.94349028,361.94349028,361.96135619,361.94349027,361.94349027,361.96135619,361.96135619,361.97922211,361.97922211,361.97922212,361.97922212,361.96135619,361.97922211,361.97922211,361.97922211,361.96135619,361.96135619,361.9613562,361.9613562,361.9613562,361.96135619,361.96135619,361.9613562,361.94349028,361.94349028,361.96135619,361.96135619,361.96135619,361.96135619,361.97922211,361.97922211,361.97922212,361.97922212,361.97922212,361.97922213,361.97922213,361.97922211,361.9613562,361.97922213,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.94349028,361.94349028,361.99708805,361.99708805,361.99708805,361.99708806,361.99708806,361.99708805,361.99708805,361.99708805,361.99708804,361.99708805,361.99708805,361.99708804,387.99708805,387.99708805,387.99708805,387.99708804,387.99708806,387.99708805,387.997088029,387.997088029,387.997088032,387.997088034,387.997088033,387.997088034,387.997088035,387.997088035,387.99708803,387.99708805,387.99708803,387.99708803,427.99708805,427.99708805,427.99708805 -31.76812578,0,48.23322428,235.99708805,235.99708805,235.99708806,235.99708807,235.99708806,235.99708805,235.99708805,235.99708803,235.99708804,235.99708803,235.99708804,235.99708804,235.99708804,235.99708804,325.99688205,325.99698504,325.99698505,325.99688207,325.99688207,325.99677902,325.99688203,325.99688205,325.99688207,325.99688206,325.99688206,325.99698502,325.99688206,325.99688206,325.99698505,325.99698505,325.99688206,325.99698502,325.99688202,325.99698505,325.99698506,325.99698511,325.99688205,325.99688205,325.99688209,325.99698506,325.99698511,325.99698505,325.99698508,325.99698507,325.99698507,325.99698507,325.99688206,361.97922212,361.97922214,361.97922213,361.9613562,361.97922212,361.96135619,361.9613562,361.9613562,361.97922212,361.99708804,361.99708804,361.97922212,361.97922212,361.9613562,361.96135619,361.99708803,361.96135621,361.97922212,361.96135621,361.97922213,361.97922213,361.97922213,361.9613562,361.9613562,361.96135619,361.96135619,361.9613562,361.9613562,361.96135621,361.96135621,361.94349028,361.94349029,361.96135619,361.97922212,361.9613562,361.9613562,361.96135619,361.96135619,361.97922212,361.97922212,361.97922211,361.97922211,361.97922213,361.99708806,361.99708806,361.97922212,361.97922212,361.97922212,361.99708805,361.99708805,361.99708805,361.99708805,361.99708805,361.97922213,361.97922213,361.97922213,361.97922213,361.97922213,361.96135618,361.97922211,361.97922211,361.96135619,361.97922211,361.97922211,361.96135619,361.94349028,361.94349028,361.94349028,361.96135619,361.94349027,361.94349027,361.96135619,361.96135619,361.97922211,361.97922211,361.97922212,361.97922212,361.96135619,361.97922211,361.97922211,361.97922211,361.96135619,361.96135619,361.9613562,361.9613562,361.9613562,361.96135619,361.96135619,361.9613562,361.94349028,361.94349028,361.96135619,361.96135619,361.96135619,361.96135619,361.97922211,361.97922211,361.97922212,361.97922212,361.97922212,361.97922213,361.97922213,361.97922211,361.9613562,361.97922213,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.94349028,361.94349028,361.99708805,361.99708805,361.99708805,361.99708806,361.99708806,361.99708805,361.99708805,361.99708805,361.99708804,361.99708805,361.99708805,361.99708804,387.99708805,387.99708805,387.99708805,387.99708804,387.99708806,387.99708805,387.997088029,387.997088029,387.997088032,387.997088034,387.997088033,387.997088034,387.997088035,387.997088035,387.99708803,387.99708805,387.99708803,387.99708803,427.99708805,427.99708805,427.99708805 -48.23322428,48.23322428,0,235.99708805,235.99708805,235.99708806,235.99708807,235.99708806,235.99708805,235.99708805,235.99708803,235.99708804,235.99708803,235.99708804,235.99708804,235.99708804,235.99708804,325.99688205,325.99698504,325.99698505,325.99688207,325.99688207,325.99677902,325.99688203,325.99688205,325.99688207,325.99688206,325.99688206,325.99698502,325.99688206,325.99688206,325.99698505,325.99698505,325.99688206,325.99698502,325.99688202,325.99698505,325.99698506,325.99698511,325.99688205,325.99688205,325.99688209,325.99698506,325.99698511,325.99698505,325.99698508,325.99698507,325.99698507,325.99698507,325.99688206,361.97922212,361.97922214,361.97922213,361.9613562,361.97922212,361.96135619,361.9613562,361.9613562,361.97922212,361.99708804,361.99708804,361.97922212,361.97922212,361.9613562,361.96135619,361.99708803,361.96135621,361.97922212,361.96135621,361.97922213,361.97922213,361.97922213,361.9613562,361.9613562,361.96135619,361.96135619,361.9613562,361.9613562,361.96135621,361.96135621,361.94349028,361.94349029,361.96135619,361.97922212,361.9613562,361.9613562,361.96135619,361.96135619,361.97922212,361.97922212,361.97922211,361.97922211,361.97922213,361.99708806,361.99708806,361.97922212,361.97922212,361.97922212,361.99708805,361.99708805,361.99708805,361.99708805,361.99708805,361.97922213,361.97922213,361.97922213,361.97922213,361.97922213,361.96135618,361.97922211,361.97922211,361.96135619,361.97922211,361.97922211,361.96135619,361.94349028,361.94349028,361.94349028,361.96135619,361.94349027,361.94349027,361.96135619,361.96135619,361.97922211,361.97922211,361.97922212,361.97922212,361.96135619,361.97922211,361.97922211,361.97922211,361.96135619,361.96135619,361.9613562,361.9613562,361.9613562,361.96135619,361.96135619,361.9613562,361.94349028,361.94349028,361.96135619,361.96135619,361.96135619,361.96135619,361.97922211,361.97922211,361.97922212,361.97922212,361.97922212,361.97922213,361.97922213,361.97922211,361.9613562,361.97922213,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.94349028,361.94349028,361.99708805,361.99708805,361.99708805,361.99708806,361.99708806,361.99708805,361.99708805,361.99708805,361.99708804,361.99708805,361.99708805,361.99708804,387.99708805,387.99708805,387.99708805,387.99708804,387.99708806,387.99708805,387.997088029,387.997088029,387.997088032,387.997088034,387.997088033,387.997088034,387.997088035,387.997088035,387.99708803,387.99708805,387.99708803,387.99708803,427.99708805,427.99708805,427.99708805 -235.99708805,235.99708805,235.99708805,0,19.10653358,80.56326553,91.85789584,91.85789583,102.51158612,102.51158612,104.34922622,104.34922623,104.34922622,104.34922623,115.89221069,118.83999999,118.83999999,325.999794,325.99989699,325.999897,325.99979402,325.99979402,325.99969097,325.99979398,325.999794,325.99979402,325.99979401,325.99979401,325.99989697,325.99979401,325.99979401,325.999897,325.999897,325.99979401,325.99989697,325.99979397,325.999897,325.99989701,325.99989706,325.999794,325.999794,325.99979404,325.99989701,325.99989706,325.999897,325.99989703,325.99989702,325.99989702,325.99989702,325.99979401,361.98213407,361.98213409,361.98213408,361.96426815,361.98213407,361.96426814,361.96426815,361.96426815,361.98213407,361.99999999,361.99999999,361.98213407,361.98213407,361.96426815,361.96426814,361.99999998,361.96426816,361.98213407,361.96426816,361.98213408,361.98213408,361.98213408,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.96426815,361.96426816,361.96426816,361.94640223,361.94640224,361.96426814,361.98213407,361.96426815,361.96426815,361.96426814,361.96426814,361.98213407,361.98213407,361.98213406,361.98213406,361.98213408,362.00000001,362.00000001,361.98213407,361.98213407,361.98213407,362,362,362,362,362,361.98213408,361.98213408,361.98213408,361.98213408,361.98213408,361.96426813,361.98213406,361.98213406,361.96426814,361.98213406,361.98213406,361.96426814,361.94640223,361.94640223,361.94640223,361.96426814,361.94640222,361.94640222,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.96426814,361.98213406,361.98213406,361.98213406,361.96426814,361.96426814,361.96426815,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.94640223,361.94640223,361.96426814,361.96426814,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.98213407,361.98213408,361.98213408,361.98213406,361.96426815,361.98213408,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.94640223,361.94640223,362,362,362,362.00000001,362.00000001,362,362,362,361.99999999,362,362,361.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -235.99708805,235.99708805,235.99708805,19.10653358,0,80.56326553,91.85789584,91.85789583,102.51158612,102.51158612,104.34922622,104.34922623,104.34922622,104.34922623,115.89221069,118.83999999,118.83999999,325.999794,325.99989699,325.999897,325.99979402,325.99979402,325.99969097,325.99979398,325.999794,325.99979402,325.99979401,325.99979401,325.99989697,325.99979401,325.99979401,325.999897,325.999897,325.99979401,325.99989697,325.99979397,325.999897,325.99989701,325.99989706,325.999794,325.999794,325.99979404,325.99989701,325.99989706,325.999897,325.99989703,325.99989702,325.99989702,325.99989702,325.99979401,361.98213407,361.98213409,361.98213408,361.96426815,361.98213407,361.96426814,361.96426815,361.96426815,361.98213407,361.99999999,361.99999999,361.98213407,361.98213407,361.96426815,361.96426814,361.99999998,361.96426816,361.98213407,361.96426816,361.98213408,361.98213408,361.98213408,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.96426815,361.96426816,361.96426816,361.94640223,361.94640224,361.96426814,361.98213407,361.96426815,361.96426815,361.96426814,361.96426814,361.98213407,361.98213407,361.98213406,361.98213406,361.98213408,362.00000001,362.00000001,361.98213407,361.98213407,361.98213407,362,362,362,362,362,361.98213408,361.98213408,361.98213408,361.98213408,361.98213408,361.96426813,361.98213406,361.98213406,361.96426814,361.98213406,361.98213406,361.96426814,361.94640223,361.94640223,361.94640223,361.96426814,361.94640222,361.94640222,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.96426814,361.98213406,361.98213406,361.98213406,361.96426814,361.96426814,361.96426815,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.94640223,361.94640223,361.96426814,361.96426814,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.98213407,361.98213408,361.98213408,361.98213406,361.96426815,361.98213408,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.94640223,361.94640223,362,362,362,362.00000001,362.00000001,362,362,362,361.99999999,362,362,361.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -235.99708806,235.99708806,235.99708806,80.56326553,80.56326553,0,91.85789585,91.85789584,102.51158613,102.51158613,104.34922623,104.34922624,104.34922623,104.34922624,115.8922107,118.84,118.84,325.99979401,325.999897,325.99989701,325.99979403,325.99979403,325.99969098,325.99979399,325.99979401,325.99979403,325.99979402,325.99979402,325.99989698,325.99979402,325.99979402,325.99989701,325.99989701,325.99979402,325.99989698,325.99979398,325.99989701,325.99989702,325.99989707,325.99979401,325.99979401,325.99979405,325.99989702,325.99989707,325.99989701,325.99989704,325.99989703,325.99989703,325.99989703,325.99979402,361.98213408,361.9821341,361.98213409,361.96426816,361.98213408,361.96426815,361.96426816,361.96426816,361.98213408,362,362,361.98213408,361.98213408,361.96426816,361.96426815,361.99999999,361.96426817,361.98213408,361.96426817,361.98213409,361.98213409,361.98213409,361.96426816,361.96426816,361.96426815,361.96426815,361.96426816,361.96426816,361.96426817,361.96426817,361.94640224,361.94640225,361.96426815,361.98213408,361.96426816,361.96426816,361.96426815,361.96426815,361.98213408,361.98213408,361.98213407,361.98213407,361.98213409,362.00000002,362.00000002,361.98213408,361.98213408,361.98213408,362.00000001,362.00000001,362.00000001,362.00000001,362.00000001,361.98213409,361.98213409,361.98213409,361.98213409,361.98213409,361.96426814,361.98213407,361.98213407,361.96426815,361.98213407,361.98213407,361.96426815,361.94640224,361.94640224,361.94640224,361.96426815,361.94640223,361.94640223,361.96426815,361.96426815,361.98213407,361.98213407,361.98213408,361.98213408,361.96426815,361.98213407,361.98213407,361.98213407,361.96426815,361.96426815,361.96426816,361.96426816,361.96426816,361.96426815,361.96426815,361.96426816,361.94640224,361.94640224,361.96426815,361.96426815,361.96426815,361.96426815,361.98213407,361.98213407,361.98213408,361.98213408,361.98213408,361.98213409,361.98213409,361.98213407,361.96426816,361.98213409,361.96426816,361.96426816,361.96426816,361.96426816,361.96426816,361.96426816,361.96426816,361.94640224,361.94640224,362.00000001,362.00000001,362.00000001,362.00000002,362.00000002,362.00000001,362.00000001,362.00000001,362,362.00000001,362.00000001,362,388.00000001,388.00000001,388.00000001,388,388.00000002,388.00000001,387.999999989,387.999999989,387.999999992,387.999999994,387.999999993,387.999999994,387.999999995,387.999999995,387.99999999,388.00000001,387.99999999,387.99999999,428.00000001,428.00000001,428.00000001 -235.99708807,235.99708807,235.99708807,91.85789584,91.85789584,91.85789585,0,85.80757595,102.51158614,102.51158614,104.34922624,104.34922625,104.34922624,104.34922625,115.89221071,118.84000001,118.84000001,325.99979402,325.99989701,325.99989702,325.99979404,325.99979404,325.99969099,325.999794,325.99979402,325.99979404,325.99979403,325.99979403,325.99989699,325.99979403,325.99979403,325.99989702,325.99989702,325.99979403,325.99989699,325.99979399,325.99989702,325.99989703,325.99989708,325.99979402,325.99979402,325.99979406,325.99989703,325.99989708,325.99989702,325.99989705,325.99989704,325.99989704,325.99989704,325.99979403,361.98213409,361.98213411,361.9821341,361.96426817,361.98213409,361.96426816,361.96426817,361.96426817,361.98213409,362.00000001,362.00000001,361.98213409,361.98213409,361.96426817,361.96426816,362,361.96426818,361.98213409,361.96426818,361.9821341,361.9821341,361.9821341,361.96426817,361.96426817,361.96426816,361.96426816,361.96426817,361.96426817,361.96426818,361.96426818,361.94640225,361.94640226,361.96426816,361.98213409,361.96426817,361.96426817,361.96426816,361.96426816,361.98213409,361.98213409,361.98213408,361.98213408,361.9821341,362.00000003,362.00000003,361.98213409,361.98213409,361.98213409,362.00000002,362.00000002,362.00000002,362.00000002,362.00000002,361.9821341,361.9821341,361.9821341,361.9821341,361.9821341,361.96426815,361.98213408,361.98213408,361.96426816,361.98213408,361.98213408,361.96426816,361.94640225,361.94640225,361.94640225,361.96426816,361.94640224,361.94640224,361.96426816,361.96426816,361.98213408,361.98213408,361.98213409,361.98213409,361.96426816,361.98213408,361.98213408,361.98213408,361.96426816,361.96426816,361.96426817,361.96426817,361.96426817,361.96426816,361.96426816,361.96426817,361.94640225,361.94640225,361.96426816,361.96426816,361.96426816,361.96426816,361.98213408,361.98213408,361.98213409,361.98213409,361.98213409,361.9821341,361.9821341,361.98213408,361.96426817,361.9821341,361.96426817,361.96426817,361.96426817,361.96426817,361.96426817,361.96426817,361.96426817,361.94640225,361.94640225,362.00000002,362.00000002,362.00000002,362.00000003,362.00000003,362.00000002,362.00000002,362.00000002,362.00000001,362.00000002,362.00000002,362.00000001,388.00000002,388.00000002,388.00000002,388.00000001,388.00000003,388.00000002,387.999999999,387.999999999,388.000000002,388.000000004,388.000000003,388.000000004,388.000000005,388.000000005,388,388.00000002,388,388,428.00000002,428.00000002,428.00000002 -235.99708806,235.99708806,235.99708806,91.85789583,91.85789583,91.85789584,85.80757595,0,102.51158613,102.51158613,104.34922623,104.34922624,104.34922623,104.34922624,115.8922107,118.84,118.84,325.99979401,325.999897,325.99989701,325.99979403,325.99979403,325.99969098,325.99979399,325.99979401,325.99979403,325.99979402,325.99979402,325.99989698,325.99979402,325.99979402,325.99989701,325.99989701,325.99979402,325.99989698,325.99979398,325.99989701,325.99989702,325.99989707,325.99979401,325.99979401,325.99979405,325.99989702,325.99989707,325.99989701,325.99989704,325.99989703,325.99989703,325.99989703,325.99979402,361.98213408,361.9821341,361.98213409,361.96426816,361.98213408,361.96426815,361.96426816,361.96426816,361.98213408,362,362,361.98213408,361.98213408,361.96426816,361.96426815,361.99999999,361.96426817,361.98213408,361.96426817,361.98213409,361.98213409,361.98213409,361.96426816,361.96426816,361.96426815,361.96426815,361.96426816,361.96426816,361.96426817,361.96426817,361.94640224,361.94640225,361.96426815,361.98213408,361.96426816,361.96426816,361.96426815,361.96426815,361.98213408,361.98213408,361.98213407,361.98213407,361.98213409,362.00000002,362.00000002,361.98213408,361.98213408,361.98213408,362.00000001,362.00000001,362.00000001,362.00000001,362.00000001,361.98213409,361.98213409,361.98213409,361.98213409,361.98213409,361.96426814,361.98213407,361.98213407,361.96426815,361.98213407,361.98213407,361.96426815,361.94640224,361.94640224,361.94640224,361.96426815,361.94640223,361.94640223,361.96426815,361.96426815,361.98213407,361.98213407,361.98213408,361.98213408,361.96426815,361.98213407,361.98213407,361.98213407,361.96426815,361.96426815,361.96426816,361.96426816,361.96426816,361.96426815,361.96426815,361.96426816,361.94640224,361.94640224,361.96426815,361.96426815,361.96426815,361.96426815,361.98213407,361.98213407,361.98213408,361.98213408,361.98213408,361.98213409,361.98213409,361.98213407,361.96426816,361.98213409,361.96426816,361.96426816,361.96426816,361.96426816,361.96426816,361.96426816,361.96426816,361.94640224,361.94640224,362.00000001,362.00000001,362.00000001,362.00000002,362.00000002,362.00000001,362.00000001,362.00000001,362,362.00000001,362.00000001,362,388.00000001,388.00000001,388.00000001,388,388.00000002,388.00000001,387.999999989,387.999999989,387.999999992,387.999999994,387.999999993,387.999999994,387.999999995,387.999999995,387.99999999,388.00000001,387.99999999,387.99999999,428.00000001,428.00000001,428.00000001 -235.99708805,235.99708805,235.99708805,102.51158612,102.51158612,102.51158613,102.51158614,102.51158613,0,72.31140646,104.34922622,104.34922623,104.34922622,104.34922623,115.89221069,118.83999999,118.83999999,325.999794,325.99989699,325.999897,325.99979402,325.99979402,325.99969097,325.99979398,325.999794,325.99979402,325.99979401,325.99979401,325.99989697,325.99979401,325.99979401,325.999897,325.999897,325.99979401,325.99989697,325.99979397,325.999897,325.99989701,325.99989706,325.999794,325.999794,325.99979404,325.99989701,325.99989706,325.999897,325.99989703,325.99989702,325.99989702,325.99989702,325.99979401,361.98213407,361.98213409,361.98213408,361.96426815,361.98213407,361.96426814,361.96426815,361.96426815,361.98213407,361.99999999,361.99999999,361.98213407,361.98213407,361.96426815,361.96426814,361.99999998,361.96426816,361.98213407,361.96426816,361.98213408,361.98213408,361.98213408,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.96426815,361.96426816,361.96426816,361.94640223,361.94640224,361.96426814,361.98213407,361.96426815,361.96426815,361.96426814,361.96426814,361.98213407,361.98213407,361.98213406,361.98213406,361.98213408,362.00000001,362.00000001,361.98213407,361.98213407,361.98213407,362,362,362,362,362,361.98213408,361.98213408,361.98213408,361.98213408,361.98213408,361.96426813,361.98213406,361.98213406,361.96426814,361.98213406,361.98213406,361.96426814,361.94640223,361.94640223,361.94640223,361.96426814,361.94640222,361.94640222,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.96426814,361.98213406,361.98213406,361.98213406,361.96426814,361.96426814,361.96426815,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.94640223,361.94640223,361.96426814,361.96426814,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.98213407,361.98213408,361.98213408,361.98213406,361.96426815,361.98213408,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.94640223,361.94640223,362,362,362,362.00000001,362.00000001,362,362,362,361.99999999,362,362,361.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -235.99708805,235.99708805,235.99708805,102.51158612,102.51158612,102.51158613,102.51158614,102.51158613,72.31140646,0,104.34922622,104.34922623,104.34922622,104.34922623,115.89221069,118.83999999,118.83999999,325.999794,325.99989699,325.999897,325.99979402,325.99979402,325.99969097,325.99979398,325.999794,325.99979402,325.99979401,325.99979401,325.99989697,325.99979401,325.99979401,325.999897,325.999897,325.99979401,325.99989697,325.99979397,325.999897,325.99989701,325.99989706,325.999794,325.999794,325.99979404,325.99989701,325.99989706,325.999897,325.99989703,325.99989702,325.99989702,325.99989702,325.99979401,361.98213407,361.98213409,361.98213408,361.96426815,361.98213407,361.96426814,361.96426815,361.96426815,361.98213407,361.99999999,361.99999999,361.98213407,361.98213407,361.96426815,361.96426814,361.99999998,361.96426816,361.98213407,361.96426816,361.98213408,361.98213408,361.98213408,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.96426815,361.96426816,361.96426816,361.94640223,361.94640224,361.96426814,361.98213407,361.96426815,361.96426815,361.96426814,361.96426814,361.98213407,361.98213407,361.98213406,361.98213406,361.98213408,362.00000001,362.00000001,361.98213407,361.98213407,361.98213407,362,362,362,362,362,361.98213408,361.98213408,361.98213408,361.98213408,361.98213408,361.96426813,361.98213406,361.98213406,361.96426814,361.98213406,361.98213406,361.96426814,361.94640223,361.94640223,361.94640223,361.96426814,361.94640222,361.94640222,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.96426814,361.98213406,361.98213406,361.98213406,361.96426814,361.96426814,361.96426815,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.94640223,361.94640223,361.96426814,361.96426814,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.98213407,361.98213408,361.98213408,361.98213406,361.96426815,361.98213408,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.94640223,361.94640223,362,362,362,362.00000001,362.00000001,362,362,362,361.99999999,362,362,361.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -235.99708803,235.99708803,235.99708803,104.34922622,104.34922622,104.34922623,104.34922624,104.34922623,104.34922622,104.34922622,0,31.72545619,56.4377159,85.53988873,115.89221067,118.83999997,118.83999997,325.99979398,325.99989697,325.99989698,325.999794,325.999794,325.99969095,325.99979396,325.99979398,325.999794,325.99979399,325.99979399,325.99989695,325.99979399,325.99979399,325.99989698,325.99989698,325.99979399,325.99989695,325.99979395,325.99989698,325.99989699,325.99989704,325.99979398,325.99979398,325.99979402,325.99989699,325.99989704,325.99989698,325.99989701,325.999897,325.999897,325.999897,325.99979399,361.98213405,361.98213407,361.98213406,361.96426813,361.98213405,361.96426812,361.96426813,361.96426813,361.98213405,361.99999997,361.99999997,361.98213405,361.98213405,361.96426813,361.96426812,361.99999996,361.96426814,361.98213405,361.96426814,361.98213406,361.98213406,361.98213406,361.96426813,361.96426813,361.96426812,361.96426812,361.96426813,361.96426813,361.96426814,361.96426814,361.94640221,361.94640222,361.96426812,361.98213405,361.96426813,361.96426813,361.96426812,361.96426812,361.98213405,361.98213405,361.98213404,361.98213404,361.98213406,361.99999999,361.99999999,361.98213405,361.98213405,361.98213405,361.99999998,361.99999998,361.99999998,361.99999998,361.99999998,361.98213406,361.98213406,361.98213406,361.98213406,361.98213406,361.96426811,361.98213404,361.98213404,361.96426812,361.98213404,361.98213404,361.96426812,361.94640221,361.94640221,361.94640221,361.96426812,361.9464022,361.9464022,361.96426812,361.96426812,361.98213404,361.98213404,361.98213405,361.98213405,361.96426812,361.98213404,361.98213404,361.98213404,361.96426812,361.96426812,361.96426813,361.96426813,361.96426813,361.96426812,361.96426812,361.96426813,361.94640221,361.94640221,361.96426812,361.96426812,361.96426812,361.96426812,361.98213404,361.98213404,361.98213405,361.98213405,361.98213405,361.98213406,361.98213406,361.98213404,361.96426813,361.98213406,361.96426813,361.96426813,361.96426813,361.96426813,361.96426813,361.96426813,361.96426813,361.94640221,361.94640221,361.99999998,361.99999998,361.99999998,361.99999999,361.99999999,361.99999998,361.99999998,361.99999998,361.99999997,361.99999998,361.99999998,361.99999997,387.99999998,387.99999998,387.99999998,387.99999997,387.99999999,387.99999998,387.999999959,387.999999959,387.999999962,387.999999964,387.999999963,387.999999964,387.999999965,387.999999965,387.99999996,387.99999998,387.99999996,387.99999996,427.99999998,427.99999998,427.99999998 -235.99708804,235.99708804,235.99708804,104.34922623,104.34922623,104.34922624,104.34922625,104.34922624,104.34922623,104.34922623,31.72545619,0,56.43771591,85.53988874,115.89221068,118.83999998,118.83999998,325.99979399,325.99989698,325.99989699,325.99979401,325.99979401,325.99969096,325.99979397,325.99979399,325.99979401,325.999794,325.999794,325.99989696,325.999794,325.999794,325.99989699,325.99989699,325.999794,325.99989696,325.99979396,325.99989699,325.999897,325.99989705,325.99979399,325.99979399,325.99979403,325.999897,325.99989705,325.99989699,325.99989702,325.99989701,325.99989701,325.99989701,325.999794,361.98213406,361.98213408,361.98213407,361.96426814,361.98213406,361.96426813,361.96426814,361.96426814,361.98213406,361.99999998,361.99999998,361.98213406,361.98213406,361.96426814,361.96426813,361.99999997,361.96426815,361.98213406,361.96426815,361.98213407,361.98213407,361.98213407,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.96426814,361.96426815,361.96426815,361.94640222,361.94640223,361.96426813,361.98213406,361.96426814,361.96426814,361.96426813,361.96426813,361.98213406,361.98213406,361.98213405,361.98213405,361.98213407,362,362,361.98213406,361.98213406,361.98213406,361.99999999,361.99999999,361.99999999,361.99999999,361.99999999,361.98213407,361.98213407,361.98213407,361.98213407,361.98213407,361.96426812,361.98213405,361.98213405,361.96426813,361.98213405,361.98213405,361.96426813,361.94640222,361.94640222,361.94640222,361.96426813,361.94640221,361.94640221,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.96426813,361.98213405,361.98213405,361.98213405,361.96426813,361.96426813,361.96426814,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.94640222,361.94640222,361.96426813,361.96426813,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.98213406,361.98213407,361.98213407,361.98213405,361.96426814,361.98213407,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.94640222,361.94640222,361.99999999,361.99999999,361.99999999,362,362,361.99999999,361.99999999,361.99999999,361.99999998,361.99999999,361.99999999,361.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 -235.99708803,235.99708803,235.99708803,104.34922622,104.34922622,104.34922623,104.34922624,104.34922623,104.34922622,104.34922622,56.4377159,56.43771591,0,85.53988873,115.89221067,118.83999997,118.83999997,325.99979398,325.99989697,325.99989698,325.999794,325.999794,325.99969095,325.99979396,325.99979398,325.999794,325.99979399,325.99979399,325.99989695,325.99979399,325.99979399,325.99989698,325.99989698,325.99979399,325.99989695,325.99979395,325.99989698,325.99989699,325.99989704,325.99979398,325.99979398,325.99979402,325.99989699,325.99989704,325.99989698,325.99989701,325.999897,325.999897,325.999897,325.99979399,361.98213405,361.98213407,361.98213406,361.96426813,361.98213405,361.96426812,361.96426813,361.96426813,361.98213405,361.99999997,361.99999997,361.98213405,361.98213405,361.96426813,361.96426812,361.99999996,361.96426814,361.98213405,361.96426814,361.98213406,361.98213406,361.98213406,361.96426813,361.96426813,361.96426812,361.96426812,361.96426813,361.96426813,361.96426814,361.96426814,361.94640221,361.94640222,361.96426812,361.98213405,361.96426813,361.96426813,361.96426812,361.96426812,361.98213405,361.98213405,361.98213404,361.98213404,361.98213406,361.99999999,361.99999999,361.98213405,361.98213405,361.98213405,361.99999998,361.99999998,361.99999998,361.99999998,361.99999998,361.98213406,361.98213406,361.98213406,361.98213406,361.98213406,361.96426811,361.98213404,361.98213404,361.96426812,361.98213404,361.98213404,361.96426812,361.94640221,361.94640221,361.94640221,361.96426812,361.9464022,361.9464022,361.96426812,361.96426812,361.98213404,361.98213404,361.98213405,361.98213405,361.96426812,361.98213404,361.98213404,361.98213404,361.96426812,361.96426812,361.96426813,361.96426813,361.96426813,361.96426812,361.96426812,361.96426813,361.94640221,361.94640221,361.96426812,361.96426812,361.96426812,361.96426812,361.98213404,361.98213404,361.98213405,361.98213405,361.98213405,361.98213406,361.98213406,361.98213404,361.96426813,361.98213406,361.96426813,361.96426813,361.96426813,361.96426813,361.96426813,361.96426813,361.96426813,361.94640221,361.94640221,361.99999998,361.99999998,361.99999998,361.99999999,361.99999999,361.99999998,361.99999998,361.99999998,361.99999997,361.99999998,361.99999998,361.99999997,387.99999998,387.99999998,387.99999998,387.99999997,387.99999999,387.99999998,387.999999959,387.999999959,387.999999962,387.999999964,387.999999963,387.999999964,387.999999965,387.999999965,387.99999996,387.99999998,387.99999996,387.99999996,427.99999998,427.99999998,427.99999998 -235.99708804,235.99708804,235.99708804,104.34922623,104.34922623,104.34922624,104.34922625,104.34922624,104.34922623,104.34922623,85.53988873,85.53988874,85.53988873,0,115.89221068,118.83999998,118.83999998,325.99979399,325.99989698,325.99989699,325.99979401,325.99979401,325.99969096,325.99979397,325.99979399,325.99979401,325.999794,325.999794,325.99989696,325.999794,325.999794,325.99989699,325.99989699,325.999794,325.99989696,325.99979396,325.99989699,325.999897,325.99989705,325.99979399,325.99979399,325.99979403,325.999897,325.99989705,325.99989699,325.99989702,325.99989701,325.99989701,325.99989701,325.999794,361.98213406,361.98213408,361.98213407,361.96426814,361.98213406,361.96426813,361.96426814,361.96426814,361.98213406,361.99999998,361.99999998,361.98213406,361.98213406,361.96426814,361.96426813,361.99999997,361.96426815,361.98213406,361.96426815,361.98213407,361.98213407,361.98213407,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.96426814,361.96426815,361.96426815,361.94640222,361.94640223,361.96426813,361.98213406,361.96426814,361.96426814,361.96426813,361.96426813,361.98213406,361.98213406,361.98213405,361.98213405,361.98213407,362,362,361.98213406,361.98213406,361.98213406,361.99999999,361.99999999,361.99999999,361.99999999,361.99999999,361.98213407,361.98213407,361.98213407,361.98213407,361.98213407,361.96426812,361.98213405,361.98213405,361.96426813,361.98213405,361.98213405,361.96426813,361.94640222,361.94640222,361.94640222,361.96426813,361.94640221,361.94640221,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.96426813,361.98213405,361.98213405,361.98213405,361.96426813,361.96426813,361.96426814,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.94640222,361.94640222,361.96426813,361.96426813,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.98213406,361.98213407,361.98213407,361.98213405,361.96426814,361.98213407,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.94640222,361.94640222,361.99999999,361.99999999,361.99999999,362,362,361.99999999,361.99999999,361.99999999,361.99999998,361.99999999,361.99999999,361.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 -235.99708804,235.99708804,235.99708804,115.89221069,115.89221069,115.8922107,115.89221071,115.8922107,115.89221069,115.89221069,115.89221067,115.89221068,115.89221067,115.89221068,0,118.83999998,118.83999998,325.99979399,325.99989698,325.99989699,325.99979401,325.99979401,325.99969096,325.99979397,325.99979399,325.99979401,325.999794,325.999794,325.99989696,325.999794,325.999794,325.99989699,325.99989699,325.999794,325.99989696,325.99979396,325.99989699,325.999897,325.99989705,325.99979399,325.99979399,325.99979403,325.999897,325.99989705,325.99989699,325.99989702,325.99989701,325.99989701,325.99989701,325.999794,361.98213406,361.98213408,361.98213407,361.96426814,361.98213406,361.96426813,361.96426814,361.96426814,361.98213406,361.99999998,361.99999998,361.98213406,361.98213406,361.96426814,361.96426813,361.99999997,361.96426815,361.98213406,361.96426815,361.98213407,361.98213407,361.98213407,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.96426814,361.96426815,361.96426815,361.94640222,361.94640223,361.96426813,361.98213406,361.96426814,361.96426814,361.96426813,361.96426813,361.98213406,361.98213406,361.98213405,361.98213405,361.98213407,362,362,361.98213406,361.98213406,361.98213406,361.99999999,361.99999999,361.99999999,361.99999999,361.99999999,361.98213407,361.98213407,361.98213407,361.98213407,361.98213407,361.96426812,361.98213405,361.98213405,361.96426813,361.98213405,361.98213405,361.96426813,361.94640222,361.94640222,361.94640222,361.96426813,361.94640221,361.94640221,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.96426813,361.98213405,361.98213405,361.98213405,361.96426813,361.96426813,361.96426814,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.94640222,361.94640222,361.96426813,361.96426813,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.98213406,361.98213407,361.98213407,361.98213405,361.96426814,361.98213407,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.94640222,361.94640222,361.99999999,361.99999999,361.99999999,362,362,361.99999999,361.99999999,361.99999999,361.99999998,361.99999999,361.99999999,361.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 -235.99708804,235.99708804,235.99708804,118.83999999,118.83999999,118.84,118.84000001,118.84,118.83999999,118.83999999,118.83999997,118.83999998,118.83999997,118.83999998,118.83999998,0,102.82232778,325.99979399,325.99989698,325.99989699,325.99979401,325.99979401,325.99969096,325.99979397,325.99979399,325.99979401,325.999794,325.999794,325.99989696,325.999794,325.999794,325.99989699,325.99989699,325.999794,325.99989696,325.99979396,325.99989699,325.999897,325.99989705,325.99979399,325.99979399,325.99979403,325.999897,325.99989705,325.99989699,325.99989702,325.99989701,325.99989701,325.99989701,325.999794,361.98213406,361.98213408,361.98213407,361.96426814,361.98213406,361.96426813,361.96426814,361.96426814,361.98213406,361.99999998,361.99999998,361.98213406,361.98213406,361.96426814,361.96426813,361.99999997,361.96426815,361.98213406,361.96426815,361.98213407,361.98213407,361.98213407,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.96426814,361.96426815,361.96426815,361.94640222,361.94640223,361.96426813,361.98213406,361.96426814,361.96426814,361.96426813,361.96426813,361.98213406,361.98213406,361.98213405,361.98213405,361.98213407,362,362,361.98213406,361.98213406,361.98213406,361.99999999,361.99999999,361.99999999,361.99999999,361.99999999,361.98213407,361.98213407,361.98213407,361.98213407,361.98213407,361.96426812,361.98213405,361.98213405,361.96426813,361.98213405,361.98213405,361.96426813,361.94640222,361.94640222,361.94640222,361.96426813,361.94640221,361.94640221,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.96426813,361.98213405,361.98213405,361.98213405,361.96426813,361.96426813,361.96426814,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.94640222,361.94640222,361.96426813,361.96426813,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.98213406,361.98213407,361.98213407,361.98213405,361.96426814,361.98213407,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.94640222,361.94640222,361.99999999,361.99999999,361.99999999,362,362,361.99999999,361.99999999,361.99999999,361.99999998,361.99999999,361.99999999,361.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 -235.99708804,235.99708804,235.99708804,118.83999999,118.83999999,118.84,118.84000001,118.84,118.83999999,118.83999999,118.83999997,118.83999998,118.83999997,118.83999998,118.83999998,102.82232778,0,325.99979399,325.99989698,325.99989699,325.99979401,325.99979401,325.99969096,325.99979397,325.99979399,325.99979401,325.999794,325.999794,325.99989696,325.999794,325.999794,325.99989699,325.99989699,325.999794,325.99989696,325.99979396,325.99989699,325.999897,325.99989705,325.99979399,325.99979399,325.99979403,325.999897,325.99989705,325.99989699,325.99989702,325.99989701,325.99989701,325.99989701,325.999794,361.98213406,361.98213408,361.98213407,361.96426814,361.98213406,361.96426813,361.96426814,361.96426814,361.98213406,361.99999998,361.99999998,361.98213406,361.98213406,361.96426814,361.96426813,361.99999997,361.96426815,361.98213406,361.96426815,361.98213407,361.98213407,361.98213407,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.96426814,361.96426815,361.96426815,361.94640222,361.94640223,361.96426813,361.98213406,361.96426814,361.96426814,361.96426813,361.96426813,361.98213406,361.98213406,361.98213405,361.98213405,361.98213407,362,362,361.98213406,361.98213406,361.98213406,361.99999999,361.99999999,361.99999999,361.99999999,361.99999999,361.98213407,361.98213407,361.98213407,361.98213407,361.98213407,361.96426812,361.98213405,361.98213405,361.96426813,361.98213405,361.98213405,361.96426813,361.94640222,361.94640222,361.94640222,361.96426813,361.94640221,361.94640221,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.96426813,361.98213405,361.98213405,361.98213405,361.96426813,361.96426813,361.96426814,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.94640222,361.94640222,361.96426813,361.96426813,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.98213406,361.98213407,361.98213407,361.98213405,361.96426814,361.98213407,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.94640222,361.94640222,361.99999999,361.99999999,361.99999999,362,362,361.99999999,361.99999999,361.99999999,361.99999998,361.99999999,361.99999999,361.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 -325.99688205,325.99688205,325.99688205,325.999794,325.999794,325.99979401,325.99979402,325.99979401,325.999794,325.999794,325.99979398,325.99979399,325.99979398,325.99979399,325.99979399,325.99979399,325.99979399,0,128.52612993,128.52612994,128.52602696,128.52602696,205.99948497,205.99958798,205.999588,205.99958802,205.99958801,205.99958801,205.99969097,205.99958801,205.99958801,205.999691,205.999691,205.99958801,205.99969097,205.99958797,205.999691,205.99969101,205.99969106,205.999588,205.999588,205.99958804,205.99969101,205.99969106,205.999691,205.99969103,205.99969102,205.99969102,205.99969102,205.99958801,361.98192807,361.98192809,361.98192808,361.96406215,361.98192807,361.96406214,361.96406215,361.96406215,361.98192807,361.99979399,361.99979399,361.98192807,361.98192807,361.96406215,361.96406214,361.99979398,361.96406216,361.98192807,361.96406216,361.98192808,361.98192808,361.98192808,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.96406215,361.96406216,361.96406216,361.94619623,361.94619624,361.96406214,361.98192807,361.96406215,361.96406215,361.96406214,361.96406214,361.98192807,361.98192807,361.98192806,361.98192806,361.98192808,361.99979401,361.99979401,361.98192807,361.98192807,361.98192807,361.999794,361.999794,361.999794,361.999794,361.999794,361.98192808,361.98192808,361.98192808,361.98192808,361.98192808,361.96406213,361.98192806,361.98192806,361.96406214,361.98192806,361.98192806,361.96406214,361.94619623,361.94619623,361.94619623,361.96406214,361.94619622,361.94619622,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.96406214,361.98192806,361.98192806,361.98192806,361.96406214,361.96406214,361.96406215,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.94619623,361.94619623,361.96406214,361.96406214,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.98192807,361.98192808,361.98192808,361.98192806,361.96406215,361.98192808,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.94619623,361.94619623,361.999794,361.999794,361.999794,361.99979401,361.99979401,361.999794,361.999794,361.999794,361.99979399,361.999794,361.999794,361.99979399,387.999794,387.999794,387.999794,387.99979399,387.99979401,387.999794,387.999793979,387.999793979,387.999793982,387.999793984,387.999793983,387.999793984,387.999793985,387.999793985,387.99979398,387.999794,387.99979398,387.99979398,427.999794,427.999794,427.999794 -325.99698504,325.99698504,325.99698504,325.99989699,325.99989699,325.999897,325.99989701,325.999897,325.99989699,325.99989699,325.99989697,325.99989698,325.99989697,325.99989698,325.99989698,325.99989698,325.99989698,128.52612993,0,49.68751261,117.16257469,117.16257469,205.99958796,205.99969097,205.99969099,205.99969101,205.999691,205.999691,205.99979396,205.999691,205.999691,205.99979399,205.99979399,205.999691,205.99979396,205.99969096,205.99979399,205.999794,205.99979405,205.99969099,205.99969099,205.99969103,205.999794,205.99979405,205.99979399,205.99979402,205.99979401,205.99979401,205.99979401,205.999691,361.98203106,361.98203108,361.98203107,361.96416514,361.98203106,361.96416513,361.96416514,361.96416514,361.98203106,361.99989698,361.99989698,361.98203106,361.98203106,361.96416514,361.96416513,361.99989697,361.96416515,361.98203106,361.96416515,361.98203107,361.98203107,361.98203107,361.96416514,361.96416514,361.96416513,361.96416513,361.96416514,361.96416514,361.96416515,361.96416515,361.94629922,361.94629923,361.96416513,361.98203106,361.96416514,361.96416514,361.96416513,361.96416513,361.98203106,361.98203106,361.98203105,361.98203105,361.98203107,361.999897,361.999897,361.98203106,361.98203106,361.98203106,361.99989699,361.99989699,361.99989699,361.99989699,361.99989699,361.98203107,361.98203107,361.98203107,361.98203107,361.98203107,361.96416512,361.98203105,361.98203105,361.96416513,361.98203105,361.98203105,361.96416513,361.94629922,361.94629922,361.94629922,361.96416513,361.94629921,361.94629921,361.96416513,361.96416513,361.98203105,361.98203105,361.98203106,361.98203106,361.96416513,361.98203105,361.98203105,361.98203105,361.96416513,361.96416513,361.96416514,361.96416514,361.96416514,361.96416513,361.96416513,361.96416514,361.94629922,361.94629922,361.96416513,361.96416513,361.96416513,361.96416513,361.98203105,361.98203105,361.98203106,361.98203106,361.98203106,361.98203107,361.98203107,361.98203105,361.96416514,361.98203107,361.96416514,361.96416514,361.96416514,361.96416514,361.96416514,361.96416514,361.96416514,361.94629922,361.94629922,361.99989699,361.99989699,361.99989699,361.999897,361.999897,361.99989699,361.99989699,361.99989699,361.99989698,361.99989699,361.99989699,361.99989698,387.99989699,387.99989699,387.99989699,387.99989698,387.999897,387.99989699,387.999896969,387.999896969,387.999896972,387.999896974,387.999896973,387.999896974,387.999896975,387.999896975,387.99989697,387.99989699,387.99989697,387.99989697,427.99989699,427.99989699,427.99989699 -325.99698505,325.99698505,325.99698505,325.999897,325.999897,325.99989701,325.99989702,325.99989701,325.999897,325.999897,325.99989698,325.99989699,325.99989698,325.99989699,325.99989699,325.99989699,325.99989699,128.52612994,49.68751261,0,117.1625747,117.1625747,205.99958797,205.99969098,205.999691,205.99969102,205.99969101,205.99969101,205.99979397,205.99969101,205.99969101,205.999794,205.999794,205.99969101,205.99979397,205.99969097,205.999794,205.99979401,205.99979406,205.999691,205.999691,205.99969104,205.99979401,205.99979406,205.999794,205.99979403,205.99979402,205.99979402,205.99979402,205.99969101,361.98203107,361.98203109,361.98203108,361.96416515,361.98203107,361.96416514,361.96416515,361.96416515,361.98203107,361.99989699,361.99989699,361.98203107,361.98203107,361.96416515,361.96416514,361.99989698,361.96416516,361.98203107,361.96416516,361.98203108,361.98203108,361.98203108,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.96416515,361.96416516,361.96416516,361.94629923,361.94629924,361.96416514,361.98203107,361.96416515,361.96416515,361.96416514,361.96416514,361.98203107,361.98203107,361.98203106,361.98203106,361.98203108,361.99989701,361.99989701,361.98203107,361.98203107,361.98203107,361.999897,361.999897,361.999897,361.999897,361.999897,361.98203108,361.98203108,361.98203108,361.98203108,361.98203108,361.96416513,361.98203106,361.98203106,361.96416514,361.98203106,361.98203106,361.96416514,361.94629923,361.94629923,361.94629923,361.96416514,361.94629922,361.94629922,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.96416514,361.98203106,361.98203106,361.98203106,361.96416514,361.96416514,361.96416515,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.94629923,361.94629923,361.96416514,361.96416514,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.98203107,361.98203108,361.98203108,361.98203106,361.96416515,361.98203108,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.94629923,361.94629923,361.999897,361.999897,361.999897,361.99989701,361.99989701,361.999897,361.999897,361.999897,361.99989699,361.999897,361.999897,361.99989699,387.999897,387.999897,387.999897,387.99989699,387.99989701,387.999897,387.999896979,387.999896979,387.999896982,387.999896984,387.999896983,387.999896984,387.999896985,387.999896985,387.99989698,387.999897,387.99989698,387.99989698,427.999897,427.999897,427.999897 -325.99688207,325.99688207,325.99688207,325.99979402,325.99979402,325.99979403,325.99979404,325.99979403,325.99979402,325.99979402,325.999794,325.99979401,325.999794,325.99979401,325.99979401,325.99979401,325.99979401,128.52602696,117.16257469,117.1625747,0,107.14471176,205.99948499,205.999588,205.99958802,205.99958804,205.99958803,205.99958803,205.99969099,205.99958803,205.99958803,205.99969102,205.99969102,205.99958803,205.99969099,205.99958799,205.99969102,205.99969103,205.99969108,205.99958802,205.99958802,205.99958806,205.99969103,205.99969108,205.99969102,205.99969105,205.99969104,205.99969104,205.99969104,205.99958803,361.98192809,361.98192811,361.9819281,361.96406217,361.98192809,361.96406216,361.96406217,361.96406217,361.98192809,361.99979401,361.99979401,361.98192809,361.98192809,361.96406217,361.96406216,361.999794,361.96406218,361.98192809,361.96406218,361.9819281,361.9819281,361.9819281,361.96406217,361.96406217,361.96406216,361.96406216,361.96406217,361.96406217,361.96406218,361.96406218,361.94619625,361.94619626,361.96406216,361.98192809,361.96406217,361.96406217,361.96406216,361.96406216,361.98192809,361.98192809,361.98192808,361.98192808,361.9819281,361.99979403,361.99979403,361.98192809,361.98192809,361.98192809,361.99979402,361.99979402,361.99979402,361.99979402,361.99979402,361.9819281,361.9819281,361.9819281,361.9819281,361.9819281,361.96406215,361.98192808,361.98192808,361.96406216,361.98192808,361.98192808,361.96406216,361.94619625,361.94619625,361.94619625,361.96406216,361.94619624,361.94619624,361.96406216,361.96406216,361.98192808,361.98192808,361.98192809,361.98192809,361.96406216,361.98192808,361.98192808,361.98192808,361.96406216,361.96406216,361.96406217,361.96406217,361.96406217,361.96406216,361.96406216,361.96406217,361.94619625,361.94619625,361.96406216,361.96406216,361.96406216,361.96406216,361.98192808,361.98192808,361.98192809,361.98192809,361.98192809,361.9819281,361.9819281,361.98192808,361.96406217,361.9819281,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.94619625,361.94619625,361.99979402,361.99979402,361.99979402,361.99979403,361.99979403,361.99979402,361.99979402,361.99979402,361.99979401,361.99979402,361.99979402,361.99979401,387.99979402,387.99979402,387.99979402,387.99979401,387.99979403,387.99979402,387.999793999,387.999793999,387.999794002,387.999794004,387.999794003,387.999794004,387.999794005,387.999794005,387.999794,387.99979402,387.999794,387.999794,427.99979402,427.99979402,427.99979402 -325.99688207,325.99688207,325.99688207,325.99979402,325.99979402,325.99979403,325.99979404,325.99979403,325.99979402,325.99979402,325.999794,325.99979401,325.999794,325.99979401,325.99979401,325.99979401,325.99979401,128.52602696,117.16257469,117.1625747,107.14471176,0,205.99948499,205.999588,205.99958802,205.99958804,205.99958803,205.99958803,205.99969099,205.99958803,205.99958803,205.99969102,205.99969102,205.99958803,205.99969099,205.99958799,205.99969102,205.99969103,205.99969108,205.99958802,205.99958802,205.99958806,205.99969103,205.99969108,205.99969102,205.99969105,205.99969104,205.99969104,205.99969104,205.99958803,361.98192809,361.98192811,361.9819281,361.96406217,361.98192809,361.96406216,361.96406217,361.96406217,361.98192809,361.99979401,361.99979401,361.98192809,361.98192809,361.96406217,361.96406216,361.999794,361.96406218,361.98192809,361.96406218,361.9819281,361.9819281,361.9819281,361.96406217,361.96406217,361.96406216,361.96406216,361.96406217,361.96406217,361.96406218,361.96406218,361.94619625,361.94619626,361.96406216,361.98192809,361.96406217,361.96406217,361.96406216,361.96406216,361.98192809,361.98192809,361.98192808,361.98192808,361.9819281,361.99979403,361.99979403,361.98192809,361.98192809,361.98192809,361.99979402,361.99979402,361.99979402,361.99979402,361.99979402,361.9819281,361.9819281,361.9819281,361.9819281,361.9819281,361.96406215,361.98192808,361.98192808,361.96406216,361.98192808,361.98192808,361.96406216,361.94619625,361.94619625,361.94619625,361.96406216,361.94619624,361.94619624,361.96406216,361.96406216,361.98192808,361.98192808,361.98192809,361.98192809,361.96406216,361.98192808,361.98192808,361.98192808,361.96406216,361.96406216,361.96406217,361.96406217,361.96406217,361.96406216,361.96406216,361.96406217,361.94619625,361.94619625,361.96406216,361.96406216,361.96406216,361.96406216,361.98192808,361.98192808,361.98192809,361.98192809,361.98192809,361.9819281,361.9819281,361.98192808,361.96406217,361.9819281,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.94619625,361.94619625,361.99979402,361.99979402,361.99979402,361.99979403,361.99979403,361.99979402,361.99979402,361.99979402,361.99979401,361.99979402,361.99979402,361.99979401,387.99979402,387.99979402,387.99979402,387.99979401,387.99979403,387.99979402,387.999793999,387.999793999,387.999794002,387.999794004,387.999794003,387.999794004,387.999794005,387.999794005,387.999794,387.99979402,387.999794,387.999794,427.99979402,427.99979402,427.99979402 -325.99677902,325.99677902,325.99677902,325.99969097,325.99969097,325.99969098,325.99969099,325.99969098,325.99969097,325.99969097,325.99969095,325.99969096,325.99969095,325.99969096,325.99969096,325.99969096,325.99969096,205.99948497,205.99958796,205.99958797,205.99948499,205.99948499,0,62.08652477,70.93935709,146.24127051,146.2412705,146.2412705,164.34173326,164.3416303,164.3416303,164.34173329,164.34173329,164.3416303,164.34173326,164.34163026,164.34173329,164.3417333,164.34173335,164.34163029,164.34163029,164.34163033,164.3417333,164.34173335,164.34173329,177.66578668,177.66578667,177.66578667,177.66578667,177.66568366,361.98182504,361.98182506,361.98182505,361.96395912,361.98182504,361.96395911,361.96395912,361.96395912,361.98182504,361.99969096,361.99969096,361.98182504,361.98182504,361.96395912,361.96395911,361.99969095,361.96395913,361.98182504,361.96395913,361.98182505,361.98182505,361.98182505,361.96395912,361.96395912,361.96395911,361.96395911,361.96395912,361.96395912,361.96395913,361.96395913,361.9460932,361.94609321,361.96395911,361.98182504,361.96395912,361.96395912,361.96395911,361.96395911,361.98182504,361.98182504,361.98182503,361.98182503,361.98182505,361.99969098,361.99969098,361.98182504,361.98182504,361.98182504,361.99969097,361.99969097,361.99969097,361.99969097,361.99969097,361.98182505,361.98182505,361.98182505,361.98182505,361.98182505,361.9639591,361.98182503,361.98182503,361.96395911,361.98182503,361.98182503,361.96395911,361.9460932,361.9460932,361.9460932,361.96395911,361.94609319,361.94609319,361.96395911,361.96395911,361.98182503,361.98182503,361.98182504,361.98182504,361.96395911,361.98182503,361.98182503,361.98182503,361.96395911,361.96395911,361.96395912,361.96395912,361.96395912,361.96395911,361.96395911,361.96395912,361.9460932,361.9460932,361.96395911,361.96395911,361.96395911,361.96395911,361.98182503,361.98182503,361.98182504,361.98182504,361.98182504,361.98182505,361.98182505,361.98182503,361.96395912,361.98182505,361.96395912,361.96395912,361.96395912,361.96395912,361.96395912,361.96395912,361.96395912,361.9460932,361.9460932,361.99969097,361.99969097,361.99969097,361.99969098,361.99969098,361.99969097,361.99969097,361.99969097,361.99969096,361.99969097,361.99969097,361.99969096,387.99969097,387.99969097,387.99969097,387.99969096,387.99969098,387.99969097,387.999690949,387.999690949,387.999690952,387.999690954,387.999690953,387.999690954,387.999690955,387.999690955,387.99969095,387.99969097,387.99969095,387.99969095,427.99969097,427.99969097,427.99969097 -325.99688203,325.99688203,325.99688203,325.99979398,325.99979398,325.99979399,325.999794,325.99979399,325.99979398,325.99979398,325.99979396,325.99979397,325.99979396,325.99979397,325.99979397,325.99979397,325.99979397,205.99958798,205.99969097,205.99969098,205.999588,205.999588,62.08652477,0,70.9394601,146.24137352,146.24137351,146.24137351,164.34183627,164.34173331,164.34173331,164.3418363,164.3418363,164.34173331,164.34183627,164.34173327,164.3418363,164.34183631,164.34183636,164.3417333,164.3417333,164.34173334,164.34183631,164.34183636,164.3418363,177.66588969,177.66588968,177.66588968,177.66588968,177.66578667,361.98192805,361.98192807,361.98192806,361.96406213,361.98192805,361.96406212,361.96406213,361.96406213,361.98192805,361.99979397,361.99979397,361.98192805,361.98192805,361.96406213,361.96406212,361.99979396,361.96406214,361.98192805,361.96406214,361.98192806,361.98192806,361.98192806,361.96406213,361.96406213,361.96406212,361.96406212,361.96406213,361.96406213,361.96406214,361.96406214,361.94619621,361.94619622,361.96406212,361.98192805,361.96406213,361.96406213,361.96406212,361.96406212,361.98192805,361.98192805,361.98192804,361.98192804,361.98192806,361.99979399,361.99979399,361.98192805,361.98192805,361.98192805,361.99979398,361.99979398,361.99979398,361.99979398,361.99979398,361.98192806,361.98192806,361.98192806,361.98192806,361.98192806,361.96406211,361.98192804,361.98192804,361.96406212,361.98192804,361.98192804,361.96406212,361.94619621,361.94619621,361.94619621,361.96406212,361.9461962,361.9461962,361.96406212,361.96406212,361.98192804,361.98192804,361.98192805,361.98192805,361.96406212,361.98192804,361.98192804,361.98192804,361.96406212,361.96406212,361.96406213,361.96406213,361.96406213,361.96406212,361.96406212,361.96406213,361.94619621,361.94619621,361.96406212,361.96406212,361.96406212,361.96406212,361.98192804,361.98192804,361.98192805,361.98192805,361.98192805,361.98192806,361.98192806,361.98192804,361.96406213,361.98192806,361.96406213,361.96406213,361.96406213,361.96406213,361.96406213,361.96406213,361.96406213,361.94619621,361.94619621,361.99979398,361.99979398,361.99979398,361.99979399,361.99979399,361.99979398,361.99979398,361.99979398,361.99979397,361.99979398,361.99979398,361.99979397,387.99979398,387.99979398,387.99979398,387.99979397,387.99979399,387.99979398,387.999793959,387.999793959,387.999793962,387.999793964,387.999793963,387.999793964,387.999793965,387.999793965,387.99979396,387.99979398,387.99979396,387.99979396,427.99979398,427.99979398,427.99979398 -325.99688205,325.99688205,325.99688205,325.999794,325.999794,325.99979401,325.99979402,325.99979401,325.999794,325.999794,325.99979398,325.99979399,325.99979398,325.99979399,325.99979399,325.99979399,325.99979399,205.999588,205.99969099,205.999691,205.99958802,205.99958802,70.93935709,70.9394601,0,146.24137354,146.24137353,146.24137353,164.34183629,164.34173333,164.34173333,164.34183632,164.34183632,164.34173333,164.34183629,164.34173329,164.34183632,164.34183633,164.34183638,164.34173332,164.34173332,164.34173336,164.34183633,164.34183638,164.34183632,177.66588971,177.6658897,177.6658897,177.6658897,177.66578669,361.98192807,361.98192809,361.98192808,361.96406215,361.98192807,361.96406214,361.96406215,361.96406215,361.98192807,361.99979399,361.99979399,361.98192807,361.98192807,361.96406215,361.96406214,361.99979398,361.96406216,361.98192807,361.96406216,361.98192808,361.98192808,361.98192808,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.96406215,361.96406216,361.96406216,361.94619623,361.94619624,361.96406214,361.98192807,361.96406215,361.96406215,361.96406214,361.96406214,361.98192807,361.98192807,361.98192806,361.98192806,361.98192808,361.99979401,361.99979401,361.98192807,361.98192807,361.98192807,361.999794,361.999794,361.999794,361.999794,361.999794,361.98192808,361.98192808,361.98192808,361.98192808,361.98192808,361.96406213,361.98192806,361.98192806,361.96406214,361.98192806,361.98192806,361.96406214,361.94619623,361.94619623,361.94619623,361.96406214,361.94619622,361.94619622,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.96406214,361.98192806,361.98192806,361.98192806,361.96406214,361.96406214,361.96406215,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.94619623,361.94619623,361.96406214,361.96406214,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.98192807,361.98192808,361.98192808,361.98192806,361.96406215,361.98192808,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.94619623,361.94619623,361.999794,361.999794,361.999794,361.99979401,361.99979401,361.999794,361.999794,361.999794,361.99979399,361.999794,361.999794,361.99979399,387.999794,387.999794,387.999794,387.99979399,387.99979401,387.999794,387.999793979,387.999793979,387.999793982,387.999793984,387.999793983,387.999793984,387.999793985,387.999793985,387.99979398,387.999794,387.99979398,387.99979398,427.999794,427.999794,427.999794 -325.99688207,325.99688207,325.99688207,325.99979402,325.99979402,325.99979403,325.99979404,325.99979403,325.99979402,325.99979402,325.999794,325.99979401,325.999794,325.99979401,325.99979401,325.99979401,325.99979401,205.99958802,205.99969101,205.99969102,205.99958804,205.99958804,146.24127051,146.24137352,146.24137354,0,119.91812819,119.91812819,164.34183631,164.34173335,164.34173335,164.34183634,164.34183634,164.34173335,164.34183631,164.34173331,164.34183634,164.34183635,164.3418364,164.34173334,164.34173334,164.34173338,164.34183635,164.3418364,164.34183634,177.66588973,177.66588972,177.66588972,177.66588972,177.66578671,361.98192809,361.98192811,361.9819281,361.96406217,361.98192809,361.96406216,361.96406217,361.96406217,361.98192809,361.99979401,361.99979401,361.98192809,361.98192809,361.96406217,361.96406216,361.999794,361.96406218,361.98192809,361.96406218,361.9819281,361.9819281,361.9819281,361.96406217,361.96406217,361.96406216,361.96406216,361.96406217,361.96406217,361.96406218,361.96406218,361.94619625,361.94619626,361.96406216,361.98192809,361.96406217,361.96406217,361.96406216,361.96406216,361.98192809,361.98192809,361.98192808,361.98192808,361.9819281,361.99979403,361.99979403,361.98192809,361.98192809,361.98192809,361.99979402,361.99979402,361.99979402,361.99979402,361.99979402,361.9819281,361.9819281,361.9819281,361.9819281,361.9819281,361.96406215,361.98192808,361.98192808,361.96406216,361.98192808,361.98192808,361.96406216,361.94619625,361.94619625,361.94619625,361.96406216,361.94619624,361.94619624,361.96406216,361.96406216,361.98192808,361.98192808,361.98192809,361.98192809,361.96406216,361.98192808,361.98192808,361.98192808,361.96406216,361.96406216,361.96406217,361.96406217,361.96406217,361.96406216,361.96406216,361.96406217,361.94619625,361.94619625,361.96406216,361.96406216,361.96406216,361.96406216,361.98192808,361.98192808,361.98192809,361.98192809,361.98192809,361.9819281,361.9819281,361.98192808,361.96406217,361.9819281,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.94619625,361.94619625,361.99979402,361.99979402,361.99979402,361.99979403,361.99979403,361.99979402,361.99979402,361.99979402,361.99979401,361.99979402,361.99979402,361.99979401,387.99979402,387.99979402,387.99979402,387.99979401,387.99979403,387.99979402,387.999793999,387.999793999,387.999794002,387.999794004,387.999794003,387.999794004,387.999794005,387.999794005,387.999794,387.99979402,387.999794,387.999794,427.99979402,427.99979402,427.99979402 -325.99688206,325.99688206,325.99688206,325.99979401,325.99979401,325.99979402,325.99979403,325.99979402,325.99979401,325.99979401,325.99979399,325.999794,325.99979399,325.999794,325.999794,325.999794,325.999794,205.99958801,205.999691,205.99969101,205.99958803,205.99958803,146.2412705,146.24137351,146.24137353,119.91812819,0,84.62813276,164.3418363,164.34173334,164.34173334,164.34183633,164.34183633,164.34173334,164.3418363,164.3417333,164.34183633,164.34183634,164.34183639,164.34173333,164.34173333,164.34173337,164.34183634,164.34183639,164.34183633,177.66588972,177.66588971,177.66588971,177.66588971,177.6657867,361.98192808,361.9819281,361.98192809,361.96406216,361.98192808,361.96406215,361.96406216,361.96406216,361.98192808,361.999794,361.999794,361.98192808,361.98192808,361.96406216,361.96406215,361.99979399,361.96406217,361.98192808,361.96406217,361.98192809,361.98192809,361.98192809,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.96406216,361.96406217,361.96406217,361.94619624,361.94619625,361.96406215,361.98192808,361.96406216,361.96406216,361.96406215,361.96406215,361.98192808,361.98192808,361.98192807,361.98192807,361.98192809,361.99979402,361.99979402,361.98192808,361.98192808,361.98192808,361.99979401,361.99979401,361.99979401,361.99979401,361.99979401,361.98192809,361.98192809,361.98192809,361.98192809,361.98192809,361.96406214,361.98192807,361.98192807,361.96406215,361.98192807,361.98192807,361.96406215,361.94619624,361.94619624,361.94619624,361.96406215,361.94619623,361.94619623,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.96406215,361.98192807,361.98192807,361.98192807,361.96406215,361.96406215,361.96406216,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.94619624,361.94619624,361.96406215,361.96406215,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.98192808,361.98192809,361.98192809,361.98192807,361.96406216,361.98192809,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.94619624,361.94619624,361.99979401,361.99979401,361.99979401,361.99979402,361.99979402,361.99979401,361.99979401,361.99979401,361.999794,361.99979401,361.99979401,361.999794,387.99979401,387.99979401,387.99979401,387.999794,387.99979402,387.99979401,387.999793989,387.999793989,387.999793992,387.999793994,387.999793993,387.999793994,387.999793995,387.999793995,387.99979399,387.99979401,387.99979399,387.99979399,427.99979401,427.99979401,427.99979401 -325.99688206,325.99688206,325.99688206,325.99979401,325.99979401,325.99979402,325.99979403,325.99979402,325.99979401,325.99979401,325.99979399,325.999794,325.99979399,325.999794,325.999794,325.999794,325.999794,205.99958801,205.999691,205.99969101,205.99958803,205.99958803,146.2412705,146.24137351,146.24137353,119.91812819,84.62813276,0,164.3418363,164.34173334,164.34173334,164.34183633,164.34183633,164.34173334,164.3418363,164.3417333,164.34183633,164.34183634,164.34183639,164.34173333,164.34173333,164.34173337,164.34183634,164.34183639,164.34183633,177.66588972,177.66588971,177.66588971,177.66588971,177.6657867,361.98192808,361.9819281,361.98192809,361.96406216,361.98192808,361.96406215,361.96406216,361.96406216,361.98192808,361.999794,361.999794,361.98192808,361.98192808,361.96406216,361.96406215,361.99979399,361.96406217,361.98192808,361.96406217,361.98192809,361.98192809,361.98192809,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.96406216,361.96406217,361.96406217,361.94619624,361.94619625,361.96406215,361.98192808,361.96406216,361.96406216,361.96406215,361.96406215,361.98192808,361.98192808,361.98192807,361.98192807,361.98192809,361.99979402,361.99979402,361.98192808,361.98192808,361.98192808,361.99979401,361.99979401,361.99979401,361.99979401,361.99979401,361.98192809,361.98192809,361.98192809,361.98192809,361.98192809,361.96406214,361.98192807,361.98192807,361.96406215,361.98192807,361.98192807,361.96406215,361.94619624,361.94619624,361.94619624,361.96406215,361.94619623,361.94619623,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.96406215,361.98192807,361.98192807,361.98192807,361.96406215,361.96406215,361.96406216,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.94619624,361.94619624,361.96406215,361.96406215,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.98192808,361.98192809,361.98192809,361.98192807,361.96406216,361.98192809,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.94619624,361.94619624,361.99979401,361.99979401,361.99979401,361.99979402,361.99979402,361.99979401,361.99979401,361.99979401,361.999794,361.99979401,361.99979401,361.999794,387.99979401,387.99979401,387.99979401,387.999794,387.99979402,387.99979401,387.999793989,387.999793989,387.999793992,387.999793994,387.999793993,387.999793994,387.999793995,387.999793995,387.99979399,387.99979401,387.99979399,387.99979399,427.99979401,427.99979401,427.99979401 -325.99698502,325.99698502,325.99698502,325.99989697,325.99989697,325.99989698,325.99989699,325.99989698,325.99989697,325.99989697,325.99989695,325.99989696,325.99989695,325.99989696,325.99989696,325.99989696,325.99989696,205.99969097,205.99979396,205.99979397,205.99969099,205.99969099,164.34173326,164.34183627,164.34183629,164.34183631,164.3418363,164.3418363,0,133.90292518,133.90292518,133.90302817,133.90302817,134.52030594,134.5204089,134.5203059,134.52040893,134.52040894,134.52040899,134.52030593,134.52030593,134.52030597,134.52040894,134.52040899,134.52040893,177.66599268,177.66599267,177.66599267,177.66599267,177.66588966,361.98203104,361.98203106,361.98203105,361.96416512,361.98203104,361.96416511,361.96416512,361.96416512,361.98203104,361.99989696,361.99989696,361.98203104,361.98203104,361.96416512,361.96416511,361.99989695,361.96416513,361.98203104,361.96416513,361.98203105,361.98203105,361.98203105,361.96416512,361.96416512,361.96416511,361.96416511,361.96416512,361.96416512,361.96416513,361.96416513,361.9462992,361.94629921,361.96416511,361.98203104,361.96416512,361.96416512,361.96416511,361.96416511,361.98203104,361.98203104,361.98203103,361.98203103,361.98203105,361.99989698,361.99989698,361.98203104,361.98203104,361.98203104,361.99989697,361.99989697,361.99989697,361.99989697,361.99989697,361.98203105,361.98203105,361.98203105,361.98203105,361.98203105,361.9641651,361.98203103,361.98203103,361.96416511,361.98203103,361.98203103,361.96416511,361.9462992,361.9462992,361.9462992,361.96416511,361.94629919,361.94629919,361.96416511,361.96416511,361.98203103,361.98203103,361.98203104,361.98203104,361.96416511,361.98203103,361.98203103,361.98203103,361.96416511,361.96416511,361.96416512,361.96416512,361.96416512,361.96416511,361.96416511,361.96416512,361.9462992,361.9462992,361.96416511,361.96416511,361.96416511,361.96416511,361.98203103,361.98203103,361.98203104,361.98203104,361.98203104,361.98203105,361.98203105,361.98203103,361.96416512,361.98203105,361.96416512,361.96416512,361.96416512,361.96416512,361.96416512,361.96416512,361.96416512,361.9462992,361.9462992,361.99989697,361.99989697,361.99989697,361.99989698,361.99989698,361.99989697,361.99989697,361.99989697,361.99989696,361.99989697,361.99989697,361.99989696,387.99989697,387.99989697,387.99989697,387.99989696,387.99989698,387.99989697,387.999896949,387.999896949,387.999896952,387.999896954,387.999896953,387.999896954,387.999896955,387.999896955,387.99989695,387.99989697,387.99989695,387.99989695,427.99989697,427.99989697,427.99989697 -325.99688206,325.99688206,325.99688206,325.99979401,325.99979401,325.99979402,325.99979403,325.99979402,325.99979401,325.99979401,325.99979399,325.999794,325.99979399,325.999794,325.999794,325.999794,325.999794,205.99958801,205.999691,205.99969101,205.99958803,205.99958803,164.3416303,164.34173331,164.34173333,164.34173335,164.34173334,164.34173334,133.90292518,0,21.34715026,79.10394481,79.10394481,134.52020298,134.52030594,134.52020294,134.52030597,134.52030598,134.52030603,134.52020297,134.52020297,134.52020301,134.52030598,134.52030603,134.52030597,177.66588972,177.66588971,177.66588971,177.66588971,177.6657867,361.98192808,361.9819281,361.98192809,361.96406216,361.98192808,361.96406215,361.96406216,361.96406216,361.98192808,361.999794,361.999794,361.98192808,361.98192808,361.96406216,361.96406215,361.99979399,361.96406217,361.98192808,361.96406217,361.98192809,361.98192809,361.98192809,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.96406216,361.96406217,361.96406217,361.94619624,361.94619625,361.96406215,361.98192808,361.96406216,361.96406216,361.96406215,361.96406215,361.98192808,361.98192808,361.98192807,361.98192807,361.98192809,361.99979402,361.99979402,361.98192808,361.98192808,361.98192808,361.99979401,361.99979401,361.99979401,361.99979401,361.99979401,361.98192809,361.98192809,361.98192809,361.98192809,361.98192809,361.96406214,361.98192807,361.98192807,361.96406215,361.98192807,361.98192807,361.96406215,361.94619624,361.94619624,361.94619624,361.96406215,361.94619623,361.94619623,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.96406215,361.98192807,361.98192807,361.98192807,361.96406215,361.96406215,361.96406216,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.94619624,361.94619624,361.96406215,361.96406215,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.98192808,361.98192809,361.98192809,361.98192807,361.96406216,361.98192809,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.94619624,361.94619624,361.99979401,361.99979401,361.99979401,361.99979402,361.99979402,361.99979401,361.99979401,361.99979401,361.999794,361.99979401,361.99979401,361.999794,387.99979401,387.99979401,387.99979401,387.999794,387.99979402,387.99979401,387.999793989,387.999793989,387.999793992,387.999793994,387.999793993,387.999793994,387.999793995,387.999793995,387.99979399,387.99979401,387.99979399,387.99979399,427.99979401,427.99979401,427.99979401 -325.99688206,325.99688206,325.99688206,325.99979401,325.99979401,325.99979402,325.99979403,325.99979402,325.99979401,325.99979401,325.99979399,325.999794,325.99979399,325.999794,325.999794,325.999794,325.999794,205.99958801,205.999691,205.99969101,205.99958803,205.99958803,164.3416303,164.34173331,164.34173333,164.34173335,164.34173334,164.34173334,133.90292518,21.34715026,0,79.10394481,79.10394481,134.52020298,134.52030594,134.52020294,134.52030597,134.52030598,134.52030603,134.52020297,134.52020297,134.52020301,134.52030598,134.52030603,134.52030597,177.66588972,177.66588971,177.66588971,177.66588971,177.6657867,361.98192808,361.9819281,361.98192809,361.96406216,361.98192808,361.96406215,361.96406216,361.96406216,361.98192808,361.999794,361.999794,361.98192808,361.98192808,361.96406216,361.96406215,361.99979399,361.96406217,361.98192808,361.96406217,361.98192809,361.98192809,361.98192809,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.96406216,361.96406217,361.96406217,361.94619624,361.94619625,361.96406215,361.98192808,361.96406216,361.96406216,361.96406215,361.96406215,361.98192808,361.98192808,361.98192807,361.98192807,361.98192809,361.99979402,361.99979402,361.98192808,361.98192808,361.98192808,361.99979401,361.99979401,361.99979401,361.99979401,361.99979401,361.98192809,361.98192809,361.98192809,361.98192809,361.98192809,361.96406214,361.98192807,361.98192807,361.96406215,361.98192807,361.98192807,361.96406215,361.94619624,361.94619624,361.94619624,361.96406215,361.94619623,361.94619623,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.96406215,361.98192807,361.98192807,361.98192807,361.96406215,361.96406215,361.96406216,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.94619624,361.94619624,361.96406215,361.96406215,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.98192808,361.98192809,361.98192809,361.98192807,361.96406216,361.98192809,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.94619624,361.94619624,361.99979401,361.99979401,361.99979401,361.99979402,361.99979402,361.99979401,361.99979401,361.99979401,361.999794,361.99979401,361.99979401,361.999794,387.99979401,387.99979401,387.99979401,387.999794,387.99979402,387.99979401,387.999793989,387.999793989,387.999793992,387.999793994,387.999793993,387.999793994,387.999793995,387.999793995,387.99979399,387.99979401,387.99979399,387.99979399,427.99979401,427.99979401,427.99979401 -325.99698505,325.99698505,325.99698505,325.999897,325.999897,325.99989701,325.99989702,325.99989701,325.999897,325.999897,325.99989698,325.99989699,325.99989698,325.99989699,325.99989699,325.99989699,325.99989699,205.999691,205.99979399,205.999794,205.99969102,205.99969102,164.34173329,164.3418363,164.34183632,164.34183634,164.34183633,164.34183633,133.90302817,79.10394481,79.10394481,0,57.75689754,134.52030597,134.52040893,134.52030593,134.52040896,134.52040897,134.52040902,134.52030596,134.52030596,134.520306,134.52040897,134.52040902,134.52040896,177.66599271,177.6659927,177.6659927,177.6659927,177.66588969,361.98203107,361.98203109,361.98203108,361.96416515,361.98203107,361.96416514,361.96416515,361.96416515,361.98203107,361.99989699,361.99989699,361.98203107,361.98203107,361.96416515,361.96416514,361.99989698,361.96416516,361.98203107,361.96416516,361.98203108,361.98203108,361.98203108,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.96416515,361.96416516,361.96416516,361.94629923,361.94629924,361.96416514,361.98203107,361.96416515,361.96416515,361.96416514,361.96416514,361.98203107,361.98203107,361.98203106,361.98203106,361.98203108,361.99989701,361.99989701,361.98203107,361.98203107,361.98203107,361.999897,361.999897,361.999897,361.999897,361.999897,361.98203108,361.98203108,361.98203108,361.98203108,361.98203108,361.96416513,361.98203106,361.98203106,361.96416514,361.98203106,361.98203106,361.96416514,361.94629923,361.94629923,361.94629923,361.96416514,361.94629922,361.94629922,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.96416514,361.98203106,361.98203106,361.98203106,361.96416514,361.96416514,361.96416515,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.94629923,361.94629923,361.96416514,361.96416514,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.98203107,361.98203108,361.98203108,361.98203106,361.96416515,361.98203108,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.94629923,361.94629923,361.999897,361.999897,361.999897,361.99989701,361.99989701,361.999897,361.999897,361.999897,361.99989699,361.999897,361.999897,361.99989699,387.999897,387.999897,387.999897,387.99989699,387.99989701,387.999897,387.999896979,387.999896979,387.999896982,387.999896984,387.999896983,387.999896984,387.999896985,387.999896985,387.99989698,387.999897,387.99989698,387.99989698,427.999897,427.999897,427.999897 -325.99698505,325.99698505,325.99698505,325.999897,325.999897,325.99989701,325.99989702,325.99989701,325.999897,325.999897,325.99989698,325.99989699,325.99989698,325.99989699,325.99989699,325.99989699,325.99989699,205.999691,205.99979399,205.999794,205.99969102,205.99969102,164.34173329,164.3418363,164.34183632,164.34183634,164.34183633,164.34183633,133.90302817,79.10394481,79.10394481,57.75689754,0,134.52030597,134.52040893,134.52030593,134.52040896,134.52040897,134.52040902,134.52030596,134.52030596,134.520306,134.52040897,134.52040902,134.52040896,177.66599271,177.6659927,177.6659927,177.6659927,177.66588969,361.98203107,361.98203109,361.98203108,361.96416515,361.98203107,361.96416514,361.96416515,361.96416515,361.98203107,361.99989699,361.99989699,361.98203107,361.98203107,361.96416515,361.96416514,361.99989698,361.96416516,361.98203107,361.96416516,361.98203108,361.98203108,361.98203108,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.96416515,361.96416516,361.96416516,361.94629923,361.94629924,361.96416514,361.98203107,361.96416515,361.96416515,361.96416514,361.96416514,361.98203107,361.98203107,361.98203106,361.98203106,361.98203108,361.99989701,361.99989701,361.98203107,361.98203107,361.98203107,361.999897,361.999897,361.999897,361.999897,361.999897,361.98203108,361.98203108,361.98203108,361.98203108,361.98203108,361.96416513,361.98203106,361.98203106,361.96416514,361.98203106,361.98203106,361.96416514,361.94629923,361.94629923,361.94629923,361.96416514,361.94629922,361.94629922,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.96416514,361.98203106,361.98203106,361.98203106,361.96416514,361.96416514,361.96416515,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.94629923,361.94629923,361.96416514,361.96416514,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.98203107,361.98203108,361.98203108,361.98203106,361.96416515,361.98203108,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.94629923,361.94629923,361.999897,361.999897,361.999897,361.99989701,361.99989701,361.999897,361.999897,361.999897,361.99989699,361.999897,361.999897,361.99989699,387.999897,387.999897,387.999897,387.99989699,387.99989701,387.999897,387.999896979,387.999896979,387.999896982,387.999896984,387.999896983,387.999896984,387.999896985,387.999896985,387.99989698,387.999897,387.99989698,387.99989698,427.999897,427.999897,427.999897 -325.99688206,325.99688206,325.99688206,325.99979401,325.99979401,325.99979402,325.99979403,325.99979402,325.99979401,325.99979401,325.99979399,325.999794,325.99979399,325.999794,325.999794,325.999794,325.999794,205.99958801,205.999691,205.99969101,205.99958803,205.99958803,164.3416303,164.34173331,164.34173333,164.34173335,164.34173334,164.34173334,134.52030594,134.52020298,134.52020298,134.52030597,134.52030597,0,46.31107634,81.07642018,102.39899621,102.39899622,102.39899627,104.40821319,104.40821319,104.40821323,104.4083162,104.40831625,104.40831619,177.66588972,177.66588971,177.66588971,177.66588971,177.6657867,361.98192808,361.9819281,361.98192809,361.96406216,361.98192808,361.96406215,361.96406216,361.96406216,361.98192808,361.999794,361.999794,361.98192808,361.98192808,361.96406216,361.96406215,361.99979399,361.96406217,361.98192808,361.96406217,361.98192809,361.98192809,361.98192809,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.96406216,361.96406217,361.96406217,361.94619624,361.94619625,361.96406215,361.98192808,361.96406216,361.96406216,361.96406215,361.96406215,361.98192808,361.98192808,361.98192807,361.98192807,361.98192809,361.99979402,361.99979402,361.98192808,361.98192808,361.98192808,361.99979401,361.99979401,361.99979401,361.99979401,361.99979401,361.98192809,361.98192809,361.98192809,361.98192809,361.98192809,361.96406214,361.98192807,361.98192807,361.96406215,361.98192807,361.98192807,361.96406215,361.94619624,361.94619624,361.94619624,361.96406215,361.94619623,361.94619623,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.96406215,361.98192807,361.98192807,361.98192807,361.96406215,361.96406215,361.96406216,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.94619624,361.94619624,361.96406215,361.96406215,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.98192808,361.98192809,361.98192809,361.98192807,361.96406216,361.98192809,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.94619624,361.94619624,361.99979401,361.99979401,361.99979401,361.99979402,361.99979402,361.99979401,361.99979401,361.99979401,361.999794,361.99979401,361.99979401,361.999794,387.99979401,387.99979401,387.99979401,387.999794,387.99979402,387.99979401,387.999793989,387.999793989,387.999793992,387.999793994,387.999793993,387.999793994,387.999793995,387.999793995,387.99979399,387.99979401,387.99979399,387.99979399,427.99979401,427.99979401,427.99979401 -325.99698502,325.99698502,325.99698502,325.99989697,325.99989697,325.99989698,325.99989699,325.99989698,325.99989697,325.99989697,325.99989695,325.99989696,325.99989695,325.99989696,325.99989696,325.99989696,325.99989696,205.99969097,205.99979396,205.99979397,205.99969099,205.99969099,164.34173326,164.34183627,164.34183629,164.34183631,164.3418363,164.3418363,134.5204089,134.52030594,134.52030594,134.52040893,134.52040893,46.31107634,0,81.07652314,102.39909917,102.39909918,102.39909923,104.40831615,104.40831615,104.40831619,104.40841916,104.40841921,104.40841915,177.66599268,177.66599267,177.66599267,177.66599267,177.66588966,361.98203104,361.98203106,361.98203105,361.96416512,361.98203104,361.96416511,361.96416512,361.96416512,361.98203104,361.99989696,361.99989696,361.98203104,361.98203104,361.96416512,361.96416511,361.99989695,361.96416513,361.98203104,361.96416513,361.98203105,361.98203105,361.98203105,361.96416512,361.96416512,361.96416511,361.96416511,361.96416512,361.96416512,361.96416513,361.96416513,361.9462992,361.94629921,361.96416511,361.98203104,361.96416512,361.96416512,361.96416511,361.96416511,361.98203104,361.98203104,361.98203103,361.98203103,361.98203105,361.99989698,361.99989698,361.98203104,361.98203104,361.98203104,361.99989697,361.99989697,361.99989697,361.99989697,361.99989697,361.98203105,361.98203105,361.98203105,361.98203105,361.98203105,361.9641651,361.98203103,361.98203103,361.96416511,361.98203103,361.98203103,361.96416511,361.9462992,361.9462992,361.9462992,361.96416511,361.94629919,361.94629919,361.96416511,361.96416511,361.98203103,361.98203103,361.98203104,361.98203104,361.96416511,361.98203103,361.98203103,361.98203103,361.96416511,361.96416511,361.96416512,361.96416512,361.96416512,361.96416511,361.96416511,361.96416512,361.9462992,361.9462992,361.96416511,361.96416511,361.96416511,361.96416511,361.98203103,361.98203103,361.98203104,361.98203104,361.98203104,361.98203105,361.98203105,361.98203103,361.96416512,361.98203105,361.96416512,361.96416512,361.96416512,361.96416512,361.96416512,361.96416512,361.96416512,361.9462992,361.9462992,361.99989697,361.99989697,361.99989697,361.99989698,361.99989698,361.99989697,361.99989697,361.99989697,361.99989696,361.99989697,361.99989697,361.99989696,387.99989697,387.99989697,387.99989697,387.99989696,387.99989698,387.99989697,387.999896949,387.999896949,387.999896952,387.999896954,387.999896953,387.999896954,387.999896955,387.999896955,387.99989695,387.99989697,387.99989695,387.99989695,427.99989697,427.99989697,427.99989697 -325.99688202,325.99688202,325.99688202,325.99979397,325.99979397,325.99979398,325.99979399,325.99979398,325.99979397,325.99979397,325.99979395,325.99979396,325.99979395,325.99979396,325.99979396,325.99979396,325.99979396,205.99958797,205.99969096,205.99969097,205.99958799,205.99958799,164.34163026,164.34173327,164.34173329,164.34173331,164.3417333,164.3417333,134.5203059,134.52020294,134.52020294,134.52030593,134.52030593,81.07642018,81.07652314,0,102.39899617,102.39899618,102.39899623,104.40821315,104.40821315,104.40821319,104.40831616,104.40831621,104.40831615,177.66588968,177.66588967,177.66588967,177.66588967,177.66578666,361.98192804,361.98192806,361.98192805,361.96406212,361.98192804,361.96406211,361.96406212,361.96406212,361.98192804,361.99979396,361.99979396,361.98192804,361.98192804,361.96406212,361.96406211,361.99979395,361.96406213,361.98192804,361.96406213,361.98192805,361.98192805,361.98192805,361.96406212,361.96406212,361.96406211,361.96406211,361.96406212,361.96406212,361.96406213,361.96406213,361.9461962,361.94619621,361.96406211,361.98192804,361.96406212,361.96406212,361.96406211,361.96406211,361.98192804,361.98192804,361.98192803,361.98192803,361.98192805,361.99979398,361.99979398,361.98192804,361.98192804,361.98192804,361.99979397,361.99979397,361.99979397,361.99979397,361.99979397,361.98192805,361.98192805,361.98192805,361.98192805,361.98192805,361.9640621,361.98192803,361.98192803,361.96406211,361.98192803,361.98192803,361.96406211,361.9461962,361.9461962,361.9461962,361.96406211,361.94619619,361.94619619,361.96406211,361.96406211,361.98192803,361.98192803,361.98192804,361.98192804,361.96406211,361.98192803,361.98192803,361.98192803,361.96406211,361.96406211,361.96406212,361.96406212,361.96406212,361.96406211,361.96406211,361.96406212,361.9461962,361.9461962,361.96406211,361.96406211,361.96406211,361.96406211,361.98192803,361.98192803,361.98192804,361.98192804,361.98192804,361.98192805,361.98192805,361.98192803,361.96406212,361.98192805,361.96406212,361.96406212,361.96406212,361.96406212,361.96406212,361.96406212,361.96406212,361.9461962,361.9461962,361.99979397,361.99979397,361.99979397,361.99979398,361.99979398,361.99979397,361.99979397,361.99979397,361.99979396,361.99979397,361.99979397,361.99979396,387.99979397,387.99979397,387.99979397,387.99979396,387.99979398,387.99979397,387.999793949,387.999793949,387.999793952,387.999793954,387.999793953,387.999793954,387.999793955,387.999793955,387.99979395,387.99979397,387.99979395,387.99979395,427.99979397,427.99979397,427.99979397 -325.99698505,325.99698505,325.99698505,325.999897,325.999897,325.99989701,325.99989702,325.99989701,325.999897,325.999897,325.99989698,325.99989699,325.99989698,325.99989699,325.99989699,325.99989699,325.99989699,205.999691,205.99979399,205.999794,205.99969102,205.99969102,164.34173329,164.3418363,164.34183632,164.34183634,164.34183633,164.34183633,134.52040893,134.52030597,134.52030597,134.52040896,134.52040896,102.39899621,102.39909917,102.39899617,0,102.11523179,102.11523184,104.40831618,104.40831618,104.40831622,104.40841919,104.40841924,104.40841918,177.66599271,177.6659927,177.6659927,177.6659927,177.66588969,361.98203107,361.98203109,361.98203108,361.96416515,361.98203107,361.96416514,361.96416515,361.96416515,361.98203107,361.99989699,361.99989699,361.98203107,361.98203107,361.96416515,361.96416514,361.99989698,361.96416516,361.98203107,361.96416516,361.98203108,361.98203108,361.98203108,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.96416515,361.96416516,361.96416516,361.94629923,361.94629924,361.96416514,361.98203107,361.96416515,361.96416515,361.96416514,361.96416514,361.98203107,361.98203107,361.98203106,361.98203106,361.98203108,361.99989701,361.99989701,361.98203107,361.98203107,361.98203107,361.999897,361.999897,361.999897,361.999897,361.999897,361.98203108,361.98203108,361.98203108,361.98203108,361.98203108,361.96416513,361.98203106,361.98203106,361.96416514,361.98203106,361.98203106,361.96416514,361.94629923,361.94629923,361.94629923,361.96416514,361.94629922,361.94629922,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.96416514,361.98203106,361.98203106,361.98203106,361.96416514,361.96416514,361.96416515,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.94629923,361.94629923,361.96416514,361.96416514,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.98203107,361.98203108,361.98203108,361.98203106,361.96416515,361.98203108,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.94629923,361.94629923,361.999897,361.999897,361.999897,361.99989701,361.99989701,361.999897,361.999897,361.999897,361.99989699,361.999897,361.999897,361.99989699,387.999897,387.999897,387.999897,387.99989699,387.99989701,387.999897,387.999896979,387.999896979,387.999896982,387.999896984,387.999896983,387.999896984,387.999896985,387.999896985,387.99989698,387.999897,387.99989698,387.99989698,427.999897,427.999897,427.999897 -325.99698506,325.99698506,325.99698506,325.99989701,325.99989701,325.99989702,325.99989703,325.99989702,325.99989701,325.99989701,325.99989699,325.999897,325.99989699,325.999897,325.999897,325.999897,325.999897,205.99969101,205.999794,205.99979401,205.99969103,205.99969103,164.3417333,164.34183631,164.34183633,164.34183635,164.34183634,164.34183634,134.52040894,134.52030598,134.52030598,134.52040897,134.52040897,102.39899622,102.39909918,102.39899618,102.11523179,0,51.92590421,104.40831619,104.40831619,104.40831623,104.4084192,104.40841925,104.40841919,177.66599272,177.66599271,177.66599271,177.66599271,177.6658897,361.98203108,361.9820311,361.98203109,361.96416516,361.98203108,361.96416515,361.96416516,361.96416516,361.98203108,361.999897,361.999897,361.98203108,361.98203108,361.96416516,361.96416515,361.99989699,361.96416517,361.98203108,361.96416517,361.98203109,361.98203109,361.98203109,361.96416516,361.96416516,361.96416515,361.96416515,361.96416516,361.96416516,361.96416517,361.96416517,361.94629924,361.94629925,361.96416515,361.98203108,361.96416516,361.96416516,361.96416515,361.96416515,361.98203108,361.98203108,361.98203107,361.98203107,361.98203109,361.99989702,361.99989702,361.98203108,361.98203108,361.98203108,361.99989701,361.99989701,361.99989701,361.99989701,361.99989701,361.98203109,361.98203109,361.98203109,361.98203109,361.98203109,361.96416514,361.98203107,361.98203107,361.96416515,361.98203107,361.98203107,361.96416515,361.94629924,361.94629924,361.94629924,361.96416515,361.94629923,361.94629923,361.96416515,361.96416515,361.98203107,361.98203107,361.98203108,361.98203108,361.96416515,361.98203107,361.98203107,361.98203107,361.96416515,361.96416515,361.96416516,361.96416516,361.96416516,361.96416515,361.96416515,361.96416516,361.94629924,361.94629924,361.96416515,361.96416515,361.96416515,361.96416515,361.98203107,361.98203107,361.98203108,361.98203108,361.98203108,361.98203109,361.98203109,361.98203107,361.96416516,361.98203109,361.96416516,361.96416516,361.96416516,361.96416516,361.96416516,361.96416516,361.96416516,361.94629924,361.94629924,361.99989701,361.99989701,361.99989701,361.99989702,361.99989702,361.99989701,361.99989701,361.99989701,361.999897,361.99989701,361.99989701,361.999897,387.99989701,387.99989701,387.99989701,387.999897,387.99989702,387.99989701,387.999896989,387.999896989,387.999896992,387.999896994,387.999896993,387.999896994,387.999896995,387.999896995,387.99989699,387.99989701,387.99989699,387.99989699,427.99989701,427.99989701,427.99989701 -325.99698511,325.99698511,325.99698511,325.99989706,325.99989706,325.99989707,325.99989708,325.99989707,325.99989706,325.99989706,325.99989704,325.99989705,325.99989704,325.99989705,325.99989705,325.99989705,325.99989705,205.99969106,205.99979405,205.99979406,205.99969108,205.99969108,164.34173335,164.34183636,164.34183638,164.3418364,164.34183639,164.34183639,134.52040899,134.52030603,134.52030603,134.52040902,134.52040902,102.39899627,102.39909923,102.39899623,102.11523184,51.92590421,0,104.40831624,104.40831624,104.40831628,104.40841925,104.4084193,104.40841924,177.66599277,177.66599276,177.66599276,177.66599276,177.66588975,361.98203113,361.98203115,361.98203114,361.96416521,361.98203113,361.9641652,361.96416521,361.96416521,361.98203113,361.99989705,361.99989705,361.98203113,361.98203113,361.96416521,361.9641652,361.99989704,361.96416522,361.98203113,361.96416522,361.98203114,361.98203114,361.98203114,361.96416521,361.96416521,361.9641652,361.9641652,361.96416521,361.96416521,361.96416522,361.96416522,361.94629929,361.9462993,361.9641652,361.98203113,361.96416521,361.96416521,361.9641652,361.9641652,361.98203113,361.98203113,361.98203112,361.98203112,361.98203114,361.99989707,361.99989707,361.98203113,361.98203113,361.98203113,361.99989706,361.99989706,361.99989706,361.99989706,361.99989706,361.98203114,361.98203114,361.98203114,361.98203114,361.98203114,361.96416519,361.98203112,361.98203112,361.9641652,361.98203112,361.98203112,361.9641652,361.94629929,361.94629929,361.94629929,361.9641652,361.94629928,361.94629928,361.9641652,361.9641652,361.98203112,361.98203112,361.98203113,361.98203113,361.9641652,361.98203112,361.98203112,361.98203112,361.9641652,361.9641652,361.96416521,361.96416521,361.96416521,361.9641652,361.9641652,361.96416521,361.94629929,361.94629929,361.9641652,361.9641652,361.9641652,361.9641652,361.98203112,361.98203112,361.98203113,361.98203113,361.98203113,361.98203114,361.98203114,361.98203112,361.96416521,361.98203114,361.96416521,361.96416521,361.96416521,361.96416521,361.96416521,361.96416521,361.96416521,361.94629929,361.94629929,361.99989706,361.99989706,361.99989706,361.99989707,361.99989707,361.99989706,361.99989706,361.99989706,361.99989705,361.99989706,361.99989706,361.99989705,387.99989706,387.99989706,387.99989706,387.99989705,387.99989707,387.99989706,387.999897039,387.999897039,387.999897042,387.999897044,387.999897043,387.999897044,387.999897045,387.999897045,387.99989704,387.99989706,387.99989704,387.99989704,427.99989706,427.99989706,427.99989706 -325.99688205,325.99688205,325.99688205,325.999794,325.999794,325.99979401,325.99979402,325.99979401,325.999794,325.999794,325.99979398,325.99979399,325.99979398,325.99979399,325.99979399,325.99979399,325.99979399,205.999588,205.99969099,205.999691,205.99958802,205.99958802,164.34163029,164.3417333,164.34173332,164.34173334,164.34173333,164.34173333,134.52030593,134.52020297,134.52020297,134.52030596,134.52030596,104.40821319,104.40831615,104.40821315,104.40831618,104.40831619,104.40831624,0,19.21172758,68.27650348,68.27660645,68.2766065,68.27660644,177.66588971,177.6658897,177.6658897,177.6658897,177.66578669,361.98192807,361.98192809,361.98192808,361.96406215,361.98192807,361.96406214,361.96406215,361.96406215,361.98192807,361.99979399,361.99979399,361.98192807,361.98192807,361.96406215,361.96406214,361.99979398,361.96406216,361.98192807,361.96406216,361.98192808,361.98192808,361.98192808,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.96406215,361.96406216,361.96406216,361.94619623,361.94619624,361.96406214,361.98192807,361.96406215,361.96406215,361.96406214,361.96406214,361.98192807,361.98192807,361.98192806,361.98192806,361.98192808,361.99979401,361.99979401,361.98192807,361.98192807,361.98192807,361.999794,361.999794,361.999794,361.999794,361.999794,361.98192808,361.98192808,361.98192808,361.98192808,361.98192808,361.96406213,361.98192806,361.98192806,361.96406214,361.98192806,361.98192806,361.96406214,361.94619623,361.94619623,361.94619623,361.96406214,361.94619622,361.94619622,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.96406214,361.98192806,361.98192806,361.98192806,361.96406214,361.96406214,361.96406215,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.94619623,361.94619623,361.96406214,361.96406214,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.98192807,361.98192808,361.98192808,361.98192806,361.96406215,361.98192808,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.94619623,361.94619623,361.999794,361.999794,361.999794,361.99979401,361.99979401,361.999794,361.999794,361.999794,361.99979399,361.999794,361.999794,361.99979399,387.999794,387.999794,387.999794,387.99979399,387.99979401,387.999794,387.999793979,387.999793979,387.999793982,387.999793984,387.999793983,387.999793984,387.999793985,387.999793985,387.99979398,387.999794,387.99979398,387.99979398,427.999794,427.999794,427.999794 -325.99688205,325.99688205,325.99688205,325.999794,325.999794,325.99979401,325.99979402,325.99979401,325.999794,325.999794,325.99979398,325.99979399,325.99979398,325.99979399,325.99979399,325.99979399,325.99979399,205.999588,205.99969099,205.999691,205.99958802,205.99958802,164.34163029,164.3417333,164.34173332,164.34173334,164.34173333,164.34173333,134.52030593,134.52020297,134.52020297,134.52030596,134.52030596,104.40821319,104.40831615,104.40821315,104.40831618,104.40831619,104.40831624,19.21172758,0,68.27650348,68.27660645,68.2766065,68.27660644,177.66588971,177.6658897,177.6658897,177.6658897,177.66578669,361.98192807,361.98192809,361.98192808,361.96406215,361.98192807,361.96406214,361.96406215,361.96406215,361.98192807,361.99979399,361.99979399,361.98192807,361.98192807,361.96406215,361.96406214,361.99979398,361.96406216,361.98192807,361.96406216,361.98192808,361.98192808,361.98192808,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.96406215,361.96406216,361.96406216,361.94619623,361.94619624,361.96406214,361.98192807,361.96406215,361.96406215,361.96406214,361.96406214,361.98192807,361.98192807,361.98192806,361.98192806,361.98192808,361.99979401,361.99979401,361.98192807,361.98192807,361.98192807,361.999794,361.999794,361.999794,361.999794,361.999794,361.98192808,361.98192808,361.98192808,361.98192808,361.98192808,361.96406213,361.98192806,361.98192806,361.96406214,361.98192806,361.98192806,361.96406214,361.94619623,361.94619623,361.94619623,361.96406214,361.94619622,361.94619622,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.96406214,361.98192806,361.98192806,361.98192806,361.96406214,361.96406214,361.96406215,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.94619623,361.94619623,361.96406214,361.96406214,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.98192807,361.98192808,361.98192808,361.98192806,361.96406215,361.98192808,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.94619623,361.94619623,361.999794,361.999794,361.999794,361.99979401,361.99979401,361.999794,361.999794,361.999794,361.99979399,361.999794,361.999794,361.99979399,387.999794,387.999794,387.999794,387.99979399,387.99979401,387.999794,387.999793979,387.999793979,387.999793982,387.999793984,387.999793983,387.999793984,387.999793985,387.999793985,387.99979398,387.999794,387.99979398,387.99979398,427.999794,427.999794,427.999794 -325.99688209,325.99688209,325.99688209,325.99979404,325.99979404,325.99979405,325.99979406,325.99979405,325.99979404,325.99979404,325.99979402,325.99979403,325.99979402,325.99979403,325.99979403,325.99979403,325.99979403,205.99958804,205.99969103,205.99969104,205.99958806,205.99958806,164.34163033,164.34173334,164.34173336,164.34173338,164.34173337,164.34173337,134.52030597,134.52020301,134.52020301,134.520306,134.520306,104.40821323,104.40831619,104.40821319,104.40831622,104.40831623,104.40831628,68.27650348,68.27650348,0,37.93636919,37.93636924,54.58546188,177.66588975,177.66588974,177.66588974,177.66588974,177.66578673,361.98192811,361.98192813,361.98192812,361.96406219,361.98192811,361.96406218,361.96406219,361.96406219,361.98192811,361.99979403,361.99979403,361.98192811,361.98192811,361.96406219,361.96406218,361.99979402,361.9640622,361.98192811,361.9640622,361.98192812,361.98192812,361.98192812,361.96406219,361.96406219,361.96406218,361.96406218,361.96406219,361.96406219,361.9640622,361.9640622,361.94619627,361.94619628,361.96406218,361.98192811,361.96406219,361.96406219,361.96406218,361.96406218,361.98192811,361.98192811,361.9819281,361.9819281,361.98192812,361.99979405,361.99979405,361.98192811,361.98192811,361.98192811,361.99979404,361.99979404,361.99979404,361.99979404,361.99979404,361.98192812,361.98192812,361.98192812,361.98192812,361.98192812,361.96406217,361.9819281,361.9819281,361.96406218,361.9819281,361.9819281,361.96406218,361.94619627,361.94619627,361.94619627,361.96406218,361.94619626,361.94619626,361.96406218,361.96406218,361.9819281,361.9819281,361.98192811,361.98192811,361.96406218,361.9819281,361.9819281,361.9819281,361.96406218,361.96406218,361.96406219,361.96406219,361.96406219,361.96406218,361.96406218,361.96406219,361.94619627,361.94619627,361.96406218,361.96406218,361.96406218,361.96406218,361.9819281,361.9819281,361.98192811,361.98192811,361.98192811,361.98192812,361.98192812,361.9819281,361.96406219,361.98192812,361.96406219,361.96406219,361.96406219,361.96406219,361.96406219,361.96406219,361.96406219,361.94619627,361.94619627,361.99979404,361.99979404,361.99979404,361.99979405,361.99979405,361.99979404,361.99979404,361.99979404,361.99979403,361.99979404,361.99979404,361.99979403,387.99979404,387.99979404,387.99979404,387.99979403,387.99979405,387.99979404,387.999794019,387.999794019,387.999794022,387.999794024,387.999794023,387.999794024,387.999794025,387.999794025,387.99979402,387.99979404,387.99979402,387.99979402,427.99979404,427.99979404,427.99979404 -325.99698506,325.99698506,325.99698506,325.99989701,325.99989701,325.99989702,325.99989703,325.99989702,325.99989701,325.99989701,325.99989699,325.999897,325.99989699,325.999897,325.999897,325.999897,325.999897,205.99969101,205.999794,205.99979401,205.99969103,205.99969103,164.3417333,164.34183631,164.34183633,164.34183635,164.34183634,164.34183634,134.52040894,134.52030598,134.52030598,134.52040897,134.52040897,104.4083162,104.40841916,104.40831616,104.40841919,104.4084192,104.40841925,68.27660645,68.27660645,37.93636919,0,25.77446251,54.58556485,177.66599272,177.66599271,177.66599271,177.66599271,177.6658897,361.98203108,361.9820311,361.98203109,361.96416516,361.98203108,361.96416515,361.96416516,361.96416516,361.98203108,361.999897,361.999897,361.98203108,361.98203108,361.96416516,361.96416515,361.99989699,361.96416517,361.98203108,361.96416517,361.98203109,361.98203109,361.98203109,361.96416516,361.96416516,361.96416515,361.96416515,361.96416516,361.96416516,361.96416517,361.96416517,361.94629924,361.94629925,361.96416515,361.98203108,361.96416516,361.96416516,361.96416515,361.96416515,361.98203108,361.98203108,361.98203107,361.98203107,361.98203109,361.99989702,361.99989702,361.98203108,361.98203108,361.98203108,361.99989701,361.99989701,361.99989701,361.99989701,361.99989701,361.98203109,361.98203109,361.98203109,361.98203109,361.98203109,361.96416514,361.98203107,361.98203107,361.96416515,361.98203107,361.98203107,361.96416515,361.94629924,361.94629924,361.94629924,361.96416515,361.94629923,361.94629923,361.96416515,361.96416515,361.98203107,361.98203107,361.98203108,361.98203108,361.96416515,361.98203107,361.98203107,361.98203107,361.96416515,361.96416515,361.96416516,361.96416516,361.96416516,361.96416515,361.96416515,361.96416516,361.94629924,361.94629924,361.96416515,361.96416515,361.96416515,361.96416515,361.98203107,361.98203107,361.98203108,361.98203108,361.98203108,361.98203109,361.98203109,361.98203107,361.96416516,361.98203109,361.96416516,361.96416516,361.96416516,361.96416516,361.96416516,361.96416516,361.96416516,361.94629924,361.94629924,361.99989701,361.99989701,361.99989701,361.99989702,361.99989702,361.99989701,361.99989701,361.99989701,361.999897,361.99989701,361.99989701,361.999897,387.99989701,387.99989701,387.99989701,387.999897,387.99989702,387.99989701,387.999896989,387.999896989,387.999896992,387.999896994,387.999896993,387.999896994,387.999896995,387.999896995,387.99989699,387.99989701,387.99989699,387.99989699,427.99989701,427.99989701,427.99989701 -325.99698511,325.99698511,325.99698511,325.99989706,325.99989706,325.99989707,325.99989708,325.99989707,325.99989706,325.99989706,325.99989704,325.99989705,325.99989704,325.99989705,325.99989705,325.99989705,325.99989705,205.99969106,205.99979405,205.99979406,205.99969108,205.99969108,164.34173335,164.34183636,164.34183638,164.3418364,164.34183639,164.34183639,134.52040899,134.52030603,134.52030603,134.52040902,134.52040902,104.40831625,104.40841921,104.40831621,104.40841924,104.40841925,104.4084193,68.2766065,68.2766065,37.93636924,25.77446251,0,54.5855649,177.66599277,177.66599276,177.66599276,177.66599276,177.66588975,361.98203113,361.98203115,361.98203114,361.96416521,361.98203113,361.9641652,361.96416521,361.96416521,361.98203113,361.99989705,361.99989705,361.98203113,361.98203113,361.96416521,361.9641652,361.99989704,361.96416522,361.98203113,361.96416522,361.98203114,361.98203114,361.98203114,361.96416521,361.96416521,361.9641652,361.9641652,361.96416521,361.96416521,361.96416522,361.96416522,361.94629929,361.9462993,361.9641652,361.98203113,361.96416521,361.96416521,361.9641652,361.9641652,361.98203113,361.98203113,361.98203112,361.98203112,361.98203114,361.99989707,361.99989707,361.98203113,361.98203113,361.98203113,361.99989706,361.99989706,361.99989706,361.99989706,361.99989706,361.98203114,361.98203114,361.98203114,361.98203114,361.98203114,361.96416519,361.98203112,361.98203112,361.9641652,361.98203112,361.98203112,361.9641652,361.94629929,361.94629929,361.94629929,361.9641652,361.94629928,361.94629928,361.9641652,361.9641652,361.98203112,361.98203112,361.98203113,361.98203113,361.9641652,361.98203112,361.98203112,361.98203112,361.9641652,361.9641652,361.96416521,361.96416521,361.96416521,361.9641652,361.9641652,361.96416521,361.94629929,361.94629929,361.9641652,361.9641652,361.9641652,361.9641652,361.98203112,361.98203112,361.98203113,361.98203113,361.98203113,361.98203114,361.98203114,361.98203112,361.96416521,361.98203114,361.96416521,361.96416521,361.96416521,361.96416521,361.96416521,361.96416521,361.96416521,361.94629929,361.94629929,361.99989706,361.99989706,361.99989706,361.99989707,361.99989707,361.99989706,361.99989706,361.99989706,361.99989705,361.99989706,361.99989706,361.99989705,387.99989706,387.99989706,387.99989706,387.99989705,387.99989707,387.99989706,387.999897039,387.999897039,387.999897042,387.999897044,387.999897043,387.999897044,387.999897045,387.999897045,387.99989704,387.99989706,387.99989704,387.99989704,427.99989706,427.99989706,427.99989706 -325.99698505,325.99698505,325.99698505,325.999897,325.999897,325.99989701,325.99989702,325.99989701,325.999897,325.999897,325.99989698,325.99989699,325.99989698,325.99989699,325.99989699,325.99989699,325.99989699,205.999691,205.99979399,205.999794,205.99969102,205.99969102,164.34173329,164.3418363,164.34183632,164.34183634,164.34183633,164.34183633,134.52040893,134.52030597,134.52030597,134.52040896,134.52040896,104.40831619,104.40841915,104.40831615,104.40841918,104.40841919,104.40841924,68.27660644,68.27660644,54.58546188,54.58556485,54.5855649,0,177.66599271,177.6659927,177.6659927,177.6659927,177.66588969,361.98203107,361.98203109,361.98203108,361.96416515,361.98203107,361.96416514,361.96416515,361.96416515,361.98203107,361.99989699,361.99989699,361.98203107,361.98203107,361.96416515,361.96416514,361.99989698,361.96416516,361.98203107,361.96416516,361.98203108,361.98203108,361.98203108,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.96416515,361.96416516,361.96416516,361.94629923,361.94629924,361.96416514,361.98203107,361.96416515,361.96416515,361.96416514,361.96416514,361.98203107,361.98203107,361.98203106,361.98203106,361.98203108,361.99989701,361.99989701,361.98203107,361.98203107,361.98203107,361.999897,361.999897,361.999897,361.999897,361.999897,361.98203108,361.98203108,361.98203108,361.98203108,361.98203108,361.96416513,361.98203106,361.98203106,361.96416514,361.98203106,361.98203106,361.96416514,361.94629923,361.94629923,361.94629923,361.96416514,361.94629922,361.94629922,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.96416514,361.98203106,361.98203106,361.98203106,361.96416514,361.96416514,361.96416515,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.94629923,361.94629923,361.96416514,361.96416514,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.98203107,361.98203108,361.98203108,361.98203106,361.96416515,361.98203108,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.94629923,361.94629923,361.999897,361.999897,361.999897,361.99989701,361.99989701,361.999897,361.999897,361.999897,361.99989699,361.999897,361.999897,361.99989699,387.999897,387.999897,387.999897,387.99989699,387.99989701,387.999897,387.999896979,387.999896979,387.999896982,387.999896984,387.999896983,387.999896984,387.999896985,387.999896985,387.99989698,387.999897,387.99989698,387.99989698,427.999897,427.999897,427.999897 -325.99698508,325.99698508,325.99698508,325.99989703,325.99989703,325.99989704,325.99989705,325.99989704,325.99989703,325.99989703,325.99989701,325.99989702,325.99989701,325.99989702,325.99989702,325.99989702,325.99989702,205.99969103,205.99979402,205.99979403,205.99969105,205.99969105,177.66578668,177.66588969,177.66588971,177.66588973,177.66588972,177.66588972,177.66599268,177.66588972,177.66588972,177.66599271,177.66599271,177.66588972,177.66599268,177.66588968,177.66599271,177.66599272,177.66599277,177.66588971,177.66588971,177.66588975,177.66599272,177.66599277,177.66599271,0,108.27400149,108.27400149,108.27400149,156.14573076,361.9820311,361.98203112,361.98203111,361.96416518,361.9820311,361.96416517,361.96416518,361.96416518,361.9820311,361.99989702,361.99989702,361.9820311,361.9820311,361.96416518,361.96416517,361.99989701,361.96416519,361.9820311,361.96416519,361.98203111,361.98203111,361.98203111,361.96416518,361.96416518,361.96416517,361.96416517,361.96416518,361.96416518,361.96416519,361.96416519,361.94629926,361.94629927,361.96416517,361.9820311,361.96416518,361.96416518,361.96416517,361.96416517,361.9820311,361.9820311,361.98203109,361.98203109,361.98203111,361.99989704,361.99989704,361.9820311,361.9820311,361.9820311,361.99989703,361.99989703,361.99989703,361.99989703,361.99989703,361.98203111,361.98203111,361.98203111,361.98203111,361.98203111,361.96416516,361.98203109,361.98203109,361.96416517,361.98203109,361.98203109,361.96416517,361.94629926,361.94629926,361.94629926,361.96416517,361.94629925,361.94629925,361.96416517,361.96416517,361.98203109,361.98203109,361.9820311,361.9820311,361.96416517,361.98203109,361.98203109,361.98203109,361.96416517,361.96416517,361.96416518,361.96416518,361.96416518,361.96416517,361.96416517,361.96416518,361.94629926,361.94629926,361.96416517,361.96416517,361.96416517,361.96416517,361.98203109,361.98203109,361.9820311,361.9820311,361.9820311,361.98203111,361.98203111,361.98203109,361.96416518,361.98203111,361.96416518,361.96416518,361.96416518,361.96416518,361.96416518,361.96416518,361.96416518,361.94629926,361.94629926,361.99989703,361.99989703,361.99989703,361.99989704,361.99989704,361.99989703,361.99989703,361.99989703,361.99989702,361.99989703,361.99989703,361.99989702,387.99989703,387.99989703,387.99989703,387.99989702,387.99989704,387.99989703,387.999897009,387.999897009,387.999897012,387.999897014,387.999897013,387.999897014,387.999897015,387.999897015,387.99989701,387.99989703,387.99989701,387.99989701,427.99989703,427.99989703,427.99989703 -325.99698507,325.99698507,325.99698507,325.99989702,325.99989702,325.99989703,325.99989704,325.99989703,325.99989702,325.99989702,325.999897,325.99989701,325.999897,325.99989701,325.99989701,325.99989701,325.99989701,205.99969102,205.99979401,205.99979402,205.99969104,205.99969104,177.66578667,177.66588968,177.6658897,177.66588972,177.66588971,177.66588971,177.66599267,177.66588971,177.66588971,177.6659927,177.6659927,177.66588971,177.66599267,177.66588967,177.6659927,177.66599271,177.66599276,177.6658897,177.6658897,177.66588974,177.66599271,177.66599276,177.6659927,108.27400149,0,39.28700544,78.29817742,156.14573075,361.98203109,361.98203111,361.9820311,361.96416517,361.98203109,361.96416516,361.96416517,361.96416517,361.98203109,361.99989701,361.99989701,361.98203109,361.98203109,361.96416517,361.96416516,361.999897,361.96416518,361.98203109,361.96416518,361.9820311,361.9820311,361.9820311,361.96416517,361.96416517,361.96416516,361.96416516,361.96416517,361.96416517,361.96416518,361.96416518,361.94629925,361.94629926,361.96416516,361.98203109,361.96416517,361.96416517,361.96416516,361.96416516,361.98203109,361.98203109,361.98203108,361.98203108,361.9820311,361.99989703,361.99989703,361.98203109,361.98203109,361.98203109,361.99989702,361.99989702,361.99989702,361.99989702,361.99989702,361.9820311,361.9820311,361.9820311,361.9820311,361.9820311,361.96416515,361.98203108,361.98203108,361.96416516,361.98203108,361.98203108,361.96416516,361.94629925,361.94629925,361.94629925,361.96416516,361.94629924,361.94629924,361.96416516,361.96416516,361.98203108,361.98203108,361.98203109,361.98203109,361.96416516,361.98203108,361.98203108,361.98203108,361.96416516,361.96416516,361.96416517,361.96416517,361.96416517,361.96416516,361.96416516,361.96416517,361.94629925,361.94629925,361.96416516,361.96416516,361.96416516,361.96416516,361.98203108,361.98203108,361.98203109,361.98203109,361.98203109,361.9820311,361.9820311,361.98203108,361.96416517,361.9820311,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.94629925,361.94629925,361.99989702,361.99989702,361.99989702,361.99989703,361.99989703,361.99989702,361.99989702,361.99989702,361.99989701,361.99989702,361.99989702,361.99989701,387.99989702,387.99989702,387.99989702,387.99989701,387.99989703,387.99989702,387.999896999,387.999896999,387.999897002,387.999897004,387.999897003,387.999897004,387.999897005,387.999897005,387.999897,387.99989702,387.999897,387.999897,427.99989702,427.99989702,427.99989702 -325.99698507,325.99698507,325.99698507,325.99989702,325.99989702,325.99989703,325.99989704,325.99989703,325.99989702,325.99989702,325.999897,325.99989701,325.999897,325.99989701,325.99989701,325.99989701,325.99989701,205.99969102,205.99979401,205.99979402,205.99969104,205.99969104,177.66578667,177.66588968,177.6658897,177.66588972,177.66588971,177.66588971,177.66599267,177.66588971,177.66588971,177.6659927,177.6659927,177.66588971,177.66599267,177.66588967,177.6659927,177.66599271,177.66599276,177.6658897,177.6658897,177.66588974,177.66599271,177.66599276,177.6659927,108.27400149,39.28700544,0,78.29817742,156.14573075,361.98203109,361.98203111,361.9820311,361.96416517,361.98203109,361.96416516,361.96416517,361.96416517,361.98203109,361.99989701,361.99989701,361.98203109,361.98203109,361.96416517,361.96416516,361.999897,361.96416518,361.98203109,361.96416518,361.9820311,361.9820311,361.9820311,361.96416517,361.96416517,361.96416516,361.96416516,361.96416517,361.96416517,361.96416518,361.96416518,361.94629925,361.94629926,361.96416516,361.98203109,361.96416517,361.96416517,361.96416516,361.96416516,361.98203109,361.98203109,361.98203108,361.98203108,361.9820311,361.99989703,361.99989703,361.98203109,361.98203109,361.98203109,361.99989702,361.99989702,361.99989702,361.99989702,361.99989702,361.9820311,361.9820311,361.9820311,361.9820311,361.9820311,361.96416515,361.98203108,361.98203108,361.96416516,361.98203108,361.98203108,361.96416516,361.94629925,361.94629925,361.94629925,361.96416516,361.94629924,361.94629924,361.96416516,361.96416516,361.98203108,361.98203108,361.98203109,361.98203109,361.96416516,361.98203108,361.98203108,361.98203108,361.96416516,361.96416516,361.96416517,361.96416517,361.96416517,361.96416516,361.96416516,361.96416517,361.94629925,361.94629925,361.96416516,361.96416516,361.96416516,361.96416516,361.98203108,361.98203108,361.98203109,361.98203109,361.98203109,361.9820311,361.9820311,361.98203108,361.96416517,361.9820311,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.94629925,361.94629925,361.99989702,361.99989702,361.99989702,361.99989703,361.99989703,361.99989702,361.99989702,361.99989702,361.99989701,361.99989702,361.99989702,361.99989701,387.99989702,387.99989702,387.99989702,387.99989701,387.99989703,387.99989702,387.999896999,387.999896999,387.999897002,387.999897004,387.999897003,387.999897004,387.999897005,387.999897005,387.999897,387.99989702,387.999897,387.999897,427.99989702,427.99989702,427.99989702 -325.99698507,325.99698507,325.99698507,325.99989702,325.99989702,325.99989703,325.99989704,325.99989703,325.99989702,325.99989702,325.999897,325.99989701,325.999897,325.99989701,325.99989701,325.99989701,325.99989701,205.99969102,205.99979401,205.99979402,205.99969104,205.99969104,177.66578667,177.66588968,177.6658897,177.66588972,177.66588971,177.66588971,177.66599267,177.66588971,177.66588971,177.6659927,177.6659927,177.66588971,177.66599267,177.66588967,177.6659927,177.66599271,177.66599276,177.6658897,177.6658897,177.66588974,177.66599271,177.66599276,177.6659927,108.27400149,78.29817742,78.29817742,0,156.14573075,361.98203109,361.98203111,361.9820311,361.96416517,361.98203109,361.96416516,361.96416517,361.96416517,361.98203109,361.99989701,361.99989701,361.98203109,361.98203109,361.96416517,361.96416516,361.999897,361.96416518,361.98203109,361.96416518,361.9820311,361.9820311,361.9820311,361.96416517,361.96416517,361.96416516,361.96416516,361.96416517,361.96416517,361.96416518,361.96416518,361.94629925,361.94629926,361.96416516,361.98203109,361.96416517,361.96416517,361.96416516,361.96416516,361.98203109,361.98203109,361.98203108,361.98203108,361.9820311,361.99989703,361.99989703,361.98203109,361.98203109,361.98203109,361.99989702,361.99989702,361.99989702,361.99989702,361.99989702,361.9820311,361.9820311,361.9820311,361.9820311,361.9820311,361.96416515,361.98203108,361.98203108,361.96416516,361.98203108,361.98203108,361.96416516,361.94629925,361.94629925,361.94629925,361.96416516,361.94629924,361.94629924,361.96416516,361.96416516,361.98203108,361.98203108,361.98203109,361.98203109,361.96416516,361.98203108,361.98203108,361.98203108,361.96416516,361.96416516,361.96416517,361.96416517,361.96416517,361.96416516,361.96416516,361.96416517,361.94629925,361.94629925,361.96416516,361.96416516,361.96416516,361.96416516,361.98203108,361.98203108,361.98203109,361.98203109,361.98203109,361.9820311,361.9820311,361.98203108,361.96416517,361.9820311,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.94629925,361.94629925,361.99989702,361.99989702,361.99989702,361.99989703,361.99989703,361.99989702,361.99989702,361.99989702,361.99989701,361.99989702,361.99989702,361.99989701,387.99989702,387.99989702,387.99989702,387.99989701,387.99989703,387.99989702,387.999896999,387.999896999,387.999897002,387.999897004,387.999897003,387.999897004,387.999897005,387.999897005,387.999897,387.99989702,387.999897,387.999897,427.99989702,427.99989702,427.99989702 -325.99688206,325.99688206,325.99688206,325.99979401,325.99979401,325.99979402,325.99979403,325.99979402,325.99979401,325.99979401,325.99979399,325.999794,325.99979399,325.999794,325.999794,325.999794,325.999794,205.99958801,205.999691,205.99969101,205.99958803,205.99958803,177.66568366,177.66578667,177.66578669,177.66578671,177.6657867,177.6657867,177.66588966,177.6657867,177.6657867,177.66588969,177.66588969,177.6657867,177.66588966,177.66578666,177.66588969,177.6658897,177.66588975,177.66578669,177.66578669,177.66578673,177.6658897,177.66588975,177.66588969,156.14573076,156.14573075,156.14573075,156.14573075,0,361.98192808,361.9819281,361.98192809,361.96406216,361.98192808,361.96406215,361.96406216,361.96406216,361.98192808,361.999794,361.999794,361.98192808,361.98192808,361.96406216,361.96406215,361.99979399,361.96406217,361.98192808,361.96406217,361.98192809,361.98192809,361.98192809,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.96406216,361.96406217,361.96406217,361.94619624,361.94619625,361.96406215,361.98192808,361.96406216,361.96406216,361.96406215,361.96406215,361.98192808,361.98192808,361.98192807,361.98192807,361.98192809,361.99979402,361.99979402,361.98192808,361.98192808,361.98192808,361.99979401,361.99979401,361.99979401,361.99979401,361.99979401,361.98192809,361.98192809,361.98192809,361.98192809,361.98192809,361.96406214,361.98192807,361.98192807,361.96406215,361.98192807,361.98192807,361.96406215,361.94619624,361.94619624,361.94619624,361.96406215,361.94619623,361.94619623,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.96406215,361.98192807,361.98192807,361.98192807,361.96406215,361.96406215,361.96406216,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.94619624,361.94619624,361.96406215,361.96406215,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.98192808,361.98192809,361.98192809,361.98192807,361.96406216,361.98192809,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.94619624,361.94619624,361.99979401,361.99979401,361.99979401,361.99979402,361.99979402,361.99979401,361.99979401,361.99979401,361.999794,361.99979401,361.99979401,361.999794,387.99979401,387.99979401,387.99979401,387.999794,387.99979402,387.99979401,387.999793989,387.999793989,387.999793992,387.999793994,387.999793993,387.999793994,387.999793995,387.999793995,387.99979399,387.99979401,387.99979399,387.99979399,427.99979401,427.99979401,427.99979401 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,0,199.9196853,199.91968529,199.90181936,199.91968528,199.90181935,199.90181936,199.90181936,199.91968528,199.9375512,199.9375512,199.91968528,199.91968528,199.90181936,199.90181935,199.93755119,199.90181937,199.91968528,199.90181937,199.91968529,199.91968529,199.91968529,199.90181936,199.90181936,199.90181935,199.90181935,199.90181936,199.90181936,199.90181937,199.90181937,199.88395344,199.88395345,199.90181935,199.91968528,199.90181936,199.90181936,199.90181935,199.90181935,199.91968528,199.91968528,199.91968527,199.91968527,199.91968529,199.93755122,199.93755122,199.91968528,199.91968528,199.91968528,199.93755121,199.93755121,199.93755121,199.93755121,199.93755121,199.91968529,199.91968529,199.91968529,199.91968529,199.91968529,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.97922214,361.97922214,361.97922214,361.98213409,361.98213409,361.9821341,361.98213411,361.9821341,361.98213409,361.98213409,361.98213407,361.98213408,361.98213407,361.98213408,361.98213408,361.98213408,361.98213408,361.98192809,361.98203108,361.98203109,361.98192811,361.98192811,361.98182506,361.98192807,361.98192809,361.98192811,361.9819281,361.9819281,361.98203106,361.9819281,361.9819281,361.98203109,361.98203109,361.9819281,361.98203106,361.98192806,361.98203109,361.9820311,361.98203115,361.98192809,361.98192809,361.98192813,361.9820311,361.98203115,361.98203109,361.98203112,361.98203111,361.98203111,361.98203111,361.9819281,199.9196853,0,26.44156695,58.08211768,83.93410916,83.91624323,83.91624324,83.91624324,83.93410916,83.95197508,83.95197508,83.93410916,83.93410916,108.3210949,108.32109489,108.35682673,108.32109491,108.33896082,108.32109491,108.33896083,108.33896083,108.33896083,127.29470578,127.29470578,127.29470577,127.29470577,127.29470578,140.33683002,140.33683003,140.33683003,140.3189641,140.31896411,140.33683001,140.35469594,142.98098672,161.31142436,161.31142435,161.31142435,177.40862154,177.40862154,177.40862153,177.40862153,177.40862155,177.42648748,177.42648748,177.40862154,177.40862154,177.40862154,177.42648747,177.42648747,177.42648747,177.42648747,177.42648747,177.40862155,177.40862155,177.40862155,177.40862155,177.40862155,217.94640222,217.96426815,217.96426815,217.94640223,217.96426815,217.96426815,217.94640223,217.92853632,217.92853632,217.92853632,217.94640223,217.92853631,217.92853631,217.94640223,217.94640223,217.96426815,217.96426815,217.96426816,217.96426816,217.94640223,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640224,217.94640224,217.94640224,217.94640223,217.94640223,217.94640224,217.92853632,217.92853632,217.94640223,217.94640223,217.94640223,217.94640223,217.96426815,217.96426815,217.96426816,217.96426816,217.96426816,217.96426817,217.96426817,217.96426815,217.94640224,217.96426817,217.94640224,217.94640224,217.94640224,217.94640224,217.94640224,217.94640224,217.94640224,217.92853632,217.92853632,279.98213409,279.98213409,279.98213409,303.9821341,303.9821341,303.98213409,303.98213409,339.98213409,339.98213408,339.98213409,339.98213409,339.98213408,387.98213409,387.98213409,387.98213409,387.98213408,387.9821341,387.98213409,387.982134069,387.982134069,387.982134072,387.982134074,387.982134073,387.982134074,387.982134075,387.982134075,387.98213407,387.98213409,387.98213407,387.98213407,427.98213409,427.98213409,427.98213409 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,26.44156695,0,58.08211767,83.93410915,83.91624322,83.91624323,83.91624323,83.93410915,83.95197507,83.95197507,83.93410915,83.93410915,108.32109489,108.32109488,108.35682672,108.3210949,108.33896081,108.3210949,108.33896082,108.33896082,108.33896082,127.29470577,127.29470577,127.29470576,127.29470576,127.29470577,140.33683001,140.33683002,140.33683002,140.31896409,140.3189641,140.33683,140.35469593,142.98098671,161.31142435,161.31142434,161.31142434,177.40862153,177.40862153,177.40862152,177.40862152,177.40862154,177.42648747,177.42648747,177.40862153,177.40862153,177.40862153,177.42648746,177.42648746,177.42648746,177.42648746,177.42648746,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,58.08211768,58.08211767,0,83.91624322,83.89837729,83.8983773,83.8983773,83.91624322,83.93410914,83.93410914,83.91624322,83.91624322,108.30322896,108.30322895,108.33896079,108.30322897,108.32109488,108.30322897,108.32109489,108.32109489,108.32109489,127.27683984,127.27683984,127.27683983,127.27683983,127.27683984,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,83.93410916,83.93410915,83.91624322,0,61.04786099,65.4428782,65.4428782,78.0740862,78.09195212,78.09195212,78.0740862,78.0740862,108.32109488,108.32109487,108.35682671,108.32109489,108.3389608,108.32109489,108.33896081,108.33896081,108.33896081,127.29470576,127.29470576,127.29470575,127.29470575,127.29470576,140.33683,140.33683001,140.33683001,140.31896408,140.31896409,140.33682999,140.35469592,142.9809867,161.31142434,161.31142433,161.31142433,177.40862152,177.40862152,177.40862151,177.40862151,177.40862153,177.42648746,177.42648746,177.40862152,177.40862152,177.40862152,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,83.91624323,83.91624322,83.89837729,61.04786099,0,65.42501227,65.42501227,78.05622027,78.07408619,78.07408619,78.05622027,78.05622027,108.30322895,108.30322894,108.33896078,108.30322896,108.32109487,108.30322896,108.32109488,108.32109488,108.32109488,127.27683983,127.27683983,127.27683982,127.27683982,127.27683983,140.31896407,140.31896408,140.31896408,140.30109815,140.30109816,140.31896406,140.33682999,142.96312077,161.29355841,161.2935584,161.2935584,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,83.91624324,83.91624323,83.8983773,65.4428782,65.42501227,0,29.15718734,78.05622028,78.0740862,78.0740862,78.05622028,78.05622028,108.30322896,108.30322895,108.33896079,108.30322897,108.32109488,108.30322897,108.32109489,108.32109489,108.32109489,127.27683984,127.27683984,127.27683983,127.27683983,127.27683984,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,83.91624324,83.91624323,83.8983773,65.4428782,65.42501227,29.15718734,0,78.05622028,78.0740862,78.0740862,78.05622028,78.05622028,108.30322896,108.30322895,108.33896079,108.30322897,108.32109488,108.30322897,108.32109489,108.32109489,108.32109489,127.27683984,127.27683984,127.27683983,127.27683983,127.27683984,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,83.93410916,83.93410915,83.91624322,78.0740862,78.05622027,78.05622028,78.05622028,0,42.61022782,42.61022782,63.45976068,63.45976068,108.32109488,108.32109487,108.35682671,108.32109489,108.3389608,108.32109489,108.33896081,108.33896081,108.33896081,127.29470576,127.29470576,127.29470575,127.29470575,127.29470576,140.33683,140.33683001,140.33683001,140.31896408,140.31896409,140.33682999,140.35469592,142.9809867,161.31142434,161.31142433,161.31142433,177.40862152,177.40862152,177.40862151,177.40862151,177.40862153,177.42648746,177.42648746,177.40862152,177.40862152,177.40862152,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.99708804,361.99708804,361.99708804,361.99999999,361.99999999,362,362.00000001,362,361.99999999,361.99999999,361.99999997,361.99999998,361.99999997,361.99999998,361.99999998,361.99999998,361.99999998,361.99979399,361.99989698,361.99989699,361.99979401,361.99979401,361.99969096,361.99979397,361.99979399,361.99979401,361.999794,361.999794,361.99989696,361.999794,361.999794,361.99989699,361.99989699,361.999794,361.99989696,361.99979396,361.99989699,361.999897,361.99989705,361.99979399,361.99979399,361.99979403,361.999897,361.99989705,361.99989699,361.99989702,361.99989701,361.99989701,361.99989701,361.999794,199.9375512,83.95197508,83.95197507,83.93410914,78.09195212,78.07408619,78.0740862,78.0740862,42.61022782,0,19.90263892,63.4776266,63.4776266,108.3389608,108.33896079,108.37469263,108.33896081,108.35682672,108.33896081,108.35682673,108.35682673,108.35682673,127.31257168,127.31257168,127.31257167,127.31257167,127.31257168,140.35469592,140.35469593,140.35469593,140.33683,140.33683001,140.35469591,140.37256184,142.99885262,161.32929026,161.32929025,161.32929025,177.42648744,177.42648744,177.42648743,177.42648743,177.42648745,177.44435338,177.44435338,177.42648744,177.42648744,177.42648744,177.44435337,177.44435337,177.44435337,177.44435337,177.44435337,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,217.96426812,217.98213405,217.98213405,217.96426813,217.98213405,217.98213405,217.96426813,217.94640222,217.94640222,217.94640222,217.96426813,217.94640221,217.94640221,217.96426813,217.96426813,217.98213405,217.98213405,217.98213406,217.98213406,217.96426813,217.98213405,217.98213405,217.98213405,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426813,217.96426813,217.96426814,217.94640222,217.94640222,217.96426813,217.96426813,217.96426813,217.96426813,217.98213405,217.98213405,217.98213406,217.98213406,217.98213406,217.98213407,217.98213407,217.98213405,217.96426814,217.98213407,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,279.99999999,279.99999999,279.99999999,304,304,303.99999999,303.99999999,339.99999999,339.99999998,339.99999999,339.99999999,339.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 -361.99708804,361.99708804,361.99708804,361.99999999,361.99999999,362,362.00000001,362,361.99999999,361.99999999,361.99999997,361.99999998,361.99999997,361.99999998,361.99999998,361.99999998,361.99999998,361.99979399,361.99989698,361.99989699,361.99979401,361.99979401,361.99969096,361.99979397,361.99979399,361.99979401,361.999794,361.999794,361.99989696,361.999794,361.999794,361.99989699,361.99989699,361.999794,361.99989696,361.99979396,361.99989699,361.999897,361.99989705,361.99979399,361.99979399,361.99979403,361.999897,361.99989705,361.99989699,361.99989702,361.99989701,361.99989701,361.99989701,361.999794,199.9375512,83.95197508,83.95197507,83.93410914,78.09195212,78.07408619,78.0740862,78.0740862,42.61022782,19.90263892,0,63.4776266,63.4776266,108.3389608,108.33896079,108.37469263,108.33896081,108.35682672,108.33896081,108.35682673,108.35682673,108.35682673,127.31257168,127.31257168,127.31257167,127.31257167,127.31257168,140.35469592,140.35469593,140.35469593,140.33683,140.33683001,140.35469591,140.37256184,142.99885262,161.32929026,161.32929025,161.32929025,177.42648744,177.42648744,177.42648743,177.42648743,177.42648745,177.44435338,177.44435338,177.42648744,177.42648744,177.42648744,177.44435337,177.44435337,177.44435337,177.44435337,177.44435337,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,217.96426812,217.98213405,217.98213405,217.96426813,217.98213405,217.98213405,217.96426813,217.94640222,217.94640222,217.94640222,217.96426813,217.94640221,217.94640221,217.96426813,217.96426813,217.98213405,217.98213405,217.98213406,217.98213406,217.96426813,217.98213405,217.98213405,217.98213405,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426813,217.96426813,217.96426814,217.94640222,217.94640222,217.96426813,217.96426813,217.96426813,217.96426813,217.98213405,217.98213405,217.98213406,217.98213406,217.98213406,217.98213407,217.98213407,217.98213405,217.96426814,217.98213407,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,279.99999999,279.99999999,279.99999999,304,304,303.99999999,303.99999999,339.99999999,339.99999998,339.99999999,339.99999999,339.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,83.93410916,83.93410915,83.91624322,78.0740862,78.05622027,78.05622028,78.05622028,63.45976068,63.4776266,63.4776266,0,36.80380264,108.32109488,108.32109487,108.35682671,108.32109489,108.3389608,108.32109489,108.33896081,108.33896081,108.33896081,127.29470576,127.29470576,127.29470575,127.29470575,127.29470576,140.33683,140.33683001,140.33683001,140.31896408,140.31896409,140.33682999,140.35469592,142.9809867,161.31142434,161.31142433,161.31142433,177.40862152,177.40862152,177.40862151,177.40862151,177.40862153,177.42648746,177.42648746,177.40862152,177.40862152,177.40862152,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,83.93410916,83.93410915,83.91624322,78.0740862,78.05622027,78.05622028,78.05622028,63.45976068,63.4776266,63.4776266,36.80380264,0,108.32109488,108.32109487,108.35682671,108.32109489,108.3389608,108.32109489,108.33896081,108.33896081,108.33896081,127.29470576,127.29470576,127.29470575,127.29470575,127.29470576,140.33683,140.33683001,140.33683001,140.31896408,140.31896409,140.33682999,140.35469592,142.9809867,161.31142434,161.31142433,161.31142433,177.40862152,177.40862152,177.40862151,177.40862151,177.40862153,177.42648746,177.42648746,177.40862152,177.40862152,177.40862152,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,108.3210949,108.32109489,108.30322896,108.32109488,108.30322895,108.30322896,108.30322896,108.32109488,108.3389608,108.3389608,108.32109488,108.32109488,0,91.58072445,91.61645629,91.58072447,91.59859038,91.58072447,98.20898213,98.20898213,98.20898213,127.27683984,127.27683984,127.27683983,127.27683983,127.27683984,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,108.32109489,108.32109488,108.30322895,108.32109487,108.30322894,108.30322895,108.30322895,108.32109487,108.33896079,108.33896079,108.32109487,108.32109487,91.58072445,0,57.45681034,71.99967218,72.01753809,71.99967218,98.20898212,98.20898212,98.20898212,127.27683983,127.27683983,127.27683982,127.27683982,127.27683983,140.31896407,140.31896408,140.31896408,140.30109815,140.30109816,140.31896406,140.33682999,142.96312077,161.29355841,161.2935584,161.2935584,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.99708803,361.99708803,361.99708803,361.99999998,361.99999998,361.99999999,362,361.99999999,361.99999998,361.99999998,361.99999996,361.99999997,361.99999996,361.99999997,361.99999997,361.99999997,361.99999997,361.99979398,361.99989697,361.99989698,361.999794,361.999794,361.99969095,361.99979396,361.99979398,361.999794,361.99979399,361.99979399,361.99989695,361.99979399,361.99979399,361.99989698,361.99989698,361.99979399,361.99989695,361.99979395,361.99989698,361.99989699,361.99989704,361.99979398,361.99979398,361.99979402,361.99989699,361.99989704,361.99989698,361.99989701,361.999897,361.999897,361.999897,361.99979399,199.93755119,108.35682673,108.35682672,108.33896079,108.35682671,108.33896078,108.33896079,108.33896079,108.35682671,108.37469263,108.37469263,108.35682671,108.35682671,91.61645629,57.45681034,0,72.03540402,72.05326993,72.03540402,98.24471396,98.24471396,98.24471396,127.31257167,127.31257167,127.31257166,127.31257166,127.31257167,140.35469591,140.35469592,140.35469592,140.33682999,140.33683,140.3546959,140.37256183,142.99885261,161.32929025,161.32929024,161.32929024,177.42648743,177.42648743,177.42648742,177.42648742,177.42648744,177.44435337,177.44435337,177.42648743,177.42648743,177.42648743,177.44435336,177.44435336,177.44435336,177.44435336,177.44435336,177.42648744,177.42648744,177.42648744,177.42648744,177.42648744,217.96426811,217.98213404,217.98213404,217.96426812,217.98213404,217.98213404,217.96426812,217.94640221,217.94640221,217.94640221,217.96426812,217.9464022,217.9464022,217.96426812,217.96426812,217.98213404,217.98213404,217.98213405,217.98213405,217.96426812,217.98213404,217.98213404,217.98213404,217.96426812,217.96426812,217.96426813,217.96426813,217.96426813,217.96426812,217.96426812,217.96426813,217.94640221,217.94640221,217.96426812,217.96426812,217.96426812,217.96426812,217.98213404,217.98213404,217.98213405,217.98213405,217.98213405,217.98213406,217.98213406,217.98213404,217.96426813,217.98213406,217.96426813,217.96426813,217.96426813,217.96426813,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,279.99999998,279.99999998,279.99999998,303.99999999,303.99999999,303.99999998,303.99999998,339.99999998,339.99999997,339.99999998,339.99999998,339.99999997,387.99999998,387.99999998,387.99999998,387.99999997,387.99999999,387.99999998,387.999999959,387.999999959,387.999999962,387.999999964,387.999999963,387.999999964,387.999999965,387.999999965,387.99999996,387.99999998,387.99999996,387.99999996,427.99999998,427.99999998,427.99999998 -361.96135621,361.96135621,361.96135621,361.96426816,361.96426816,361.96426817,361.96426818,361.96426817,361.96426816,361.96426816,361.96426814,361.96426815,361.96426814,361.96426815,361.96426815,361.96426815,361.96426815,361.96406216,361.96416515,361.96416516,361.96406218,361.96406218,361.96395913,361.96406214,361.96406216,361.96406218,361.96406217,361.96406217,361.96416513,361.96406217,361.96406217,361.96416516,361.96416516,361.96406217,361.96416513,361.96406213,361.96416516,361.96416517,361.96416522,361.96406216,361.96406216,361.9640622,361.96416517,361.96416522,361.96416516,361.96416519,361.96416518,361.96416518,361.96416518,361.96406217,199.90181937,108.32109491,108.3210949,108.30322897,108.32109489,108.30322896,108.30322897,108.30322897,108.32109489,108.33896081,108.33896081,108.32109489,108.32109489,91.58072447,71.99967218,72.03540402,0,20.38501885,39.12637274,98.20898214,98.20898214,98.20898214,127.27683985,127.27683985,127.27683984,127.27683984,127.27683985,140.31896409,140.3189641,140.3189641,140.30109817,140.30109818,140.31896408,140.33683001,142.96312079,161.29355843,161.29355842,161.29355842,177.39075561,177.39075561,177.3907556,177.3907556,177.39075562,177.40862155,177.40862155,177.39075561,177.39075561,177.39075561,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,177.39075562,177.39075562,177.39075562,177.39075562,177.39075562,217.92853629,217.94640222,217.94640222,217.9285363,217.94640222,217.94640222,217.9285363,217.91067039,217.91067039,217.91067039,217.9285363,217.91067038,217.91067038,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,217.92853631,217.92853631,217.92853631,217.9285363,217.9285363,217.92853631,217.91067039,217.91067039,217.9285363,217.9285363,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640224,217.94640224,217.94640222,217.92853631,217.94640224,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.91067039,217.91067039,279.96426816,279.96426816,279.96426816,303.96426817,303.96426817,303.96426816,303.96426816,339.96426816,339.96426815,339.96426816,339.96426816,339.96426815,387.96426816,387.96426816,387.96426816,387.96426815,387.96426817,387.96426816,387.964268139,387.964268139,387.964268142,387.964268144,387.964268143,387.964268144,387.964268145,387.964268145,387.96426814,387.96426816,387.96426814,387.96426814,427.96426816,427.96426816,427.96426816 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,108.33896082,108.33896081,108.32109488,108.3389608,108.32109487,108.32109488,108.32109488,108.3389608,108.35682672,108.35682672,108.3389608,108.3389608,91.59859038,72.01753809,72.05326993,20.38501885,0,39.14423865,98.22684805,98.22684805,98.22684805,127.29470576,127.29470576,127.29470575,127.29470575,127.29470576,140.33683,140.33683001,140.33683001,140.31896408,140.31896409,140.33682999,140.35469592,142.9809867,161.31142434,161.31142433,161.31142433,177.40862152,177.40862152,177.40862151,177.40862151,177.40862153,177.42648746,177.42648746,177.40862152,177.40862152,177.40862152,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.96135621,361.96135621,361.96135621,361.96426816,361.96426816,361.96426817,361.96426818,361.96426817,361.96426816,361.96426816,361.96426814,361.96426815,361.96426814,361.96426815,361.96426815,361.96426815,361.96426815,361.96406216,361.96416515,361.96416516,361.96406218,361.96406218,361.96395913,361.96406214,361.96406216,361.96406218,361.96406217,361.96406217,361.96416513,361.96406217,361.96406217,361.96416516,361.96416516,361.96406217,361.96416513,361.96406213,361.96416516,361.96416517,361.96416522,361.96406216,361.96406216,361.9640622,361.96416517,361.96416522,361.96416516,361.96416519,361.96416518,361.96416518,361.96416518,361.96406217,199.90181937,108.32109491,108.3210949,108.30322897,108.32109489,108.30322896,108.30322897,108.30322897,108.32109489,108.33896081,108.33896081,108.32109489,108.32109489,91.58072447,71.99967218,72.03540402,39.12637274,39.14423865,0,98.20898214,98.20898214,98.20898214,127.27683985,127.27683985,127.27683984,127.27683984,127.27683985,140.31896409,140.3189641,140.3189641,140.30109817,140.30109818,140.31896408,140.33683001,142.96312079,161.29355843,161.29355842,161.29355842,177.39075561,177.39075561,177.3907556,177.3907556,177.39075562,177.40862155,177.40862155,177.39075561,177.39075561,177.39075561,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,177.39075562,177.39075562,177.39075562,177.39075562,177.39075562,217.92853629,217.94640222,217.94640222,217.9285363,217.94640222,217.94640222,217.9285363,217.91067039,217.91067039,217.91067039,217.9285363,217.91067038,217.91067038,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,217.92853631,217.92853631,217.92853631,217.9285363,217.9285363,217.92853631,217.91067039,217.91067039,217.9285363,217.9285363,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640224,217.94640224,217.94640222,217.92853631,217.94640224,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.91067039,217.91067039,279.96426816,279.96426816,279.96426816,303.96426817,303.96426817,303.96426816,303.96426816,339.96426816,339.96426815,339.96426816,339.96426816,339.96426815,387.96426816,387.96426816,387.96426816,387.96426815,387.96426817,387.96426816,387.964268139,387.964268139,387.964268142,387.964268144,387.964268143,387.964268144,387.964268145,387.964268145,387.96426814,387.96426816,387.96426814,387.96426814,427.96426816,427.96426816,427.96426816 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,108.33896083,108.33896082,108.32109489,108.33896081,108.32109488,108.32109489,108.32109489,108.33896081,108.35682673,108.35682673,108.33896081,108.33896081,98.20898213,98.20898212,98.24471396,98.20898214,98.22684805,98.20898214,0,78.61006392,78.61006392,127.29470577,127.29470577,127.29470576,127.29470576,127.29470577,140.33683001,140.33683002,140.33683002,140.31896409,140.3189641,140.33683,140.35469593,142.98098671,161.31142435,161.31142434,161.31142434,177.40862153,177.40862153,177.40862152,177.40862152,177.40862154,177.42648747,177.42648747,177.40862153,177.40862153,177.40862153,177.42648746,177.42648746,177.42648746,177.42648746,177.42648746,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,108.33896083,108.33896082,108.32109489,108.33896081,108.32109488,108.32109489,108.32109489,108.33896081,108.35682673,108.35682673,108.33896081,108.33896081,98.20898213,98.20898212,98.24471396,98.20898214,98.22684805,98.20898214,78.61006392,0,46.30847402,127.29470577,127.29470577,127.29470576,127.29470576,127.29470577,140.33683001,140.33683002,140.33683002,140.31896409,140.3189641,140.33683,140.35469593,142.98098671,161.31142435,161.31142434,161.31142434,177.40862153,177.40862153,177.40862152,177.40862152,177.40862154,177.42648747,177.42648747,177.40862153,177.40862153,177.40862153,177.42648746,177.42648746,177.42648746,177.42648746,177.42648746,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,108.33896083,108.33896082,108.32109489,108.33896081,108.32109488,108.32109489,108.32109489,108.33896081,108.35682673,108.35682673,108.33896081,108.33896081,98.20898213,98.20898212,98.24471396,98.20898214,98.22684805,98.20898214,78.61006392,46.30847402,0,127.29470577,127.29470577,127.29470576,127.29470576,127.29470577,140.33683001,140.33683002,140.33683002,140.31896409,140.3189641,140.33683,140.35469593,142.98098671,161.31142435,161.31142434,161.31142434,177.40862153,177.40862153,177.40862152,177.40862152,177.40862154,177.42648747,177.42648747,177.40862153,177.40862153,177.40862153,177.42648746,177.42648746,177.42648746,177.42648746,177.42648746,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,127.29470578,127.29470577,127.27683984,127.29470576,127.27683983,127.27683984,127.27683984,127.29470576,127.31257168,127.31257168,127.29470576,127.29470576,127.27683984,127.27683983,127.31257167,127.27683985,127.29470576,127.27683985,127.29470577,127.29470577,127.29470577,0,26.90608098,38.76905425,51.45386001,59.35059826,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,127.29470578,127.29470577,127.27683984,127.29470576,127.27683983,127.27683984,127.27683984,127.29470576,127.31257168,127.31257168,127.29470576,127.29470576,127.27683984,127.27683983,127.31257167,127.27683985,127.29470576,127.27683985,127.29470577,127.29470577,127.29470577,26.90608098,0,38.76905425,51.45386001,59.35059826,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,127.29470577,127.29470576,127.27683983,127.29470575,127.27683982,127.27683983,127.27683983,127.29470575,127.31257167,127.31257167,127.29470575,127.29470575,127.27683983,127.27683982,127.31257166,127.27683984,127.29470575,127.27683984,127.29470576,127.29470576,127.29470576,38.76905425,38.76905425,0,51.45386,59.35059825,140.31896407,140.31896408,140.31896408,140.30109815,140.30109816,140.31896406,140.33682999,142.96312077,161.29355841,161.2935584,161.2935584,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,127.29470577,127.29470576,127.27683983,127.29470575,127.27683982,127.27683983,127.27683983,127.29470575,127.31257167,127.31257167,127.29470575,127.29470575,127.27683983,127.27683982,127.31257166,127.27683984,127.29470575,127.27683984,127.29470576,127.29470576,127.29470576,51.45386001,51.45386001,51.45386,0,59.35059825,140.31896407,140.31896408,140.31896408,140.30109815,140.30109816,140.31896406,140.33682999,142.96312077,161.29355841,161.2935584,161.2935584,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,127.29470578,127.29470577,127.27683984,127.29470576,127.27683983,127.27683984,127.27683984,127.29470576,127.31257168,127.31257168,127.29470576,127.29470576,127.27683984,127.27683983,127.31257167,127.27683985,127.29470576,127.27683985,127.29470577,127.29470577,127.29470577,59.35059826,59.35059826,59.35059825,59.35059825,0,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,140.33683002,140.33683001,140.31896408,140.33683,140.31896407,140.31896408,140.31896408,140.33683,140.35469592,140.35469592,140.33683,140.33683,140.31896408,140.31896407,140.35469591,140.31896409,140.33683,140.31896409,140.33683001,140.33683001,140.33683001,140.31896408,140.31896408,140.31896407,140.31896407,140.31896408,0,93.68890347,93.68890347,93.67103754,93.67103755,110.51860349,127.75921978,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.96135621,361.96135621,361.96135621,361.96426816,361.96426816,361.96426817,361.96426818,361.96426817,361.96426816,361.96426816,361.96426814,361.96426815,361.96426814,361.96426815,361.96426815,361.96426815,361.96426815,361.96406216,361.96416515,361.96416516,361.96406218,361.96406218,361.96395913,361.96406214,361.96406216,361.96406218,361.96406217,361.96406217,361.96416513,361.96406217,361.96406217,361.96416516,361.96416516,361.96406217,361.96416513,361.96406213,361.96416516,361.96416517,361.96416522,361.96406216,361.96406216,361.9640622,361.96416517,361.96416522,361.96416516,361.96416519,361.96416518,361.96416518,361.96416518,361.96406217,199.90181937,140.33683003,140.33683002,140.31896409,140.33683001,140.31896408,140.31896409,140.31896409,140.33683001,140.35469593,140.35469593,140.33683001,140.33683001,140.31896409,140.31896408,140.35469592,140.3189641,140.33683001,140.3189641,140.33683002,140.33683002,140.33683002,140.31896409,140.31896409,140.31896408,140.31896408,140.31896409,93.68890347,0,18.43763318,64.22799541,64.22799542,110.5186035,127.75921979,142.96312079,161.29355843,161.29355842,161.29355842,177.39075561,177.39075561,177.3907556,177.3907556,177.39075562,177.40862155,177.40862155,177.39075561,177.39075561,177.39075561,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,177.39075562,177.39075562,177.39075562,177.39075562,177.39075562,217.92853629,217.94640222,217.94640222,217.9285363,217.94640222,217.94640222,217.9285363,217.91067039,217.91067039,217.91067039,217.9285363,217.91067038,217.91067038,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,217.92853631,217.92853631,217.92853631,217.9285363,217.9285363,217.92853631,217.91067039,217.91067039,217.9285363,217.9285363,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640224,217.94640224,217.94640222,217.92853631,217.94640224,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.91067039,217.91067039,279.96426816,279.96426816,279.96426816,303.96426817,303.96426817,303.96426816,303.96426816,339.96426816,339.96426815,339.96426816,339.96426816,339.96426815,387.96426816,387.96426816,387.96426816,387.96426815,387.96426817,387.96426816,387.964268139,387.964268139,387.964268142,387.964268144,387.964268143,387.964268144,387.964268145,387.964268145,387.96426814,387.96426816,387.96426814,387.96426814,427.96426816,427.96426816,427.96426816 -361.96135621,361.96135621,361.96135621,361.96426816,361.96426816,361.96426817,361.96426818,361.96426817,361.96426816,361.96426816,361.96426814,361.96426815,361.96426814,361.96426815,361.96426815,361.96426815,361.96426815,361.96406216,361.96416515,361.96416516,361.96406218,361.96406218,361.96395913,361.96406214,361.96406216,361.96406218,361.96406217,361.96406217,361.96416513,361.96406217,361.96406217,361.96416516,361.96416516,361.96406217,361.96416513,361.96406213,361.96416516,361.96416517,361.96416522,361.96406216,361.96406216,361.9640622,361.96416517,361.96416522,361.96416516,361.96416519,361.96416518,361.96416518,361.96416518,361.96406217,199.90181937,140.33683003,140.33683002,140.31896409,140.33683001,140.31896408,140.31896409,140.31896409,140.33683001,140.35469593,140.35469593,140.33683001,140.33683001,140.31896409,140.31896408,140.35469592,140.3189641,140.33683001,140.3189641,140.33683002,140.33683002,140.33683002,140.31896409,140.31896409,140.31896408,140.31896408,140.31896409,93.68890347,18.43763318,0,64.22799541,64.22799542,110.5186035,127.75921979,142.96312079,161.29355843,161.29355842,161.29355842,177.39075561,177.39075561,177.3907556,177.3907556,177.39075562,177.40862155,177.40862155,177.39075561,177.39075561,177.39075561,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,177.39075562,177.39075562,177.39075562,177.39075562,177.39075562,217.92853629,217.94640222,217.94640222,217.9285363,217.94640222,217.94640222,217.9285363,217.91067039,217.91067039,217.91067039,217.9285363,217.91067038,217.91067038,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,217.92853631,217.92853631,217.92853631,217.9285363,217.9285363,217.92853631,217.91067039,217.91067039,217.9285363,217.9285363,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640224,217.94640224,217.94640222,217.92853631,217.94640224,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.91067039,217.91067039,279.96426816,279.96426816,279.96426816,303.96426817,303.96426817,303.96426816,303.96426816,339.96426816,339.96426815,339.96426816,339.96426816,339.96426815,387.96426816,387.96426816,387.96426816,387.96426815,387.96426817,387.96426816,387.964268139,387.964268139,387.964268142,387.964268144,387.964268143,387.964268144,387.964268145,387.964268145,387.96426814,387.96426816,387.96426814,387.96426814,427.96426816,427.96426816,427.96426816 -361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,199.88395344,140.3189641,140.31896409,140.30109816,140.31896408,140.30109815,140.30109816,140.30109816,140.31896408,140.33683,140.33683,140.31896408,140.31896408,140.30109816,140.30109815,140.33682999,140.30109817,140.31896408,140.30109817,140.31896409,140.31896409,140.31896409,140.30109816,140.30109816,140.30109815,140.30109815,140.30109816,93.67103754,64.22799541,64.22799541,0,49.13128995,110.50073757,127.74135386,142.94525486,161.2756925,161.27569249,161.27569249,177.37288968,177.37288968,177.37288967,177.37288967,177.37288969,177.39075562,177.39075562,177.37288968,177.37288968,177.37288968,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,177.37288969,177.37288969,177.37288969,177.37288969,177.37288969,217.91067036,217.92853629,217.92853629,217.91067037,217.92853629,217.92853629,217.91067037,217.89280446,217.89280446,217.89280446,217.91067037,217.89280445,217.89280445,217.91067037,217.91067037,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,217.91067038,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.89280446,217.89280446,217.91067037,217.91067037,217.91067037,217.91067037,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853631,217.92853631,217.92853629,217.91067038,217.92853631,217.91067038,217.91067038,217.91067038,217.91067038,217.91067038,217.91067038,217.91067038,217.89280446,217.89280446,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 -361.94349029,361.94349029,361.94349029,361.94640224,361.94640224,361.94640225,361.94640226,361.94640225,361.94640224,361.94640224,361.94640222,361.94640223,361.94640222,361.94640223,361.94640223,361.94640223,361.94640223,361.94619624,361.94629923,361.94629924,361.94619626,361.94619626,361.94609321,361.94619622,361.94619624,361.94619626,361.94619625,361.94619625,361.94629921,361.94619625,361.94619625,361.94629924,361.94629924,361.94619625,361.94629921,361.94619621,361.94629924,361.94629925,361.9462993,361.94619624,361.94619624,361.94619628,361.94629925,361.9462993,361.94629924,361.94629927,361.94629926,361.94629926,361.94629926,361.94619625,199.88395345,140.31896411,140.3189641,140.30109817,140.31896409,140.30109816,140.30109817,140.30109817,140.31896409,140.33683001,140.33683001,140.31896409,140.31896409,140.30109817,140.30109816,140.33683,140.30109818,140.31896409,140.30109818,140.3189641,140.3189641,140.3189641,140.30109817,140.30109817,140.30109816,140.30109816,140.30109817,93.67103755,64.22799542,64.22799542,49.13128995,0,110.50073758,127.74135387,142.94525487,161.27569251,161.2756925,161.2756925,177.37288969,177.37288969,177.37288968,177.37288968,177.3728897,177.39075563,177.39075563,177.37288969,177.37288969,177.37288969,177.39075562,177.39075562,177.39075562,177.39075562,177.39075562,177.3728897,177.3728897,177.3728897,177.3728897,177.3728897,217.91067037,217.9285363,217.9285363,217.91067038,217.9285363,217.9285363,217.91067038,217.89280447,217.89280447,217.89280447,217.91067038,217.89280446,217.89280446,217.91067038,217.91067038,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,217.91067039,217.91067039,217.91067039,217.91067038,217.91067038,217.91067039,217.89280447,217.89280447,217.91067038,217.91067038,217.91067038,217.91067038,217.9285363,217.9285363,217.92853631,217.92853631,217.92853631,217.92853632,217.92853632,217.9285363,217.91067039,217.92853632,217.91067039,217.91067039,217.91067039,217.91067039,217.91067039,217.91067039,217.91067039,217.89280447,217.89280447,279.94640224,279.94640224,279.94640224,303.94640225,303.94640225,303.94640224,303.94640224,339.94640224,339.94640223,339.94640224,339.94640224,339.94640223,387.94640224,387.94640224,387.94640224,387.94640223,387.94640225,387.94640224,387.946402219,387.946402219,387.946402222,387.946402224,387.946402223,387.946402224,387.946402225,387.946402225,387.94640222,387.94640224,387.94640222,387.94640222,427.94640224,427.94640224,427.94640224 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,140.33683001,140.33683,140.31896407,140.33682999,140.31896406,140.31896407,140.31896407,140.33682999,140.35469591,140.35469591,140.33682999,140.33682999,140.31896407,140.31896406,140.3546959,140.31896408,140.33682999,140.31896408,140.33683,140.33683,140.33683,140.31896407,140.31896407,140.31896406,140.31896406,140.31896407,110.51860349,110.5186035,110.5186035,110.50073757,110.50073758,0,127.75921977,142.96312077,161.29355841,161.2935584,161.2935584,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,140.35469594,140.35469593,140.33683,140.35469592,140.33682999,140.33683,140.33683,140.35469592,140.37256184,140.37256184,140.35469592,140.35469592,140.33683,140.33682999,140.37256183,140.33683001,140.35469592,140.33683001,140.35469593,140.35469593,140.35469593,140.33683,140.33683,140.33682999,140.33682999,140.33683,127.75921978,127.75921979,127.75921979,127.74135386,127.74135387,127.75921977,0,142.9809867,161.31142434,161.31142433,161.31142433,177.40862152,177.40862152,177.40862151,177.40862151,177.40862153,177.42648746,177.42648746,177.40862152,177.40862152,177.40862152,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,142.98098672,142.98098671,142.96312078,142.9809867,142.96312077,142.96312078,142.96312078,142.9809867,142.99885262,142.99885262,142.9809867,142.9809867,142.96312078,142.96312077,142.99885261,142.96312079,142.9809867,142.96312079,142.98098671,142.98098671,142.98098671,142.96312078,142.96312078,142.96312077,142.96312077,142.96312078,142.96312078,142.96312079,142.96312079,142.94525486,142.94525487,142.96312077,142.9809867,0,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,161.31142436,161.31142435,161.29355842,161.31142434,161.29355841,161.29355842,161.29355842,161.31142434,161.32929026,161.32929026,161.31142434,161.31142434,161.29355842,161.29355841,161.32929025,161.29355843,161.31142434,161.29355843,161.31142435,161.31142435,161.31142435,161.29355842,161.29355842,161.29355841,161.29355841,161.29355842,161.29355842,161.29355843,161.29355843,161.2756925,161.27569251,161.29355841,161.31142434,161.29355842,0,130.52843795,130.52843795,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,161.31142435,161.31142434,161.29355841,161.31142433,161.2935584,161.29355841,161.29355841,161.31142433,161.32929025,161.32929025,161.31142433,161.31142433,161.29355841,161.2935584,161.32929024,161.29355842,161.31142433,161.29355842,161.31142434,161.31142434,161.31142434,161.29355841,161.29355841,161.2935584,161.2935584,161.29355841,161.29355841,161.29355842,161.29355842,161.27569249,161.2756925,161.2935584,161.31142433,161.29355841,130.52843795,0,76.14456646,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,161.31142435,161.31142434,161.29355841,161.31142433,161.2935584,161.29355841,161.29355841,161.31142433,161.32929025,161.32929025,161.31142433,161.31142433,161.29355841,161.2935584,161.32929024,161.29355842,161.31142433,161.29355842,161.31142434,161.31142434,161.31142434,161.29355841,161.29355841,161.2935584,161.2935584,161.29355841,161.29355841,161.29355842,161.29355842,161.27569249,161.2756925,161.2935584,161.31142433,161.29355841,130.52843795,76.14456646,0,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,177.40862154,177.40862153,177.3907556,177.40862152,177.39075559,177.3907556,177.3907556,177.40862152,177.42648744,177.42648744,177.40862152,177.40862152,177.3907556,177.39075559,177.42648743,177.39075561,177.40862152,177.39075561,177.40862153,177.40862153,177.40862153,177.3907556,177.3907556,177.39075559,177.39075559,177.3907556,177.3907556,177.39075561,177.39075561,177.37288968,177.37288969,177.39075559,177.40862152,177.3907556,177.3907556,177.39075559,177.39075559,0,74.00065564,83.32666775,83.32666775,134.24455007,134.262416,134.262416,134.24455006,134.24455006,134.24455006,134.26241599,134.26241599,134.26241599,134.26241599,134.26241599,134.24455007,134.24455007,134.24455007,134.24455007,134.24455007,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,177.40862154,177.40862153,177.3907556,177.40862152,177.39075559,177.3907556,177.3907556,177.40862152,177.42648744,177.42648744,177.40862152,177.40862152,177.3907556,177.39075559,177.42648743,177.39075561,177.40862152,177.39075561,177.40862153,177.40862153,177.40862153,177.3907556,177.3907556,177.39075559,177.39075559,177.3907556,177.3907556,177.39075561,177.39075561,177.37288968,177.37288969,177.39075559,177.40862152,177.3907556,177.3907556,177.39075559,177.39075559,74.00065564,0,83.32666775,83.32666775,134.24455007,134.262416,134.262416,134.24455006,134.24455006,134.24455006,134.26241599,134.26241599,134.26241599,134.26241599,134.26241599,134.24455007,134.24455007,134.24455007,134.24455007,134.24455007,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,199.91968527,177.40862153,177.40862152,177.39075559,177.40862151,177.39075558,177.39075559,177.39075559,177.40862151,177.42648743,177.42648743,177.40862151,177.40862151,177.39075559,177.39075558,177.42648742,177.3907556,177.40862151,177.3907556,177.40862152,177.40862152,177.40862152,177.39075559,177.39075559,177.39075558,177.39075558,177.39075559,177.39075559,177.3907556,177.3907556,177.37288967,177.37288968,177.39075558,177.40862151,177.39075559,177.39075559,177.39075558,177.39075558,83.32666775,83.32666775,0,74.92968364,134.24455006,134.26241599,134.26241599,134.24455005,134.24455005,134.24455005,134.26241598,134.26241598,134.26241598,134.26241598,134.26241598,134.24455006,134.24455006,134.24455006,134.24455006,134.24455006,217.94640219,217.96426812,217.96426812,217.9464022,217.96426812,217.96426812,217.9464022,217.92853629,217.92853629,217.92853629,217.9464022,217.92853628,217.92853628,217.9464022,217.9464022,217.96426812,217.96426812,217.96426813,217.96426813,217.9464022,217.96426812,217.96426812,217.96426812,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.92853629,217.92853629,217.9464022,217.9464022,217.9464022,217.9464022,217.96426812,217.96426812,217.96426813,217.96426813,217.96426813,217.96426814,217.96426814,217.96426812,217.94640221,217.96426814,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,199.91968527,177.40862153,177.40862152,177.39075559,177.40862151,177.39075558,177.39075559,177.39075559,177.40862151,177.42648743,177.42648743,177.40862151,177.40862151,177.39075559,177.39075558,177.42648742,177.3907556,177.40862151,177.3907556,177.40862152,177.40862152,177.40862152,177.39075559,177.39075559,177.39075558,177.39075558,177.39075559,177.39075559,177.3907556,177.3907556,177.37288967,177.37288968,177.39075558,177.40862151,177.39075559,177.39075559,177.39075558,177.39075558,83.32666775,83.32666775,74.92968364,0,134.24455006,134.26241599,134.26241599,134.24455005,134.24455005,134.24455005,134.26241598,134.26241598,134.26241598,134.26241598,134.26241598,134.24455006,134.24455006,134.24455006,134.24455006,134.24455006,217.94640219,217.96426812,217.96426812,217.9464022,217.96426812,217.96426812,217.9464022,217.92853629,217.92853629,217.92853629,217.9464022,217.92853628,217.92853628,217.9464022,217.9464022,217.96426812,217.96426812,217.96426813,217.96426813,217.9464022,217.96426812,217.96426812,217.96426812,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.92853629,217.92853629,217.9464022,217.9464022,217.9464022,217.9464022,217.96426812,217.96426812,217.96426813,217.96426813,217.96426813,217.96426814,217.96426814,217.96426812,217.94640221,217.96426814,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,177.40862155,177.40862154,177.39075561,177.40862153,177.3907556,177.39075561,177.39075561,177.40862153,177.42648745,177.42648745,177.40862153,177.40862153,177.39075561,177.3907556,177.42648744,177.39075562,177.40862153,177.39075562,177.40862154,177.40862154,177.40862154,177.39075561,177.39075561,177.3907556,177.3907556,177.39075561,177.39075561,177.39075562,177.39075562,177.37288969,177.3728897,177.3907556,177.40862153,177.39075561,177.39075561,177.3907556,177.3907556,134.24455007,134.24455007,134.24455006,134.24455006,0,73.41108015,73.41108015,80.68251105,80.68251105,80.68251105,80.70037698,80.70037698,80.70037698,80.70037698,80.70037698,80.68251106,80.68251106,80.68251106,80.68251106,80.68251106,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.99708806,361.99708806,361.99708806,362.00000001,362.00000001,362.00000002,362.00000003,362.00000002,362.00000001,362.00000001,361.99999999,362,361.99999999,362,362,362,362,361.99979401,361.999897,361.99989701,361.99979403,361.99979403,361.99969098,361.99979399,361.99979401,361.99979403,361.99979402,361.99979402,361.99989698,361.99979402,361.99979402,361.99989701,361.99989701,361.99979402,361.99989698,361.99979398,361.99989701,361.99989702,361.99989707,361.99979401,361.99979401,361.99979405,361.99989702,361.99989707,361.99989701,361.99989704,361.99989703,361.99989703,361.99989703,361.99979402,199.93755122,177.42648748,177.42648747,177.40862154,177.42648746,177.40862153,177.40862154,177.40862154,177.42648746,177.44435338,177.44435338,177.42648746,177.42648746,177.40862154,177.40862153,177.44435337,177.40862155,177.42648746,177.40862155,177.42648747,177.42648747,177.42648747,177.40862154,177.40862154,177.40862153,177.40862153,177.40862154,177.40862154,177.40862155,177.40862155,177.39075562,177.39075563,177.40862153,177.42648746,177.40862154,177.40862154,177.40862153,177.40862153,134.262416,134.262416,134.26241599,134.26241599,73.41108015,0,51.09654156,80.70037698,80.70037698,80.70037698,80.71824291,80.71824291,80.71824291,80.71824291,80.71824291,80.70037699,80.70037699,80.70037699,80.70037699,80.70037699,217.96426814,217.98213407,217.98213407,217.96426815,217.98213407,217.98213407,217.96426815,217.94640224,217.94640224,217.94640224,217.96426815,217.94640223,217.94640223,217.96426815,217.96426815,217.98213407,217.98213407,217.98213408,217.98213408,217.96426815,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426816,217.96426816,217.96426816,217.96426815,217.96426815,217.96426816,217.94640224,217.94640224,217.96426815,217.96426815,217.96426815,217.96426815,217.98213407,217.98213407,217.98213408,217.98213408,217.98213408,217.98213409,217.98213409,217.98213407,217.96426816,217.98213409,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,217.94640224,217.94640224,280.00000001,280.00000001,280.00000001,304.00000002,304.00000002,304.00000001,304.00000001,340.00000001,340,340.00000001,340.00000001,340,388.00000001,388.00000001,388.00000001,388,388.00000002,388.00000001,387.999999989,387.999999989,387.999999992,387.999999994,387.999999993,387.999999994,387.999999995,387.999999995,387.99999999,388.00000001,387.99999999,387.99999999,428.00000001,428.00000001,428.00000001 -361.99708806,361.99708806,361.99708806,362.00000001,362.00000001,362.00000002,362.00000003,362.00000002,362.00000001,362.00000001,361.99999999,362,361.99999999,362,362,362,362,361.99979401,361.999897,361.99989701,361.99979403,361.99979403,361.99969098,361.99979399,361.99979401,361.99979403,361.99979402,361.99979402,361.99989698,361.99979402,361.99979402,361.99989701,361.99989701,361.99979402,361.99989698,361.99979398,361.99989701,361.99989702,361.99989707,361.99979401,361.99979401,361.99979405,361.99989702,361.99989707,361.99989701,361.99989704,361.99989703,361.99989703,361.99989703,361.99979402,199.93755122,177.42648748,177.42648747,177.40862154,177.42648746,177.40862153,177.40862154,177.40862154,177.42648746,177.44435338,177.44435338,177.42648746,177.42648746,177.40862154,177.40862153,177.44435337,177.40862155,177.42648746,177.40862155,177.42648747,177.42648747,177.42648747,177.40862154,177.40862154,177.40862153,177.40862153,177.40862154,177.40862154,177.40862155,177.40862155,177.39075562,177.39075563,177.40862153,177.42648746,177.40862154,177.40862154,177.40862153,177.40862153,134.262416,134.262416,134.26241599,134.26241599,73.41108015,51.09654156,0,80.70037698,80.70037698,80.70037698,80.71824291,80.71824291,80.71824291,80.71824291,80.71824291,80.70037699,80.70037699,80.70037699,80.70037699,80.70037699,217.96426814,217.98213407,217.98213407,217.96426815,217.98213407,217.98213407,217.96426815,217.94640224,217.94640224,217.94640224,217.96426815,217.94640223,217.94640223,217.96426815,217.96426815,217.98213407,217.98213407,217.98213408,217.98213408,217.96426815,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426816,217.96426816,217.96426816,217.96426815,217.96426815,217.96426816,217.94640224,217.94640224,217.96426815,217.96426815,217.96426815,217.96426815,217.98213407,217.98213407,217.98213408,217.98213408,217.98213408,217.98213409,217.98213409,217.98213407,217.96426816,217.98213409,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,217.94640224,217.94640224,280.00000001,280.00000001,280.00000001,304.00000002,304.00000002,304.00000001,304.00000001,340.00000001,340,340.00000001,340.00000001,340,388.00000001,388.00000001,388.00000001,388,388.00000002,388.00000001,387.999999989,387.999999989,387.999999992,387.999999994,387.999999993,387.999999994,387.999999995,387.999999995,387.99999999,388.00000001,387.99999999,387.99999999,428.00000001,428.00000001,428.00000001 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,177.40862154,177.40862153,177.3907556,177.40862152,177.39075559,177.3907556,177.3907556,177.40862152,177.42648744,177.42648744,177.40862152,177.40862152,177.3907556,177.39075559,177.42648743,177.39075561,177.40862152,177.39075561,177.40862153,177.40862153,177.40862153,177.3907556,177.3907556,177.39075559,177.39075559,177.3907556,177.3907556,177.39075561,177.39075561,177.37288968,177.37288969,177.39075559,177.40862152,177.3907556,177.3907556,177.39075559,177.39075559,134.24455006,134.24455006,134.24455005,134.24455005,80.68251105,80.70037698,80.70037698,0,73.28601866,73.28601866,73.30388459,73.30388459,73.30388459,73.30388459,73.30388459,73.28601867,73.28601867,73.28601867,73.28601867,73.28601867,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,177.40862154,177.40862153,177.3907556,177.40862152,177.39075559,177.3907556,177.3907556,177.40862152,177.42648744,177.42648744,177.40862152,177.40862152,177.3907556,177.39075559,177.42648743,177.39075561,177.40862152,177.39075561,177.40862153,177.40862153,177.40862153,177.3907556,177.3907556,177.39075559,177.39075559,177.3907556,177.3907556,177.39075561,177.39075561,177.37288968,177.37288969,177.39075559,177.40862152,177.3907556,177.3907556,177.39075559,177.39075559,134.24455006,134.24455006,134.24455005,134.24455005,80.68251105,80.70037698,80.70037698,73.28601866,0,33.80232748,64.01360431,64.01360431,64.01360431,64.01360431,64.01360431,70.74905751,70.74905751,70.74905751,70.74905751,70.74905751,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,177.40862154,177.40862153,177.3907556,177.40862152,177.39075559,177.3907556,177.3907556,177.40862152,177.42648744,177.42648744,177.40862152,177.40862152,177.3907556,177.39075559,177.42648743,177.39075561,177.40862152,177.39075561,177.40862153,177.40862153,177.40862153,177.3907556,177.3907556,177.39075559,177.39075559,177.3907556,177.3907556,177.39075561,177.39075561,177.37288968,177.37288969,177.39075559,177.40862152,177.3907556,177.3907556,177.39075559,177.39075559,134.24455006,134.24455006,134.24455005,134.24455005,80.68251105,80.70037698,80.70037698,73.28601866,33.80232748,0,64.01360431,64.01360431,64.01360431,64.01360431,64.01360431,70.74905751,70.74905751,70.74905751,70.74905751,70.74905751,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,199.93755121,177.42648747,177.42648746,177.40862153,177.42648745,177.40862152,177.40862153,177.40862153,177.42648745,177.44435337,177.44435337,177.42648745,177.42648745,177.40862153,177.40862152,177.44435336,177.40862154,177.42648745,177.40862154,177.42648746,177.42648746,177.42648746,177.40862153,177.40862153,177.40862152,177.40862152,177.40862153,177.40862153,177.40862154,177.40862154,177.39075561,177.39075562,177.40862152,177.42648745,177.40862153,177.40862153,177.40862152,177.40862152,134.26241599,134.26241599,134.26241598,134.26241598,80.70037698,80.71824291,80.71824291,73.30388459,64.01360431,64.01360431,0,37.73283068,45.9154237,45.9154237,45.9154237,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,217.96426813,217.98213406,217.98213406,217.96426814,217.98213406,217.98213406,217.96426814,217.94640223,217.94640223,217.94640223,217.96426814,217.94640222,217.94640222,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.96426814,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426814,217.96426814,217.96426815,217.94640223,217.94640223,217.96426814,217.96426814,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.98213407,217.98213408,217.98213408,217.98213406,217.96426815,217.98213408,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,280,280,280,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,199.93755121,177.42648747,177.42648746,177.40862153,177.42648745,177.40862152,177.40862153,177.40862153,177.42648745,177.44435337,177.44435337,177.42648745,177.42648745,177.40862153,177.40862152,177.44435336,177.40862154,177.42648745,177.40862154,177.42648746,177.42648746,177.42648746,177.40862153,177.40862153,177.40862152,177.40862152,177.40862153,177.40862153,177.40862154,177.40862154,177.39075561,177.39075562,177.40862152,177.42648745,177.40862153,177.40862153,177.40862152,177.40862152,134.26241599,134.26241599,134.26241598,134.26241598,80.70037698,80.71824291,80.71824291,73.30388459,64.01360431,64.01360431,37.73283068,0,45.9154237,45.9154237,45.9154237,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,217.96426813,217.98213406,217.98213406,217.96426814,217.98213406,217.98213406,217.96426814,217.94640223,217.94640223,217.94640223,217.96426814,217.94640222,217.94640222,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.96426814,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426814,217.96426814,217.96426815,217.94640223,217.94640223,217.96426814,217.96426814,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.98213407,217.98213408,217.98213408,217.98213406,217.96426815,217.98213408,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,280,280,280,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,199.93755121,177.42648747,177.42648746,177.40862153,177.42648745,177.40862152,177.40862153,177.40862153,177.42648745,177.44435337,177.44435337,177.42648745,177.42648745,177.40862153,177.40862152,177.44435336,177.40862154,177.42648745,177.40862154,177.42648746,177.42648746,177.42648746,177.40862153,177.40862153,177.40862152,177.40862152,177.40862153,177.40862153,177.40862154,177.40862154,177.39075561,177.39075562,177.40862152,177.42648745,177.40862153,177.40862153,177.40862152,177.40862152,134.26241599,134.26241599,134.26241598,134.26241598,80.70037698,80.71824291,80.71824291,73.30388459,64.01360431,64.01360431,45.9154237,45.9154237,0,20.76020324,27.54925422,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,217.96426813,217.98213406,217.98213406,217.96426814,217.98213406,217.98213406,217.96426814,217.94640223,217.94640223,217.94640223,217.96426814,217.94640222,217.94640222,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.96426814,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426814,217.96426814,217.96426815,217.94640223,217.94640223,217.96426814,217.96426814,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.98213407,217.98213408,217.98213408,217.98213406,217.96426815,217.98213408,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,280,280,280,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,199.93755121,177.42648747,177.42648746,177.40862153,177.42648745,177.40862152,177.40862153,177.40862153,177.42648745,177.44435337,177.44435337,177.42648745,177.42648745,177.40862153,177.40862152,177.44435336,177.40862154,177.42648745,177.40862154,177.42648746,177.42648746,177.42648746,177.40862153,177.40862153,177.40862152,177.40862152,177.40862153,177.40862153,177.40862154,177.40862154,177.39075561,177.39075562,177.40862152,177.42648745,177.40862153,177.40862153,177.40862152,177.40862152,134.26241599,134.26241599,134.26241598,134.26241598,80.70037698,80.71824291,80.71824291,73.30388459,64.01360431,64.01360431,45.9154237,45.9154237,20.76020324,0,27.54925422,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,217.96426813,217.98213406,217.98213406,217.96426814,217.98213406,217.98213406,217.96426814,217.94640223,217.94640223,217.94640223,217.96426814,217.94640222,217.94640222,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.96426814,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426814,217.96426814,217.96426815,217.94640223,217.94640223,217.96426814,217.96426814,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.98213407,217.98213408,217.98213408,217.98213406,217.96426815,217.98213408,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,280,280,280,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,199.93755121,177.42648747,177.42648746,177.40862153,177.42648745,177.40862152,177.40862153,177.40862153,177.42648745,177.44435337,177.44435337,177.42648745,177.42648745,177.40862153,177.40862152,177.44435336,177.40862154,177.42648745,177.40862154,177.42648746,177.42648746,177.42648746,177.40862153,177.40862153,177.40862152,177.40862152,177.40862153,177.40862153,177.40862154,177.40862154,177.39075561,177.39075562,177.40862152,177.42648745,177.40862153,177.40862153,177.40862152,177.40862152,134.26241599,134.26241599,134.26241598,134.26241598,80.70037698,80.71824291,80.71824291,73.30388459,64.01360431,64.01360431,45.9154237,45.9154237,27.54925422,27.54925422,0,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,217.96426813,217.98213406,217.98213406,217.96426814,217.98213406,217.98213406,217.96426814,217.94640223,217.94640223,217.94640223,217.96426814,217.94640222,217.94640222,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.96426814,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426814,217.96426814,217.96426815,217.94640223,217.94640223,217.96426814,217.96426814,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.98213407,217.98213408,217.98213408,217.98213406,217.96426815,217.98213408,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,280,280,280,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,177.40862155,177.40862154,177.39075561,177.40862153,177.3907556,177.39075561,177.39075561,177.40862153,177.42648745,177.42648745,177.40862153,177.40862153,177.39075561,177.3907556,177.42648744,177.39075562,177.40862153,177.39075562,177.40862154,177.40862154,177.40862154,177.39075561,177.39075561,177.3907556,177.3907556,177.39075561,177.39075561,177.39075562,177.39075562,177.37288969,177.3728897,177.3907556,177.40862153,177.39075561,177.39075561,177.3907556,177.3907556,134.24455007,134.24455007,134.24455006,134.24455006,80.68251106,80.70037699,80.70037699,73.28601867,70.74905751,70.74905751,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,0,21.79642682,21.79642682,21.79642682,21.79642682,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,177.40862155,177.40862154,177.39075561,177.40862153,177.3907556,177.39075561,177.39075561,177.40862153,177.42648745,177.42648745,177.40862153,177.40862153,177.39075561,177.3907556,177.42648744,177.39075562,177.40862153,177.39075562,177.40862154,177.40862154,177.40862154,177.39075561,177.39075561,177.3907556,177.3907556,177.39075561,177.39075561,177.39075562,177.39075562,177.37288969,177.3728897,177.3907556,177.40862153,177.39075561,177.39075561,177.3907556,177.3907556,134.24455007,134.24455007,134.24455006,134.24455006,80.68251106,80.70037699,80.70037699,73.28601867,70.74905751,70.74905751,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,21.79642682,0,6.32453696,6.32453696,6.32453696,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,177.40862155,177.40862154,177.39075561,177.40862153,177.3907556,177.39075561,177.39075561,177.40862153,177.42648745,177.42648745,177.40862153,177.40862153,177.39075561,177.3907556,177.42648744,177.39075562,177.40862153,177.39075562,177.40862154,177.40862154,177.40862154,177.39075561,177.39075561,177.3907556,177.3907556,177.39075561,177.39075561,177.39075562,177.39075562,177.37288969,177.3728897,177.3907556,177.40862153,177.39075561,177.39075561,177.3907556,177.3907556,134.24455007,134.24455007,134.24455006,134.24455006,80.68251106,80.70037699,80.70037699,73.28601867,70.74905751,70.74905751,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,21.79642682,6.32453696,0,5.43124078,5.43124078,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,177.40862155,177.40862154,177.39075561,177.40862153,177.3907556,177.39075561,177.39075561,177.40862153,177.42648745,177.42648745,177.40862153,177.40862153,177.39075561,177.3907556,177.42648744,177.39075562,177.40862153,177.39075562,177.40862154,177.40862154,177.40862154,177.39075561,177.39075561,177.3907556,177.3907556,177.39075561,177.39075561,177.39075562,177.39075562,177.37288969,177.3728897,177.3907556,177.40862153,177.39075561,177.39075561,177.3907556,177.3907556,134.24455007,134.24455007,134.24455006,134.24455006,80.68251106,80.70037699,80.70037699,73.28601867,70.74905751,70.74905751,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,21.79642682,6.32453696,5.43124078,0,3.28732994,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,177.40862155,177.40862154,177.39075561,177.40862153,177.3907556,177.39075561,177.39075561,177.40862153,177.42648745,177.42648745,177.40862153,177.40862153,177.39075561,177.3907556,177.42648744,177.39075562,177.40862153,177.39075562,177.40862154,177.40862154,177.40862154,177.39075561,177.39075561,177.3907556,177.3907556,177.39075561,177.39075561,177.39075562,177.39075562,177.37288969,177.3728897,177.3907556,177.40862153,177.39075561,177.39075561,177.3907556,177.3907556,134.24455007,134.24455007,134.24455006,134.24455006,80.68251106,80.70037699,80.70037699,73.28601867,70.74905751,70.74905751,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,21.79642682,6.32453696,5.43124078,3.28732994,0,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.96135618,361.96135618,361.96135618,361.96426813,361.96426813,361.96426814,361.96426815,361.96426814,361.96426813,361.96426813,361.96426811,361.96426812,361.96426811,361.96426812,361.96426812,361.96426812,361.96426812,361.96406213,361.96416512,361.96416513,361.96406215,361.96406215,361.9639591,361.96406211,361.96406213,361.96406215,361.96406214,361.96406214,361.9641651,361.96406214,361.96406214,361.96416513,361.96416513,361.96406214,361.9641651,361.9640621,361.96416513,361.96416514,361.96416519,361.96406213,361.96406213,361.96406217,361.96416514,361.96416519,361.96416513,361.96416516,361.96416515,361.96416515,361.96416515,361.96406214,217.9464022,217.94640222,217.94640221,217.92853628,217.9464022,217.92853627,217.92853628,217.92853628,217.9464022,217.96426812,217.96426812,217.9464022,217.9464022,217.92853628,217.92853627,217.96426811,217.92853629,217.9464022,217.92853629,217.94640221,217.94640221,217.94640221,217.92853628,217.92853628,217.92853627,217.92853627,217.92853628,217.92853628,217.92853629,217.92853629,217.91067036,217.91067037,217.92853627,217.9464022,217.92853628,217.92853628,217.92853627,217.92853627,217.9464022,217.9464022,217.94640219,217.94640219,217.94640221,217.96426814,217.96426814,217.9464022,217.9464022,217.9464022,217.96426813,217.96426813,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,0,86.41747253,86.41747253,108.76774297,108.78560889,108.78560889,149.71643989,149.69857398,149.69857398,149.69857398,149.71643989,149.69857397,149.69857397,149.71643989,149.71643989,149.73430581,149.73430581,149.73430582,149.73430582,149.71643989,149.73430581,149.73430581,149.73430581,149.71643989,149.71643989,149.7164399,149.7164399,149.7164399,149.71643989,149.71643989,149.7164399,149.69857398,149.69857398,149.71643989,149.71643989,149.71643989,149.71643989,171.99524665,171.99524665,171.99524666,171.99524666,171.99524666,171.99524667,171.99524667,171.99524665,171.97738074,171.99524667,171.97738074,171.97738074,171.97738074,171.97738074,171.97738074,171.97738074,171.97738074,171.95951482,171.95951482,279.96426813,279.96426813,279.96426813,303.96426814,303.96426814,303.96426813,303.96426813,339.96426813,339.96426812,339.96426813,339.96426813,339.96426812,387.96426813,387.96426813,387.96426813,387.96426812,387.96426814,387.96426813,387.964268109,387.964268109,387.964268112,387.964268114,387.964268113,387.964268114,387.964268115,387.964268115,387.96426811,387.96426813,387.96426811,387.96426811,427.96426813,427.96426813,427.96426813 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,86.41747253,0,61.67316832,108.7856089,108.80347482,108.80347482,149.73430582,149.71643991,149.71643991,149.71643991,149.73430582,149.7164399,149.7164399,149.73430582,149.73430582,149.75217174,149.75217174,149.75217175,149.75217175,149.73430582,149.75217174,149.75217174,149.75217174,149.73430582,149.73430582,149.73430583,149.73430583,149.73430583,149.73430582,149.73430582,149.73430583,149.71643991,149.71643991,149.73430582,149.73430582,149.73430582,149.73430582,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,86.41747253,61.67316832,0,108.7856089,108.80347482,108.80347482,149.73430582,149.71643991,149.71643991,149.71643991,149.73430582,149.7164399,149.7164399,149.73430582,149.73430582,149.75217174,149.75217174,149.75217175,149.75217175,149.73430582,149.75217174,149.75217174,149.75217174,149.73430582,149.73430582,149.73430583,149.73430583,149.73430583,149.73430582,149.73430582,149.73430583,149.71643991,149.71643991,149.73430582,149.73430582,149.73430582,149.73430582,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,108.76774297,108.7856089,108.7856089,0,106.67742992,106.67742992,149.7164399,149.69857399,149.69857399,149.69857399,149.7164399,149.69857398,149.69857398,149.7164399,149.7164399,149.73430582,149.73430582,149.73430583,149.73430583,149.7164399,149.73430582,149.73430582,149.73430582,149.7164399,149.7164399,149.71643991,149.71643991,149.71643991,149.7164399,149.7164399,149.71643991,149.69857399,149.69857399,149.7164399,149.7164399,149.7164399,149.7164399,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,108.78560889,108.80347482,108.80347482,106.67742992,0,22.90411408,149.73430582,149.71643991,149.71643991,149.71643991,149.73430582,149.7164399,149.7164399,149.73430582,149.73430582,149.75217174,149.75217174,149.75217175,149.75217175,149.73430582,149.75217174,149.75217174,149.75217174,149.73430582,149.73430582,149.73430583,149.73430583,149.73430583,149.73430582,149.73430582,149.73430583,149.71643991,149.71643991,149.73430582,149.73430582,149.73430582,149.73430582,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,108.78560889,108.80347482,108.80347482,106.67742992,22.90411408,0,149.73430582,149.71643991,149.71643991,149.71643991,149.73430582,149.7164399,149.7164399,149.73430582,149.73430582,149.75217174,149.75217174,149.75217175,149.75217175,149.73430582,149.75217174,149.75217174,149.75217174,149.73430582,149.73430582,149.73430583,149.73430583,149.73430583,149.73430582,149.73430582,149.73430583,149.71643991,149.71643991,149.73430582,149.73430582,149.73430582,149.73430582,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,0,64.33519095,64.33519095,64.33519095,64.35305686,64.33519094,64.33519094,96.79757416,96.79757416,96.81544008,96.81544008,96.81544009,96.81544009,96.79757416,96.81544008,96.81544008,96.81544008,96.79757416,96.79757416,96.79757417,96.79757417,96.79757417,96.79757416,96.79757416,96.79757417,96.77970825,96.77970825,96.79757416,96.79757416,96.79757416,96.79757416,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,149.69857398,149.71643991,149.71643991,149.69857399,149.71643991,149.71643991,64.33519095,0,42.44943452,42.44943452,42.46730043,42.44943451,42.44943451,96.77970825,96.77970825,96.79757417,96.79757417,96.79757418,96.79757418,96.77970825,96.79757417,96.79757417,96.79757417,96.77970825,96.77970825,96.77970826,96.77970826,96.77970826,96.77970825,96.77970825,96.77970826,96.76184234,96.76184234,96.77970825,96.77970825,96.77970825,96.77970825,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738077,171.97738077,171.97738075,171.95951484,171.97738077,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.94164892,171.94164892,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 -361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,149.69857398,149.71643991,149.71643991,149.69857399,149.71643991,149.71643991,64.33519095,42.44943452,0,25.47680708,39.39436157,39.37649565,39.37649565,96.77970825,96.77970825,96.79757417,96.79757417,96.79757418,96.79757418,96.77970825,96.79757417,96.79757417,96.79757417,96.77970825,96.77970825,96.77970826,96.77970826,96.77970826,96.77970825,96.77970825,96.77970826,96.76184234,96.76184234,96.77970825,96.77970825,96.77970825,96.77970825,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738077,171.97738077,171.97738075,171.95951484,171.97738077,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.94164892,171.94164892,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 -361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,149.69857398,149.71643991,149.71643991,149.69857399,149.71643991,149.71643991,64.33519095,42.44943452,25.47680708,0,39.39436157,39.37649565,39.37649565,96.77970825,96.77970825,96.79757417,96.79757417,96.79757418,96.79757418,96.77970825,96.79757417,96.79757417,96.79757417,96.77970825,96.77970825,96.77970826,96.77970826,96.77970826,96.77970825,96.77970825,96.77970826,96.76184234,96.76184234,96.77970825,96.77970825,96.77970825,96.77970825,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738077,171.97738077,171.97738075,171.95951484,171.97738077,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.94164892,171.94164892,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,64.35305686,42.46730043,39.39436157,39.39436157,0,26.74528764,26.74528764,96.79757416,96.79757416,96.81544008,96.81544008,96.81544009,96.81544009,96.79757416,96.81544008,96.81544008,96.81544008,96.79757416,96.79757416,96.79757417,96.79757417,96.79757417,96.79757416,96.79757416,96.79757417,96.77970825,96.77970825,96.79757416,96.79757416,96.79757416,96.79757416,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.94349027,361.94349027,361.94349027,361.94640222,361.94640222,361.94640223,361.94640224,361.94640223,361.94640222,361.94640222,361.9464022,361.94640221,361.9464022,361.94640221,361.94640221,361.94640221,361.94640221,361.94619622,361.94629921,361.94629922,361.94619624,361.94619624,361.94609319,361.9461962,361.94619622,361.94619624,361.94619623,361.94619623,361.94629919,361.94619623,361.94619623,361.94629922,361.94629922,361.94619623,361.94629919,361.94619619,361.94629922,361.94629923,361.94629928,361.94619622,361.94619622,361.94619626,361.94629923,361.94629928,361.94629922,361.94629925,361.94629924,361.94629924,361.94629924,361.94619623,217.92853629,217.92853631,217.9285363,217.91067037,217.92853629,217.91067036,217.91067037,217.91067037,217.92853629,217.94640221,217.94640221,217.92853629,217.92853629,217.91067037,217.91067036,217.9464022,217.91067038,217.92853629,217.91067038,217.9285363,217.9285363,217.9285363,217.91067037,217.91067037,217.91067036,217.91067036,217.91067037,217.91067037,217.91067038,217.91067038,217.89280445,217.89280446,217.91067036,217.92853629,217.91067037,217.91067037,217.91067036,217.91067036,217.92853629,217.92853629,217.92853628,217.92853628,217.9285363,217.94640223,217.94640223,217.92853629,217.92853629,217.92853629,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,149.69857397,149.7164399,149.7164399,149.69857398,149.7164399,149.7164399,64.33519094,42.44943451,39.37649565,39.37649565,26.74528764,0,23.26143254,96.77970824,96.77970824,96.79757416,96.79757416,96.79757417,96.79757417,96.77970824,96.79757416,96.79757416,96.79757416,96.77970824,96.77970824,96.77970825,96.77970825,96.77970825,96.77970824,96.77970824,96.77970825,96.76184233,96.76184233,96.77970824,96.77970824,96.77970824,96.77970824,171.97738074,171.97738074,171.97738075,171.97738075,171.97738075,171.97738076,171.97738076,171.97738074,171.95951483,171.97738076,171.95951483,171.95951483,171.95951483,171.95951483,171.95951483,171.95951483,171.95951483,171.94164891,171.94164891,279.94640222,279.94640222,279.94640222,303.94640223,303.94640223,303.94640222,303.94640222,339.94640222,339.94640221,339.94640222,339.94640222,339.94640221,387.94640222,387.94640222,387.94640222,387.94640221,387.94640223,387.94640222,387.946402199,387.946402199,387.946402202,387.946402204,387.946402203,387.946402204,387.946402205,387.946402205,387.9464022,387.94640222,387.9464022,387.9464022,427.94640222,427.94640222,427.94640222 -361.94349027,361.94349027,361.94349027,361.94640222,361.94640222,361.94640223,361.94640224,361.94640223,361.94640222,361.94640222,361.9464022,361.94640221,361.9464022,361.94640221,361.94640221,361.94640221,361.94640221,361.94619622,361.94629921,361.94629922,361.94619624,361.94619624,361.94609319,361.9461962,361.94619622,361.94619624,361.94619623,361.94619623,361.94629919,361.94619623,361.94619623,361.94629922,361.94629922,361.94619623,361.94629919,361.94619619,361.94629922,361.94629923,361.94629928,361.94619622,361.94619622,361.94619626,361.94629923,361.94629928,361.94629922,361.94629925,361.94629924,361.94629924,361.94629924,361.94619623,217.92853629,217.92853631,217.9285363,217.91067037,217.92853629,217.91067036,217.91067037,217.91067037,217.92853629,217.94640221,217.94640221,217.92853629,217.92853629,217.91067037,217.91067036,217.9464022,217.91067038,217.92853629,217.91067038,217.9285363,217.9285363,217.9285363,217.91067037,217.91067037,217.91067036,217.91067036,217.91067037,217.91067037,217.91067038,217.91067038,217.89280445,217.89280446,217.91067036,217.92853629,217.91067037,217.91067037,217.91067036,217.91067036,217.92853629,217.92853629,217.92853628,217.92853628,217.9285363,217.94640223,217.94640223,217.92853629,217.92853629,217.92853629,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,149.69857397,149.7164399,149.7164399,149.69857398,149.7164399,149.7164399,64.33519094,42.44943451,39.37649565,39.37649565,26.74528764,23.26143254,0,96.77970824,96.77970824,96.79757416,96.79757416,96.79757417,96.79757417,96.77970824,96.79757416,96.79757416,96.79757416,96.77970824,96.77970824,96.77970825,96.77970825,96.77970825,96.77970824,96.77970824,96.77970825,96.76184233,96.76184233,96.77970824,96.77970824,96.77970824,96.77970824,171.97738074,171.97738074,171.97738075,171.97738075,171.97738075,171.97738076,171.97738076,171.97738074,171.95951483,171.97738076,171.95951483,171.95951483,171.95951483,171.95951483,171.95951483,171.95951483,171.95951483,171.94164891,171.94164891,279.94640222,279.94640222,279.94640222,303.94640223,303.94640223,303.94640222,303.94640222,339.94640222,339.94640221,339.94640222,339.94640222,339.94640221,387.94640222,387.94640222,387.94640222,387.94640221,387.94640223,387.94640222,387.946402199,387.946402199,387.946402202,387.946402204,387.946402203,387.946402204,387.946402205,387.946402205,387.9464022,387.94640222,387.9464022,387.9464022,427.94640222,427.94640222,427.94640222 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,0,17.50860514,71.05277822,71.05277822,71.05277823,71.05277823,82.71922634,82.73709226,82.73709226,82.73709226,82.71922634,82.71922634,82.71922635,82.71922635,82.71922635,82.71922634,82.71922634,82.71922635,82.70136043,82.70136043,82.71922634,82.71922634,82.71922634,82.71922634,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,17.50860514,0,71.05277822,71.05277822,71.05277823,71.05277823,82.71922634,82.73709226,82.73709226,82.73709226,82.71922634,82.71922634,82.71922635,82.71922635,82.71922635,82.71922634,82.71922634,82.71922635,82.70136043,82.70136043,82.71922634,82.71922634,82.71922634,82.71922634,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,149.73430581,149.75217174,149.75217174,149.73430582,149.75217174,149.75217174,96.81544008,96.79757417,96.79757417,96.79757417,96.81544008,96.79757416,96.79757416,71.05277822,71.05277822,0,56.52778232,56.52778233,56.52778233,82.73709226,82.75495818,82.75495818,82.75495818,82.73709226,82.73709226,82.73709227,82.73709227,82.73709227,82.73709226,82.73709226,82.73709227,82.71922635,82.71922635,82.73709226,82.73709226,82.73709226,82.73709226,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,149.73430581,149.75217174,149.75217174,149.73430582,149.75217174,149.75217174,96.81544008,96.79757417,96.79757417,96.79757417,96.81544008,96.79757416,96.79757416,71.05277822,71.05277822,56.52778232,0,37.51843959,37.51843959,82.73709226,82.75495818,82.75495818,82.75495818,82.73709226,82.73709226,82.73709227,82.73709227,82.73709227,82.73709226,82.73709226,82.73709227,82.71922635,82.71922635,82.73709226,82.73709226,82.73709226,82.73709226,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,217.96426814,217.96426816,217.96426815,217.94640222,217.96426814,217.94640221,217.94640222,217.94640222,217.96426814,217.98213406,217.98213406,217.96426814,217.96426814,217.94640222,217.94640221,217.98213405,217.94640223,217.96426814,217.94640223,217.96426815,217.96426815,217.96426815,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.92853631,217.94640221,217.96426814,217.94640222,217.94640222,217.94640221,217.94640221,217.96426814,217.96426814,217.96426813,217.96426813,217.96426815,217.98213408,217.98213408,217.96426814,217.96426814,217.96426814,217.98213407,217.98213407,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,149.73430582,149.75217175,149.75217175,149.73430583,149.75217175,149.75217175,96.81544009,96.79757418,96.79757418,96.79757418,96.81544009,96.79757417,96.79757417,71.05277823,71.05277823,56.52778233,37.51843959,0,30.83658416,82.73709227,82.75495819,82.75495819,82.75495819,82.73709227,82.73709227,82.73709228,82.73709228,82.73709228,82.73709227,82.73709227,82.73709228,82.71922636,82.71922636,82.73709227,82.73709227,82.73709227,82.73709227,172.01311259,172.01311259,172.0131126,172.0131126,172.0131126,172.01311261,172.01311261,172.01311259,171.99524668,172.01311261,171.99524668,171.99524668,171.99524668,171.99524668,171.99524668,171.99524668,171.99524668,171.97738076,171.97738076,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,217.96426814,217.96426816,217.96426815,217.94640222,217.96426814,217.94640221,217.94640222,217.94640222,217.96426814,217.98213406,217.98213406,217.96426814,217.96426814,217.94640222,217.94640221,217.98213405,217.94640223,217.96426814,217.94640223,217.96426815,217.96426815,217.96426815,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.92853631,217.94640221,217.96426814,217.94640222,217.94640222,217.94640221,217.94640221,217.96426814,217.96426814,217.96426813,217.96426813,217.96426815,217.98213408,217.98213408,217.96426814,217.96426814,217.96426814,217.98213407,217.98213407,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,149.73430582,149.75217175,149.75217175,149.73430583,149.75217175,149.75217175,96.81544009,96.79757418,96.79757418,96.79757418,96.81544009,96.79757417,96.79757417,71.05277823,71.05277823,56.52778233,37.51843959,30.83658416,0,82.73709227,82.75495819,82.75495819,82.75495819,82.73709227,82.73709227,82.73709228,82.73709228,82.73709228,82.73709227,82.73709227,82.73709228,82.71922636,82.71922636,82.73709227,82.73709227,82.73709227,82.73709227,172.01311259,172.01311259,172.0131126,172.0131126,172.0131126,172.01311261,172.01311261,172.01311259,171.99524668,172.01311261,171.99524668,171.99524668,171.99524668,171.99524668,171.99524668,171.99524668,171.99524668,171.97738076,171.97738076,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,0,55.72381576,55.72381576,55.72381576,55.70594984,55.70594984,55.70594985,55.70594985,55.70594985,55.70594984,55.70594984,55.70594985,55.68808393,55.68808393,55.70594984,55.70594984,55.70594984,55.70594984,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,149.73430581,149.75217174,149.75217174,149.73430582,149.75217174,149.75217174,96.81544008,96.79757417,96.79757417,96.79757417,96.81544008,96.79757416,96.79757416,82.73709226,82.73709226,82.75495818,82.75495818,82.75495819,82.75495819,55.72381576,0,51.84691034,51.84691034,51.82904442,51.82904442,51.82904443,51.82904443,51.82904443,51.82904442,51.82904442,51.82904443,51.81117851,51.81117851,51.82904442,51.82904442,51.82904442,51.82904442,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,149.73430581,149.75217174,149.75217174,149.73430582,149.75217174,149.75217174,96.81544008,96.79757417,96.79757417,96.79757417,96.81544008,96.79757416,96.79757416,82.73709226,82.73709226,82.75495818,82.75495818,82.75495819,82.75495819,55.72381576,51.84691034,0,33.30208162,49.57793804,49.57793804,49.57793805,49.57793805,49.57793805,49.57793804,49.57793804,49.57793805,49.56007213,49.56007213,49.57793804,49.57793804,49.57793804,49.57793804,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,149.73430581,149.75217174,149.75217174,149.73430582,149.75217174,149.75217174,96.81544008,96.79757417,96.79757417,96.79757417,96.81544008,96.79757416,96.79757416,82.73709226,82.73709226,82.75495818,82.75495818,82.75495819,82.75495819,55.72381576,51.84691034,33.30208162,0,49.57793804,49.57793804,49.57793805,49.57793805,49.57793805,49.57793804,49.57793804,49.57793805,49.56007213,49.56007213,49.57793804,49.57793804,49.57793804,49.57793804,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,0,37.3755122,48.09506639,48.09506639,48.09506639,48.09506638,48.09506638,48.09506639,48.07720047,48.07720047,48.09506638,48.09506638,48.09506638,48.09506638,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,37.3755122,0,48.09506639,48.09506639,48.09506639,48.09506638,48.09506638,48.09506639,48.07720047,48.07720047,48.09506638,48.09506638,48.09506638,48.09506638,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,149.7164399,149.73430583,149.73430583,149.71643991,149.73430583,149.73430583,96.79757417,96.77970826,96.77970826,96.77970826,96.79757417,96.77970825,96.77970825,82.71922635,82.71922635,82.73709227,82.73709227,82.73709228,82.73709228,55.70594985,51.82904443,49.57793805,49.57793805,48.09506639,48.09506639,0,18.54482872,18.54482872,34.01671857,34.01671857,34.01671858,33.99885266,33.99885266,45.16505491,45.16505491,45.16505491,45.16505491,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524669,171.99524669,171.99524667,171.97738076,171.99524669,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.95951484,171.95951484,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,149.7164399,149.73430583,149.73430583,149.71643991,149.73430583,149.73430583,96.79757417,96.77970826,96.77970826,96.77970826,96.79757417,96.77970825,96.77970825,82.71922635,82.71922635,82.73709227,82.73709227,82.73709228,82.73709228,55.70594985,51.82904443,49.57793805,49.57793805,48.09506639,48.09506639,18.54482872,0,8.79003442,34.01671857,34.01671857,34.01671858,33.99885266,33.99885266,45.16505491,45.16505491,45.16505491,45.16505491,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524669,171.99524669,171.99524667,171.97738076,171.99524669,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.95951484,171.95951484,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,149.7164399,149.73430583,149.73430583,149.71643991,149.73430583,149.73430583,96.79757417,96.77970826,96.77970826,96.77970826,96.79757417,96.77970825,96.77970825,82.71922635,82.71922635,82.73709227,82.73709227,82.73709228,82.73709228,55.70594985,51.82904443,49.57793805,49.57793805,48.09506639,48.09506639,18.54482872,8.79003442,0,34.01671857,34.01671857,34.01671858,33.99885266,33.99885266,45.16505491,45.16505491,45.16505491,45.16505491,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524669,171.99524669,171.99524667,171.97738076,171.99524669,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.95951484,171.95951484,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,48.09506638,48.09506638,34.01671857,34.01671857,34.01671857,0,17.83019176,19.54532043,19.52745451,19.52745451,45.1650549,45.1650549,45.1650549,45.1650549,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,48.09506638,48.09506638,34.01671857,34.01671857,34.01671857,17.83019176,0,19.54532043,19.52745451,19.52745451,45.1650549,45.1650549,45.1650549,45.1650549,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,149.7164399,149.73430583,149.73430583,149.71643991,149.73430583,149.73430583,96.79757417,96.77970826,96.77970826,96.77970826,96.79757417,96.77970825,96.77970825,82.71922635,82.71922635,82.73709227,82.73709227,82.73709228,82.73709228,55.70594985,51.82904443,49.57793805,49.57793805,48.09506639,48.09506639,34.01671858,34.01671858,34.01671858,19.54532043,19.54532043,0,16.27585642,16.27585642,45.16505491,45.16505491,45.16505491,45.16505491,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524669,171.99524669,171.99524667,171.97738076,171.99524669,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.95951484,171.95951484,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,149.69857398,149.71643991,149.71643991,149.69857399,149.71643991,149.71643991,96.77970825,96.76184234,96.76184234,96.76184234,96.77970825,96.76184233,96.76184233,82.70136043,82.70136043,82.71922635,82.71922635,82.71922636,82.71922636,55.68808393,51.81117851,49.56007213,49.56007213,48.07720047,48.07720047,33.99885266,33.99885266,33.99885266,19.52745451,19.52745451,16.27585642,0,7.68234716,45.14718899,45.14718899,45.14718899,45.14718899,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738077,171.97738077,171.97738075,171.95951484,171.97738077,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.94164892,171.94164892,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 -361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,149.69857398,149.71643991,149.71643991,149.69857399,149.71643991,149.71643991,96.77970825,96.76184234,96.76184234,96.76184234,96.77970825,96.76184233,96.76184233,82.70136043,82.70136043,82.71922635,82.71922635,82.71922636,82.71922636,55.68808393,51.81117851,49.56007213,49.56007213,48.07720047,48.07720047,33.99885266,33.99885266,33.99885266,19.52745451,19.52745451,16.27585642,7.68234716,0,45.14718899,45.14718899,45.14718899,45.14718899,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738077,171.97738077,171.97738075,171.95951484,171.97738077,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.94164892,171.94164892,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,48.09506638,48.09506638,45.16505491,45.16505491,45.16505491,45.1650549,45.1650549,45.16505491,45.14718899,45.14718899,0,32.80183576,32.80183576,32.80183576,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,48.09506638,48.09506638,45.16505491,45.16505491,45.16505491,45.1650549,45.1650549,45.16505491,45.14718899,45.14718899,32.80183576,0,21.51057204,21.51057204,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,48.09506638,48.09506638,45.16505491,45.16505491,45.16505491,45.1650549,45.1650549,45.16505491,45.14718899,45.14718899,32.80183576,21.51057204,0,16.40091788,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,48.09506638,48.09506638,45.16505491,45.16505491,45.16505491,45.1650549,45.1650549,45.16505491,45.14718899,45.14718899,32.80183576,21.51057204,16.40091788,0,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,171.99524665,172.01311258,172.01311258,171.99524666,172.01311258,172.01311258,171.99524666,171.97738075,171.97738075,171.97738075,171.99524666,171.97738074,171.97738074,171.99524666,171.99524666,172.01311258,172.01311258,172.01311259,172.01311259,171.99524666,172.01311258,172.01311258,172.01311258,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524666,171.99524666,171.99524667,171.97738075,171.97738075,171.99524666,171.99524666,171.99524666,171.99524666,0,76.3232257,159.86428453,159.86428453,159.86428453,159.86428454,159.86428454,159.86428452,159.84641861,159.86428454,159.84641861,159.84641861,159.84641861,159.84641861,159.84641861,159.84641861,159.84641861,159.82855269,159.82855269,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,171.99524665,172.01311258,172.01311258,171.99524666,172.01311258,172.01311258,171.99524666,171.97738075,171.97738075,171.97738075,171.99524666,171.97738074,171.97738074,171.99524666,171.99524666,172.01311258,172.01311258,172.01311259,172.01311259,171.99524666,172.01311258,172.01311258,172.01311258,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524666,171.99524666,171.99524667,171.97738075,171.97738075,171.99524666,171.99524666,171.99524666,171.99524666,76.3232257,0,159.86428453,159.86428453,159.86428453,159.86428454,159.86428454,159.86428452,159.84641861,159.86428454,159.84641861,159.84641861,159.84641861,159.84641861,159.84641861,159.84641861,159.84641861,159.82855269,159.82855269,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,217.96426814,217.96426816,217.96426815,217.94640222,217.96426814,217.94640221,217.94640222,217.94640222,217.96426814,217.98213406,217.98213406,217.96426814,217.96426814,217.94640222,217.94640221,217.98213405,217.94640223,217.96426814,217.94640223,217.96426815,217.96426815,217.96426815,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.92853631,217.94640221,217.96426814,217.94640222,217.94640222,217.94640221,217.94640221,217.96426814,217.96426814,217.96426813,217.96426813,217.96426815,217.98213408,217.98213408,217.96426814,217.96426814,217.96426814,217.98213407,217.98213407,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,171.99524666,172.01311259,172.01311259,171.99524667,172.01311259,172.01311259,171.99524667,171.97738076,171.97738076,171.97738076,171.99524667,171.97738075,171.97738075,171.99524667,171.99524667,172.01311259,172.01311259,172.0131126,172.0131126,171.99524667,172.01311259,172.01311259,172.01311259,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524667,171.99524667,171.99524668,171.97738076,171.97738076,171.99524667,171.99524667,171.99524667,171.99524667,159.86428453,159.86428453,0,155.2191444,155.2191444,155.21914441,155.21914441,155.21914439,155.20127848,155.21914441,155.20127848,155.20127848,155.20127848,155.20127848,155.20127848,155.20127848,155.20127848,155.18341256,155.18341256,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,217.96426814,217.96426816,217.96426815,217.94640222,217.96426814,217.94640221,217.94640222,217.94640222,217.96426814,217.98213406,217.98213406,217.96426814,217.96426814,217.94640222,217.94640221,217.98213405,217.94640223,217.96426814,217.94640223,217.96426815,217.96426815,217.96426815,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.92853631,217.94640221,217.96426814,217.94640222,217.94640222,217.94640221,217.94640221,217.96426814,217.96426814,217.96426813,217.96426813,217.96426815,217.98213408,217.98213408,217.96426814,217.96426814,217.96426814,217.98213407,217.98213407,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,171.99524666,172.01311259,172.01311259,171.99524667,172.01311259,172.01311259,171.99524667,171.97738076,171.97738076,171.97738076,171.99524667,171.97738075,171.97738075,171.99524667,171.99524667,172.01311259,172.01311259,172.0131126,172.0131126,171.99524667,172.01311259,172.01311259,172.01311259,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524667,171.99524667,171.99524668,171.97738076,171.97738076,171.99524667,171.99524667,171.99524667,171.99524667,159.86428453,159.86428453,155.2191444,0,108.44615636,108.44615637,108.44615637,149.50204883,149.48418292,149.50204885,149.48418292,149.48418292,149.48418292,149.48418292,149.48418292,149.48418292,149.48418292,149.466317,149.466317,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,217.96426814,217.96426816,217.96426815,217.94640222,217.96426814,217.94640221,217.94640222,217.94640222,217.96426814,217.98213406,217.98213406,217.96426814,217.96426814,217.94640222,217.94640221,217.98213405,217.94640223,217.96426814,217.94640223,217.96426815,217.96426815,217.96426815,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.92853631,217.94640221,217.96426814,217.94640222,217.94640222,217.94640221,217.94640221,217.96426814,217.96426814,217.96426813,217.96426813,217.96426815,217.98213408,217.98213408,217.96426814,217.96426814,217.96426814,217.98213407,217.98213407,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,171.99524666,172.01311259,172.01311259,171.99524667,172.01311259,172.01311259,171.99524667,171.97738076,171.97738076,171.97738076,171.99524667,171.97738075,171.97738075,171.99524667,171.99524667,172.01311259,172.01311259,172.0131126,172.0131126,171.99524667,172.01311259,172.01311259,172.01311259,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524667,171.99524667,171.99524668,171.97738076,171.97738076,171.99524667,171.99524667,171.99524667,171.99524667,159.86428453,159.86428453,155.2191444,108.44615636,0,76.71627601,76.71627601,149.50204883,149.48418292,149.50204885,149.48418292,149.48418292,149.48418292,149.48418292,149.48418292,149.48418292,149.48418292,149.466317,149.466317,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,217.96426815,217.96426817,217.96426816,217.94640223,217.96426815,217.94640222,217.94640223,217.94640223,217.96426815,217.98213407,217.98213407,217.96426815,217.96426815,217.94640223,217.94640222,217.98213406,217.94640224,217.96426815,217.94640224,217.96426816,217.96426816,217.96426816,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.94640223,217.94640224,217.94640224,217.92853631,217.92853632,217.94640222,217.96426815,217.94640223,217.94640223,217.94640222,217.94640222,217.96426815,217.96426815,217.96426814,217.96426814,217.96426816,217.98213409,217.98213409,217.96426815,217.96426815,217.96426815,217.98213408,217.98213408,217.98213408,217.98213408,217.98213408,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,171.99524667,172.0131126,172.0131126,171.99524668,172.0131126,172.0131126,171.99524668,171.97738077,171.97738077,171.97738077,171.99524668,171.97738076,171.97738076,171.99524668,171.99524668,172.0131126,172.0131126,172.01311261,172.01311261,171.99524668,172.0131126,172.0131126,172.0131126,171.99524668,171.99524668,171.99524669,171.99524669,171.99524669,171.99524668,171.99524668,171.99524669,171.97738077,171.97738077,171.99524668,171.99524668,171.99524668,171.99524668,159.86428454,159.86428454,155.21914441,108.44615637,76.71627601,0,59.74364858,149.50204884,149.48418293,149.50204886,149.48418293,149.48418293,149.48418293,149.48418293,149.48418293,149.48418293,149.48418293,149.46631701,149.46631701,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,217.96426815,217.96426817,217.96426816,217.94640223,217.96426815,217.94640222,217.94640223,217.94640223,217.96426815,217.98213407,217.98213407,217.96426815,217.96426815,217.94640223,217.94640222,217.98213406,217.94640224,217.96426815,217.94640224,217.96426816,217.96426816,217.96426816,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.94640223,217.94640224,217.94640224,217.92853631,217.92853632,217.94640222,217.96426815,217.94640223,217.94640223,217.94640222,217.94640222,217.96426815,217.96426815,217.96426814,217.96426814,217.96426816,217.98213409,217.98213409,217.96426815,217.96426815,217.96426815,217.98213408,217.98213408,217.98213408,217.98213408,217.98213408,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,171.99524667,172.0131126,172.0131126,171.99524668,172.0131126,172.0131126,171.99524668,171.97738077,171.97738077,171.97738077,171.99524668,171.97738076,171.97738076,171.99524668,171.99524668,172.0131126,172.0131126,172.01311261,172.01311261,171.99524668,172.0131126,172.0131126,172.0131126,171.99524668,171.99524668,171.99524669,171.99524669,171.99524669,171.99524668,171.99524668,171.99524669,171.97738077,171.97738077,171.99524668,171.99524668,171.99524668,171.99524668,159.86428454,159.86428454,155.21914441,108.44615637,76.71627601,59.74364858,0,149.50204884,149.48418293,149.50204886,149.48418293,149.48418293,149.48418293,149.48418293,149.48418293,149.48418293,149.48418293,149.46631701,149.46631701,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,171.99524665,172.01311258,172.01311258,171.99524666,172.01311258,172.01311258,171.99524666,171.97738075,171.97738075,171.97738075,171.99524666,171.97738074,171.97738074,171.99524666,171.99524666,172.01311258,172.01311258,172.01311259,172.01311259,171.99524666,172.01311258,172.01311258,172.01311258,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524666,171.99524666,171.99524667,171.97738075,171.97738075,171.99524666,171.99524666,171.99524666,171.99524666,159.86428452,159.86428452,155.21914439,149.50204883,149.50204883,149.50204884,149.50204884,0,131.86838223,131.88624816,131.86838223,131.86838223,131.86838223,131.86838223,131.86838223,131.86838223,131.86838223,131.85051631,131.85051631,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,0,99.92411081,99.90624488,99.90624488,99.90624488,99.90624488,99.90624488,99.90624488,99.90624488,99.88837896,99.88837896,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,217.96426815,217.96426817,217.96426816,217.94640223,217.96426815,217.94640222,217.94640223,217.94640223,217.96426815,217.98213407,217.98213407,217.96426815,217.96426815,217.94640223,217.94640222,217.98213406,217.94640224,217.96426815,217.94640224,217.96426816,217.96426816,217.96426816,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.94640223,217.94640224,217.94640224,217.92853631,217.92853632,217.94640222,217.96426815,217.94640223,217.94640223,217.94640222,217.94640222,217.96426815,217.96426815,217.96426814,217.96426814,217.96426816,217.98213409,217.98213409,217.96426815,217.96426815,217.96426815,217.98213408,217.98213408,217.98213408,217.98213408,217.98213408,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,171.99524667,172.0131126,172.0131126,171.99524668,172.0131126,172.0131126,171.99524668,171.97738077,171.97738077,171.97738077,171.99524668,171.97738076,171.97738076,171.99524668,171.99524668,172.0131126,172.0131126,172.01311261,172.01311261,171.99524668,172.0131126,172.0131126,172.0131126,171.99524668,171.99524668,171.99524669,171.99524669,171.99524669,171.99524668,171.99524668,171.99524669,171.97738077,171.97738077,171.99524668,171.99524668,171.99524668,171.99524668,159.86428454,159.86428454,155.21914441,149.50204885,149.50204885,149.50204886,149.50204886,131.88624816,99.92411081,0,71.05277823,71.05277823,71.05277823,71.05277823,71.05277823,71.05277823,71.05277823,71.03491231,71.03491231,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,0,57.88559252,65.06769382,65.06769382,65.06769382,65.06769382,65.06769382,65.0498279,65.0498279,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,57.88559252,0,65.06769382,65.06769382,65.06769382,65.06769382,65.06769382,65.0498279,65.0498279,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,65.06769382,65.06769382,0,55.70594984,55.70594984,55.70594984,55.70594984,55.68808392,55.68808392,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,65.06769382,65.06769382,55.70594984,0,36.8395345,36.8395345,46.34420586,46.32633994,46.32633994,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,65.06769382,65.06769382,55.70594984,36.8395345,0,31.33683002,46.34420586,46.32633994,46.32633994,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,65.06769382,65.06769382,55.70594984,36.8395345,31.33683002,0,46.34420586,46.32633994,46.32633994,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,65.06769382,65.06769382,55.70594984,46.34420586,46.34420586,46.34420586,0,40.28765776,40.28765776,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 -361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,171.95951482,171.97738075,171.97738075,171.95951483,171.97738075,171.97738075,171.95951483,171.94164892,171.94164892,171.94164892,171.95951483,171.94164891,171.94164891,171.95951483,171.95951483,171.97738075,171.97738075,171.97738076,171.97738076,171.95951483,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,171.95951484,171.95951484,171.95951484,171.95951483,171.95951483,171.95951484,171.94164892,171.94164892,171.95951483,171.95951483,171.95951483,171.95951483,159.82855269,159.82855269,155.18341256,149.466317,149.466317,149.46631701,149.46631701,131.85051631,99.88837896,71.03491231,65.0498279,65.0498279,55.68808392,46.32633994,46.32633994,46.32633994,40.28765776,0,35.44599246,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 -361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,171.95951482,171.97738075,171.97738075,171.95951483,171.97738075,171.97738075,171.95951483,171.94164892,171.94164892,171.94164892,171.95951483,171.94164891,171.94164891,171.95951483,171.95951483,171.97738075,171.97738075,171.97738076,171.97738076,171.95951483,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,171.95951484,171.95951484,171.95951484,171.95951483,171.95951483,171.95951484,171.94164892,171.94164892,171.95951483,171.95951483,171.95951483,171.95951483,159.82855269,159.82855269,155.18341256,149.466317,149.466317,149.46631701,149.46631701,131.85051631,99.88837896,71.03491231,65.0498279,65.0498279,55.68808392,46.32633994,46.32633994,46.32633994,40.28765776,35.44599246,0,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,279.98213407,279.98213409,279.98213408,279.96426815,279.98213407,279.96426814,279.96426815,279.96426815,279.98213407,279.99999999,279.99999999,279.98213407,279.98213407,279.96426815,279.96426814,279.99999998,279.96426816,279.98213407,279.96426816,279.98213408,279.98213408,279.98213408,279.96426815,279.96426815,279.96426814,279.96426814,279.96426815,279.96426815,279.96426816,279.96426816,279.94640223,279.94640224,279.96426814,279.98213407,279.96426815,279.96426815,279.96426814,279.96426814,279.98213407,279.98213407,279.98213406,279.98213406,279.98213408,280.00000001,280.00000001,279.98213407,279.98213407,279.98213407,280,280,280,280,280,279.98213408,279.98213408,279.98213408,279.98213408,279.98213408,279.96426813,279.98213406,279.98213406,279.96426814,279.98213406,279.98213406,279.96426814,279.94640223,279.94640223,279.94640223,279.96426814,279.94640222,279.94640222,279.96426814,279.96426814,279.98213406,279.98213406,279.98213407,279.98213407,279.96426814,279.98213406,279.98213406,279.98213406,279.96426814,279.96426814,279.96426815,279.96426815,279.96426815,279.96426814,279.96426814,279.96426815,279.94640223,279.94640223,279.96426814,279.96426814,279.96426814,279.96426814,279.98213406,279.98213406,279.98213407,279.98213407,279.98213407,279.98213408,279.98213408,279.98213406,279.96426815,279.98213408,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.94640223,279.94640223,0,5.48102564,13.36,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,279.98213407,279.98213409,279.98213408,279.96426815,279.98213407,279.96426814,279.96426815,279.96426815,279.98213407,279.99999999,279.99999999,279.98213407,279.98213407,279.96426815,279.96426814,279.99999998,279.96426816,279.98213407,279.96426816,279.98213408,279.98213408,279.98213408,279.96426815,279.96426815,279.96426814,279.96426814,279.96426815,279.96426815,279.96426816,279.96426816,279.94640223,279.94640224,279.96426814,279.98213407,279.96426815,279.96426815,279.96426814,279.96426814,279.98213407,279.98213407,279.98213406,279.98213406,279.98213408,280.00000001,280.00000001,279.98213407,279.98213407,279.98213407,280,280,280,280,280,279.98213408,279.98213408,279.98213408,279.98213408,279.98213408,279.96426813,279.98213406,279.98213406,279.96426814,279.98213406,279.98213406,279.96426814,279.94640223,279.94640223,279.94640223,279.96426814,279.94640222,279.94640222,279.96426814,279.96426814,279.98213406,279.98213406,279.98213407,279.98213407,279.96426814,279.98213406,279.98213406,279.98213406,279.96426814,279.96426814,279.96426815,279.96426815,279.96426815,279.96426814,279.96426814,279.96426815,279.94640223,279.94640223,279.96426814,279.96426814,279.96426814,279.96426814,279.98213406,279.98213406,279.98213407,279.98213407,279.98213407,279.98213408,279.98213408,279.98213406,279.96426815,279.98213408,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.94640223,279.94640223,5.48102564,0,13.36,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,279.98213407,279.98213409,279.98213408,279.96426815,279.98213407,279.96426814,279.96426815,279.96426815,279.98213407,279.99999999,279.99999999,279.98213407,279.98213407,279.96426815,279.96426814,279.99999998,279.96426816,279.98213407,279.96426816,279.98213408,279.98213408,279.98213408,279.96426815,279.96426815,279.96426814,279.96426814,279.96426815,279.96426815,279.96426816,279.96426816,279.94640223,279.94640224,279.96426814,279.98213407,279.96426815,279.96426815,279.96426814,279.96426814,279.98213407,279.98213407,279.98213406,279.98213406,279.98213408,280.00000001,280.00000001,279.98213407,279.98213407,279.98213407,280,280,280,280,280,279.98213408,279.98213408,279.98213408,279.98213408,279.98213408,279.96426813,279.98213406,279.98213406,279.96426814,279.98213406,279.98213406,279.96426814,279.94640223,279.94640223,279.94640223,279.96426814,279.94640222,279.94640222,279.96426814,279.96426814,279.98213406,279.98213406,279.98213407,279.98213407,279.96426814,279.98213406,279.98213406,279.98213406,279.96426814,279.96426814,279.96426815,279.96426815,279.96426815,279.96426814,279.96426814,279.96426815,279.94640223,279.94640223,279.96426814,279.96426814,279.96426814,279.96426814,279.98213406,279.98213406,279.98213407,279.98213407,279.98213407,279.98213408,279.98213408,279.98213406,279.96426815,279.98213408,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.94640223,279.94640223,13.36,13.36,0,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.99708806,361.99708806,361.99708806,362.00000001,362.00000001,362.00000002,362.00000003,362.00000002,362.00000001,362.00000001,361.99999999,362,361.99999999,362,362,362,362,361.99979401,361.999897,361.99989701,361.99979403,361.99979403,361.99969098,361.99979399,361.99979401,361.99979403,361.99979402,361.99979402,361.99989698,361.99979402,361.99979402,361.99989701,361.99989701,361.99979402,361.99989698,361.99979398,361.99989701,361.99989702,361.99989707,361.99979401,361.99979401,361.99979405,361.99989702,361.99989707,361.99989701,361.99989704,361.99989703,361.99989703,361.99989703,361.99979402,303.98213408,303.9821341,303.98213409,303.96426816,303.98213408,303.96426815,303.96426816,303.96426816,303.98213408,304,304,303.98213408,303.98213408,303.96426816,303.96426815,303.99999999,303.96426817,303.98213408,303.96426817,303.98213409,303.98213409,303.98213409,303.96426816,303.96426816,303.96426815,303.96426815,303.96426816,303.96426816,303.96426817,303.96426817,303.94640224,303.94640225,303.96426815,303.98213408,303.96426816,303.96426816,303.96426815,303.96426815,303.98213408,303.98213408,303.98213407,303.98213407,303.98213409,304.00000002,304.00000002,303.98213408,303.98213408,303.98213408,304.00000001,304.00000001,304.00000001,304.00000001,304.00000001,303.98213409,303.98213409,303.98213409,303.98213409,303.98213409,303.96426814,303.98213407,303.98213407,303.96426815,303.98213407,303.98213407,303.96426815,303.94640224,303.94640224,303.94640224,303.96426815,303.94640223,303.94640223,303.96426815,303.96426815,303.98213407,303.98213407,303.98213408,303.98213408,303.96426815,303.98213407,303.98213407,303.98213407,303.96426815,303.96426815,303.96426816,303.96426816,303.96426816,303.96426815,303.96426815,303.96426816,303.94640224,303.94640224,303.96426815,303.96426815,303.96426815,303.96426815,303.98213407,303.98213407,303.98213408,303.98213408,303.98213408,303.98213409,303.98213409,303.98213407,303.96426816,303.98213409,303.96426816,303.96426816,303.96426816,303.96426816,303.96426816,303.96426816,303.96426816,303.94640224,303.94640224,304.00000001,304.00000001,304.00000001,0,3.52412122,15.03807123,17.32000001,340.00000001,340,340.00000001,340.00000001,340,388.00000001,388.00000001,388.00000001,388,388.00000002,388.00000001,387.999999989,387.999999989,387.999999992,387.999999994,387.999999993,387.999999994,387.999999995,387.999999995,387.99999999,388.00000001,387.99999999,387.99999999,428.00000001,428.00000001,428.00000001 -361.99708806,361.99708806,361.99708806,362.00000001,362.00000001,362.00000002,362.00000003,362.00000002,362.00000001,362.00000001,361.99999999,362,361.99999999,362,362,362,362,361.99979401,361.999897,361.99989701,361.99979403,361.99979403,361.99969098,361.99979399,361.99979401,361.99979403,361.99979402,361.99979402,361.99989698,361.99979402,361.99979402,361.99989701,361.99989701,361.99979402,361.99989698,361.99979398,361.99989701,361.99989702,361.99989707,361.99979401,361.99979401,361.99979405,361.99989702,361.99989707,361.99989701,361.99989704,361.99989703,361.99989703,361.99989703,361.99979402,303.98213408,303.9821341,303.98213409,303.96426816,303.98213408,303.96426815,303.96426816,303.96426816,303.98213408,304,304,303.98213408,303.98213408,303.96426816,303.96426815,303.99999999,303.96426817,303.98213408,303.96426817,303.98213409,303.98213409,303.98213409,303.96426816,303.96426816,303.96426815,303.96426815,303.96426816,303.96426816,303.96426817,303.96426817,303.94640224,303.94640225,303.96426815,303.98213408,303.96426816,303.96426816,303.96426815,303.96426815,303.98213408,303.98213408,303.98213407,303.98213407,303.98213409,304.00000002,304.00000002,303.98213408,303.98213408,303.98213408,304.00000001,304.00000001,304.00000001,304.00000001,304.00000001,303.98213409,303.98213409,303.98213409,303.98213409,303.98213409,303.96426814,303.98213407,303.98213407,303.96426815,303.98213407,303.98213407,303.96426815,303.94640224,303.94640224,303.94640224,303.96426815,303.94640223,303.94640223,303.96426815,303.96426815,303.98213407,303.98213407,303.98213408,303.98213408,303.96426815,303.98213407,303.98213407,303.98213407,303.96426815,303.96426815,303.96426816,303.96426816,303.96426816,303.96426815,303.96426815,303.96426816,303.94640224,303.94640224,303.96426815,303.96426815,303.96426815,303.96426815,303.98213407,303.98213407,303.98213408,303.98213408,303.98213408,303.98213409,303.98213409,303.98213407,303.96426816,303.98213409,303.96426816,303.96426816,303.96426816,303.96426816,303.96426816,303.96426816,303.96426816,303.94640224,303.94640224,304.00000001,304.00000001,304.00000001,3.52412122,0,15.03807123,17.32000001,340.00000001,340,340.00000001,340.00000001,340,388.00000001,388.00000001,388.00000001,388,388.00000002,388.00000001,387.999999989,387.999999989,387.999999992,387.999999994,387.999999993,387.999999994,387.999999995,387.999999995,387.99999999,388.00000001,387.99999999,387.99999999,428.00000001,428.00000001,428.00000001 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,303.98213407,303.98213409,303.98213408,303.96426815,303.98213407,303.96426814,303.96426815,303.96426815,303.98213407,303.99999999,303.99999999,303.98213407,303.98213407,303.96426815,303.96426814,303.99999998,303.96426816,303.98213407,303.96426816,303.98213408,303.98213408,303.98213408,303.96426815,303.96426815,303.96426814,303.96426814,303.96426815,303.96426815,303.96426816,303.96426816,303.94640223,303.94640224,303.96426814,303.98213407,303.96426815,303.96426815,303.96426814,303.96426814,303.98213407,303.98213407,303.98213406,303.98213406,303.98213408,304.00000001,304.00000001,303.98213407,303.98213407,303.98213407,304,304,304,304,304,303.98213408,303.98213408,303.98213408,303.98213408,303.98213408,303.96426813,303.98213406,303.98213406,303.96426814,303.98213406,303.98213406,303.96426814,303.94640223,303.94640223,303.94640223,303.96426814,303.94640222,303.94640222,303.96426814,303.96426814,303.98213406,303.98213406,303.98213407,303.98213407,303.96426814,303.98213406,303.98213406,303.98213406,303.96426814,303.96426814,303.96426815,303.96426815,303.96426815,303.96426814,303.96426814,303.96426815,303.94640223,303.94640223,303.96426814,303.96426814,303.96426814,303.96426814,303.98213406,303.98213406,303.98213407,303.98213407,303.98213407,303.98213408,303.98213408,303.98213406,303.96426815,303.98213408,303.96426815,303.96426815,303.96426815,303.96426815,303.96426815,303.96426815,303.96426815,303.94640223,303.94640223,304,304,304,15.03807123,15.03807123,0,17.32,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,303.98213407,303.98213409,303.98213408,303.96426815,303.98213407,303.96426814,303.96426815,303.96426815,303.98213407,303.99999999,303.99999999,303.98213407,303.98213407,303.96426815,303.96426814,303.99999998,303.96426816,303.98213407,303.96426816,303.98213408,303.98213408,303.98213408,303.96426815,303.96426815,303.96426814,303.96426814,303.96426815,303.96426815,303.96426816,303.96426816,303.94640223,303.94640224,303.96426814,303.98213407,303.96426815,303.96426815,303.96426814,303.96426814,303.98213407,303.98213407,303.98213406,303.98213406,303.98213408,304.00000001,304.00000001,303.98213407,303.98213407,303.98213407,304,304,304,304,304,303.98213408,303.98213408,303.98213408,303.98213408,303.98213408,303.96426813,303.98213406,303.98213406,303.96426814,303.98213406,303.98213406,303.96426814,303.94640223,303.94640223,303.94640223,303.96426814,303.94640222,303.94640222,303.96426814,303.96426814,303.98213406,303.98213406,303.98213407,303.98213407,303.96426814,303.98213406,303.98213406,303.98213406,303.96426814,303.96426814,303.96426815,303.96426815,303.96426815,303.96426814,303.96426814,303.96426815,303.94640223,303.94640223,303.96426814,303.96426814,303.96426814,303.96426814,303.98213406,303.98213406,303.98213407,303.98213407,303.98213407,303.98213408,303.98213408,303.98213406,303.96426815,303.98213408,303.96426815,303.96426815,303.96426815,303.96426815,303.96426815,303.96426815,303.96426815,303.94640223,303.94640223,304,304,304,17.32000001,17.32000001,17.32,0,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,339.98213407,339.98213409,339.98213408,339.96426815,339.98213407,339.96426814,339.96426815,339.96426815,339.98213407,339.99999999,339.99999999,339.98213407,339.98213407,339.96426815,339.96426814,339.99999998,339.96426816,339.98213407,339.96426816,339.98213408,339.98213408,339.98213408,339.96426815,339.96426815,339.96426814,339.96426814,339.96426815,339.96426815,339.96426816,339.96426816,339.94640223,339.94640224,339.96426814,339.98213407,339.96426815,339.96426815,339.96426814,339.96426814,339.98213407,339.98213407,339.98213406,339.98213406,339.98213408,340.00000001,340.00000001,339.98213407,339.98213407,339.98213407,340,340,340,340,340,339.98213408,339.98213408,339.98213408,339.98213408,339.98213408,339.96426813,339.98213406,339.98213406,339.96426814,339.98213406,339.98213406,339.96426814,339.94640223,339.94640223,339.94640223,339.96426814,339.94640222,339.94640222,339.96426814,339.96426814,339.98213406,339.98213406,339.98213407,339.98213407,339.96426814,339.98213406,339.98213406,339.98213406,339.96426814,339.96426814,339.96426815,339.96426815,339.96426815,339.96426814,339.96426814,339.96426815,339.94640223,339.94640223,339.96426814,339.96426814,339.96426814,339.96426814,339.98213406,339.98213406,339.98213407,339.98213407,339.98213407,339.98213408,339.98213408,339.98213406,339.96426815,339.98213408,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.94640223,339.94640223,340,340,340,340.00000001,340.00000001,340,340,0,291.99999999,292,292,291.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.99708804,361.99708804,361.99708804,361.99999999,361.99999999,362,362.00000001,362,361.99999999,361.99999999,361.99999997,361.99999998,361.99999997,361.99999998,361.99999998,361.99999998,361.99999998,361.99979399,361.99989698,361.99989699,361.99979401,361.99979401,361.99969096,361.99979397,361.99979399,361.99979401,361.999794,361.999794,361.99989696,361.999794,361.999794,361.99989699,361.99989699,361.999794,361.99989696,361.99979396,361.99989699,361.999897,361.99989705,361.99979399,361.99979399,361.99979403,361.999897,361.99989705,361.99989699,361.99989702,361.99989701,361.99989701,361.99989701,361.999794,339.98213406,339.98213408,339.98213407,339.96426814,339.98213406,339.96426813,339.96426814,339.96426814,339.98213406,339.99999998,339.99999998,339.98213406,339.98213406,339.96426814,339.96426813,339.99999997,339.96426815,339.98213406,339.96426815,339.98213407,339.98213407,339.98213407,339.96426814,339.96426814,339.96426813,339.96426813,339.96426814,339.96426814,339.96426815,339.96426815,339.94640222,339.94640223,339.96426813,339.98213406,339.96426814,339.96426814,339.96426813,339.96426813,339.98213406,339.98213406,339.98213405,339.98213405,339.98213407,340,340,339.98213406,339.98213406,339.98213406,339.99999999,339.99999999,339.99999999,339.99999999,339.99999999,339.98213407,339.98213407,339.98213407,339.98213407,339.98213407,339.96426812,339.98213405,339.98213405,339.96426813,339.98213405,339.98213405,339.96426813,339.94640222,339.94640222,339.94640222,339.96426813,339.94640221,339.94640221,339.96426813,339.96426813,339.98213405,339.98213405,339.98213406,339.98213406,339.96426813,339.98213405,339.98213405,339.98213405,339.96426813,339.96426813,339.96426814,339.96426814,339.96426814,339.96426813,339.96426813,339.96426814,339.94640222,339.94640222,339.96426813,339.96426813,339.96426813,339.96426813,339.98213405,339.98213405,339.98213406,339.98213406,339.98213406,339.98213407,339.98213407,339.98213405,339.96426814,339.98213407,339.96426814,339.96426814,339.96426814,339.96426814,339.96426814,339.96426814,339.96426814,339.94640222,339.94640222,339.99999999,339.99999999,339.99999999,340,340,339.99999999,339.99999999,291.99999999,0,141.98414961,150.30016873,169.00799226,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,339.98213407,339.98213409,339.98213408,339.96426815,339.98213407,339.96426814,339.96426815,339.96426815,339.98213407,339.99999999,339.99999999,339.98213407,339.98213407,339.96426815,339.96426814,339.99999998,339.96426816,339.98213407,339.96426816,339.98213408,339.98213408,339.98213408,339.96426815,339.96426815,339.96426814,339.96426814,339.96426815,339.96426815,339.96426816,339.96426816,339.94640223,339.94640224,339.96426814,339.98213407,339.96426815,339.96426815,339.96426814,339.96426814,339.98213407,339.98213407,339.98213406,339.98213406,339.98213408,340.00000001,340.00000001,339.98213407,339.98213407,339.98213407,340,340,340,340,340,339.98213408,339.98213408,339.98213408,339.98213408,339.98213408,339.96426813,339.98213406,339.98213406,339.96426814,339.98213406,339.98213406,339.96426814,339.94640223,339.94640223,339.94640223,339.96426814,339.94640222,339.94640222,339.96426814,339.96426814,339.98213406,339.98213406,339.98213407,339.98213407,339.96426814,339.98213406,339.98213406,339.98213406,339.96426814,339.96426814,339.96426815,339.96426815,339.96426815,339.96426814,339.96426814,339.96426815,339.94640223,339.94640223,339.96426814,339.96426814,339.96426814,339.96426814,339.98213406,339.98213406,339.98213407,339.98213407,339.98213407,339.98213408,339.98213408,339.98213406,339.96426815,339.98213408,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.94640223,339.94640223,340,340,340,340.00000001,340.00000001,340,340,292,141.98414961,0,150.30016874,169.00799227,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,339.98213407,339.98213409,339.98213408,339.96426815,339.98213407,339.96426814,339.96426815,339.96426815,339.98213407,339.99999999,339.99999999,339.98213407,339.98213407,339.96426815,339.96426814,339.99999998,339.96426816,339.98213407,339.96426816,339.98213408,339.98213408,339.98213408,339.96426815,339.96426815,339.96426814,339.96426814,339.96426815,339.96426815,339.96426816,339.96426816,339.94640223,339.94640224,339.96426814,339.98213407,339.96426815,339.96426815,339.96426814,339.96426814,339.98213407,339.98213407,339.98213406,339.98213406,339.98213408,340.00000001,340.00000001,339.98213407,339.98213407,339.98213407,340,340,340,340,340,339.98213408,339.98213408,339.98213408,339.98213408,339.98213408,339.96426813,339.98213406,339.98213406,339.96426814,339.98213406,339.98213406,339.96426814,339.94640223,339.94640223,339.94640223,339.96426814,339.94640222,339.94640222,339.96426814,339.96426814,339.98213406,339.98213406,339.98213407,339.98213407,339.96426814,339.98213406,339.98213406,339.98213406,339.96426814,339.96426814,339.96426815,339.96426815,339.96426815,339.96426814,339.96426814,339.96426815,339.94640223,339.94640223,339.96426814,339.96426814,339.96426814,339.96426814,339.98213406,339.98213406,339.98213407,339.98213407,339.98213407,339.98213408,339.98213408,339.98213406,339.96426815,339.98213408,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.94640223,339.94640223,340,340,340,340.00000001,340.00000001,340,340,292,150.30016873,150.30016874,0,169.00799227,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 -361.99708804,361.99708804,361.99708804,361.99999999,361.99999999,362,362.00000001,362,361.99999999,361.99999999,361.99999997,361.99999998,361.99999997,361.99999998,361.99999998,361.99999998,361.99999998,361.99979399,361.99989698,361.99989699,361.99979401,361.99979401,361.99969096,361.99979397,361.99979399,361.99979401,361.999794,361.999794,361.99989696,361.999794,361.999794,361.99989699,361.99989699,361.999794,361.99989696,361.99979396,361.99989699,361.999897,361.99989705,361.99979399,361.99979399,361.99979403,361.999897,361.99989705,361.99989699,361.99989702,361.99989701,361.99989701,361.99989701,361.999794,339.98213406,339.98213408,339.98213407,339.96426814,339.98213406,339.96426813,339.96426814,339.96426814,339.98213406,339.99999998,339.99999998,339.98213406,339.98213406,339.96426814,339.96426813,339.99999997,339.96426815,339.98213406,339.96426815,339.98213407,339.98213407,339.98213407,339.96426814,339.96426814,339.96426813,339.96426813,339.96426814,339.96426814,339.96426815,339.96426815,339.94640222,339.94640223,339.96426813,339.98213406,339.96426814,339.96426814,339.96426813,339.96426813,339.98213406,339.98213406,339.98213405,339.98213405,339.98213407,340,340,339.98213406,339.98213406,339.98213406,339.99999999,339.99999999,339.99999999,339.99999999,339.99999999,339.98213407,339.98213407,339.98213407,339.98213407,339.98213407,339.96426812,339.98213405,339.98213405,339.96426813,339.98213405,339.98213405,339.96426813,339.94640222,339.94640222,339.94640222,339.96426813,339.94640221,339.94640221,339.96426813,339.96426813,339.98213405,339.98213405,339.98213406,339.98213406,339.96426813,339.98213405,339.98213405,339.98213405,339.96426813,339.96426813,339.96426814,339.96426814,339.96426814,339.96426813,339.96426813,339.96426814,339.94640222,339.94640222,339.96426813,339.96426813,339.96426813,339.96426813,339.98213405,339.98213405,339.98213406,339.98213406,339.98213406,339.98213407,339.98213407,339.98213405,339.96426814,339.98213407,339.96426814,339.96426814,339.96426814,339.96426814,339.96426814,339.96426814,339.96426814,339.94640222,339.94640222,339.99999999,339.99999999,339.99999999,340,340,339.99999999,339.99999999,291.99999999,169.00799226,169.00799227,169.00799227,0,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 -387.99708805,387.99708805,387.99708805,388,388,388.00000001,388.00000002,388.00000001,388,388,387.99999998,387.99999999,387.99999998,387.99999999,387.99999999,387.99999999,387.99999999,387.999794,387.99989699,387.999897,387.99979402,387.99979402,387.99969097,387.99979398,387.999794,387.99979402,387.99979401,387.99979401,387.99989697,387.99979401,387.99979401,387.999897,387.999897,387.99979401,387.99989697,387.99979397,387.999897,387.99989701,387.99989706,387.999794,387.999794,387.99979404,387.99989701,387.99989706,387.999897,387.99989703,387.99989702,387.99989702,387.99989702,387.99979401,387.98213407,387.98213409,387.98213408,387.96426815,387.98213407,387.96426814,387.96426815,387.96426815,387.98213407,387.99999999,387.99999999,387.98213407,387.98213407,387.96426815,387.96426814,387.99999998,387.96426816,387.98213407,387.96426816,387.98213408,387.98213408,387.98213408,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.96426815,387.96426816,387.96426816,387.94640223,387.94640224,387.96426814,387.98213407,387.96426815,387.96426815,387.96426814,387.96426814,387.98213407,387.98213407,387.98213406,387.98213406,387.98213408,388.00000001,388.00000001,387.98213407,387.98213407,387.98213407,388,388,388,388,388,387.98213408,387.98213408,387.98213408,387.98213408,387.98213408,387.96426813,387.98213406,387.98213406,387.96426814,387.98213406,387.98213406,387.96426814,387.94640223,387.94640223,387.94640223,387.96426814,387.94640222,387.94640222,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.96426814,387.98213406,387.98213406,387.98213406,387.96426814,387.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.94640223,387.94640223,387.96426814,387.96426814,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.98213407,387.98213408,387.98213408,387.98213406,387.96426815,387.98213408,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.94640223,387.94640223,388,388,388,388.00000001,388.00000001,388,388,388,387.99999999,388,388,387.99999999,0,132,322,321.99999999,322.00000001,322,321.999999979,321.999999979,321.999999982,321.999999984,321.999999983,321.999999984,321.999999985,321.999999985,321.99999998,322,321.99999998,321.99999998,428,428,428 -387.99708805,387.99708805,387.99708805,388,388,388.00000001,388.00000002,388.00000001,388,388,387.99999998,387.99999999,387.99999998,387.99999999,387.99999999,387.99999999,387.99999999,387.999794,387.99989699,387.999897,387.99979402,387.99979402,387.99969097,387.99979398,387.999794,387.99979402,387.99979401,387.99979401,387.99989697,387.99979401,387.99979401,387.999897,387.999897,387.99979401,387.99989697,387.99979397,387.999897,387.99989701,387.99989706,387.999794,387.999794,387.99979404,387.99989701,387.99989706,387.999897,387.99989703,387.99989702,387.99989702,387.99989702,387.99979401,387.98213407,387.98213409,387.98213408,387.96426815,387.98213407,387.96426814,387.96426815,387.96426815,387.98213407,387.99999999,387.99999999,387.98213407,387.98213407,387.96426815,387.96426814,387.99999998,387.96426816,387.98213407,387.96426816,387.98213408,387.98213408,387.98213408,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.96426815,387.96426816,387.96426816,387.94640223,387.94640224,387.96426814,387.98213407,387.96426815,387.96426815,387.96426814,387.96426814,387.98213407,387.98213407,387.98213406,387.98213406,387.98213408,388.00000001,388.00000001,387.98213407,387.98213407,387.98213407,388,388,388,388,388,387.98213408,387.98213408,387.98213408,387.98213408,387.98213408,387.96426813,387.98213406,387.98213406,387.96426814,387.98213406,387.98213406,387.96426814,387.94640223,387.94640223,387.94640223,387.96426814,387.94640222,387.94640222,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.96426814,387.98213406,387.98213406,387.98213406,387.96426814,387.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.94640223,387.94640223,387.96426814,387.96426814,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.98213407,387.98213408,387.98213408,387.98213406,387.96426815,387.98213408,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.94640223,387.94640223,388,388,388,388.00000001,388.00000001,388,388,388,387.99999999,388,388,387.99999999,132,0,322,321.99999999,322.00000001,322,321.999999979,321.999999979,321.999999982,321.999999984,321.999999983,321.999999984,321.999999985,321.999999985,321.99999998,322,321.99999998,321.99999998,428,428,428 -387.99708805,387.99708805,387.99708805,388,388,388.00000001,388.00000002,388.00000001,388,388,387.99999998,387.99999999,387.99999998,387.99999999,387.99999999,387.99999999,387.99999999,387.999794,387.99989699,387.999897,387.99979402,387.99979402,387.99969097,387.99979398,387.999794,387.99979402,387.99979401,387.99979401,387.99989697,387.99979401,387.99979401,387.999897,387.999897,387.99979401,387.99989697,387.99979397,387.999897,387.99989701,387.99989706,387.999794,387.999794,387.99979404,387.99989701,387.99989706,387.999897,387.99989703,387.99989702,387.99989702,387.99989702,387.99979401,387.98213407,387.98213409,387.98213408,387.96426815,387.98213407,387.96426814,387.96426815,387.96426815,387.98213407,387.99999999,387.99999999,387.98213407,387.98213407,387.96426815,387.96426814,387.99999998,387.96426816,387.98213407,387.96426816,387.98213408,387.98213408,387.98213408,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.96426815,387.96426816,387.96426816,387.94640223,387.94640224,387.96426814,387.98213407,387.96426815,387.96426815,387.96426814,387.96426814,387.98213407,387.98213407,387.98213406,387.98213406,387.98213408,388.00000001,388.00000001,387.98213407,387.98213407,387.98213407,388,388,388,388,388,387.98213408,387.98213408,387.98213408,387.98213408,387.98213408,387.96426813,387.98213406,387.98213406,387.96426814,387.98213406,387.98213406,387.96426814,387.94640223,387.94640223,387.94640223,387.96426814,387.94640222,387.94640222,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.96426814,387.98213406,387.98213406,387.98213406,387.96426814,387.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.94640223,387.94640223,387.96426814,387.96426814,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.98213407,387.98213408,387.98213408,387.98213406,387.96426815,387.98213408,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.94640223,387.94640223,388,388,388,388.00000001,388.00000001,388,388,388,387.99999999,388,388,387.99999999,322,322,0,47.85365853,84.48238483,95.51038844,103.387533859,103.387533859,103.387533862,103.387533864,103.387533863,103.387533864,103.387533865,103.387533865,103.38753386,113.82475158,123.08039746,123.08039746,428,428,428 -387.99708804,387.99708804,387.99708804,387.99999999,387.99999999,388,388.00000001,388,387.99999999,387.99999999,387.99999997,387.99999998,387.99999997,387.99999998,387.99999998,387.99999998,387.99999998,387.99979399,387.99989698,387.99989699,387.99979401,387.99979401,387.99969096,387.99979397,387.99979399,387.99979401,387.999794,387.999794,387.99989696,387.999794,387.999794,387.99989699,387.99989699,387.999794,387.99989696,387.99979396,387.99989699,387.999897,387.99989705,387.99979399,387.99979399,387.99979403,387.999897,387.99989705,387.99989699,387.99989702,387.99989701,387.99989701,387.99989701,387.999794,387.98213406,387.98213408,387.98213407,387.96426814,387.98213406,387.96426813,387.96426814,387.96426814,387.98213406,387.99999998,387.99999998,387.98213406,387.98213406,387.96426814,387.96426813,387.99999997,387.96426815,387.98213406,387.96426815,387.98213407,387.98213407,387.98213407,387.96426814,387.96426814,387.96426813,387.96426813,387.96426814,387.96426814,387.96426815,387.96426815,387.94640222,387.94640223,387.96426813,387.98213406,387.96426814,387.96426814,387.96426813,387.96426813,387.98213406,387.98213406,387.98213405,387.98213405,387.98213407,388,388,387.98213406,387.98213406,387.98213406,387.99999999,387.99999999,387.99999999,387.99999999,387.99999999,387.98213407,387.98213407,387.98213407,387.98213407,387.98213407,387.96426812,387.98213405,387.98213405,387.96426813,387.98213405,387.98213405,387.96426813,387.94640222,387.94640222,387.94640222,387.96426813,387.94640221,387.94640221,387.96426813,387.96426813,387.98213405,387.98213405,387.98213406,387.98213406,387.96426813,387.98213405,387.98213405,387.98213405,387.96426813,387.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426813,387.96426814,387.94640222,387.94640222,387.96426813,387.96426813,387.96426813,387.96426813,387.98213405,387.98213405,387.98213406,387.98213406,387.98213406,387.98213407,387.98213407,387.98213405,387.96426814,387.98213407,387.96426814,387.96426814,387.96426814,387.96426814,387.96426814,387.96426814,387.96426814,387.94640222,387.94640222,387.99999999,387.99999999,387.99999999,388,388,387.99999999,387.99999999,387.99999999,387.99999998,387.99999999,387.99999999,387.99999998,321.99999999,321.99999999,47.85365853,0,84.48238482,95.51038843,103.387533849,103.387533849,103.387533852,103.387533854,103.387533853,103.387533854,103.387533855,103.387533855,103.38753385,113.82475157,123.08039745,123.08039745,427.99999999,427.99999999,427.99999999 -387.99708806,387.99708806,387.99708806,388.00000001,388.00000001,388.00000002,388.00000003,388.00000002,388.00000001,388.00000001,387.99999999,388,387.99999999,388,388,388,388,387.99979401,387.999897,387.99989701,387.99979403,387.99979403,387.99969098,387.99979399,387.99979401,387.99979403,387.99979402,387.99979402,387.99989698,387.99979402,387.99979402,387.99989701,387.99989701,387.99979402,387.99989698,387.99979398,387.99989701,387.99989702,387.99989707,387.99979401,387.99979401,387.99979405,387.99989702,387.99989707,387.99989701,387.99989704,387.99989703,387.99989703,387.99989703,387.99979402,387.98213408,387.9821341,387.98213409,387.96426816,387.98213408,387.96426815,387.96426816,387.96426816,387.98213408,388,388,387.98213408,387.98213408,387.96426816,387.96426815,387.99999999,387.96426817,387.98213408,387.96426817,387.98213409,387.98213409,387.98213409,387.96426816,387.96426816,387.96426815,387.96426815,387.96426816,387.96426816,387.96426817,387.96426817,387.94640224,387.94640225,387.96426815,387.98213408,387.96426816,387.96426816,387.96426815,387.96426815,387.98213408,387.98213408,387.98213407,387.98213407,387.98213409,388.00000002,388.00000002,387.98213408,387.98213408,387.98213408,388.00000001,388.00000001,388.00000001,388.00000001,388.00000001,387.98213409,387.98213409,387.98213409,387.98213409,387.98213409,387.96426814,387.98213407,387.98213407,387.96426815,387.98213407,387.98213407,387.96426815,387.94640224,387.94640224,387.94640224,387.96426815,387.94640223,387.94640223,387.96426815,387.96426815,387.98213407,387.98213407,387.98213408,387.98213408,387.96426815,387.98213407,387.98213407,387.98213407,387.96426815,387.96426815,387.96426816,387.96426816,387.96426816,387.96426815,387.96426815,387.96426816,387.94640224,387.94640224,387.96426815,387.96426815,387.96426815,387.96426815,387.98213407,387.98213407,387.98213408,387.98213408,387.98213408,387.98213409,387.98213409,387.98213407,387.96426816,387.98213409,387.96426816,387.96426816,387.96426816,387.96426816,387.96426816,387.96426816,387.96426816,387.94640224,387.94640224,388.00000001,388.00000001,388.00000001,388.00000002,388.00000002,388.00000001,388.00000001,388.00000001,388,388.00000001,388.00000001,388,322.00000001,322.00000001,84.48238483,84.48238482,0,95.51038845,103.387533869,103.387533869,103.387533872,103.387533874,103.387533873,103.387533874,103.387533875,103.387533875,103.38753387,113.82475159,123.08039747,123.08039747,428.00000001,428.00000001,428.00000001 -387.99708805,387.99708805,387.99708805,388,388,388.00000001,388.00000002,388.00000001,388,388,387.99999998,387.99999999,387.99999998,387.99999999,387.99999999,387.99999999,387.99999999,387.999794,387.99989699,387.999897,387.99979402,387.99979402,387.99969097,387.99979398,387.999794,387.99979402,387.99979401,387.99979401,387.99989697,387.99979401,387.99979401,387.999897,387.999897,387.99979401,387.99989697,387.99979397,387.999897,387.99989701,387.99989706,387.999794,387.999794,387.99979404,387.99989701,387.99989706,387.999897,387.99989703,387.99989702,387.99989702,387.99989702,387.99979401,387.98213407,387.98213409,387.98213408,387.96426815,387.98213407,387.96426814,387.96426815,387.96426815,387.98213407,387.99999999,387.99999999,387.98213407,387.98213407,387.96426815,387.96426814,387.99999998,387.96426816,387.98213407,387.96426816,387.98213408,387.98213408,387.98213408,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.96426815,387.96426816,387.96426816,387.94640223,387.94640224,387.96426814,387.98213407,387.96426815,387.96426815,387.96426814,387.96426814,387.98213407,387.98213407,387.98213406,387.98213406,387.98213408,388.00000001,388.00000001,387.98213407,387.98213407,387.98213407,388,388,388,388,388,387.98213408,387.98213408,387.98213408,387.98213408,387.98213408,387.96426813,387.98213406,387.98213406,387.96426814,387.98213406,387.98213406,387.96426814,387.94640223,387.94640223,387.94640223,387.96426814,387.94640222,387.94640222,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.96426814,387.98213406,387.98213406,387.98213406,387.96426814,387.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.94640223,387.94640223,387.96426814,387.96426814,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.98213407,387.98213408,387.98213408,387.98213406,387.96426815,387.98213408,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.94640223,387.94640223,388,388,388,388.00000001,388.00000001,388,388,388,387.99999999,388,388,387.99999999,322,322,95.51038844,95.51038843,95.51038845,0,103.387533859,103.387533859,103.387533862,103.387533864,103.387533863,103.387533864,103.387533865,103.387533865,103.38753386,113.82475158,123.08039746,123.08039746,428,428,428 -387.997088029,387.997088029,387.997088029,387.999999979,387.999999979,387.999999989,387.999999999,387.999999989,387.999999979,387.999999979,387.999999959,387.999999969,387.999999959,387.999999969,387.999999969,387.999999969,387.999999969,387.999793979,387.999896969,387.999896979,387.999793999,387.999793999,387.999690949,387.999793959,387.999793979,387.999793999,387.999793989,387.999793989,387.999896949,387.999793989,387.999793989,387.999896979,387.999896979,387.999793989,387.999896949,387.999793949,387.999896979,387.999896989,387.999897039,387.999793979,387.999793979,387.999794019,387.999896989,387.999897039,387.999896979,387.999897009,387.999896999,387.999896999,387.999896999,387.999793989,387.982134049,387.982134069,387.982134059,387.964268129,387.982134049,387.964268119,387.964268129,387.964268129,387.982134049,387.999999969,387.999999969,387.982134049,387.982134049,387.964268129,387.964268119,387.999999959,387.964268139,387.982134049,387.964268139,387.982134059,387.982134059,387.982134059,387.964268129,387.964268129,387.964268119,387.964268119,387.964268129,387.964268129,387.964268139,387.964268139,387.946402209,387.946402219,387.964268119,387.982134049,387.964268129,387.964268129,387.964268119,387.964268119,387.982134049,387.982134049,387.982134039,387.982134039,387.982134059,387.999999989,387.999999989,387.982134049,387.982134049,387.982134049,387.999999979,387.999999979,387.999999979,387.999999979,387.999999979,387.982134059,387.982134059,387.982134059,387.982134059,387.982134059,387.964268109,387.982134039,387.982134039,387.964268119,387.982134039,387.982134039,387.964268119,387.946402209,387.946402209,387.946402209,387.964268119,387.946402199,387.946402199,387.964268119,387.964268119,387.982134039,387.982134039,387.982134049,387.982134049,387.964268119,387.982134039,387.982134039,387.982134039,387.964268119,387.964268119,387.964268129,387.964268129,387.964268129,387.964268119,387.964268119,387.964268129,387.946402209,387.946402209,387.964268119,387.964268119,387.964268119,387.964268119,387.982134039,387.982134039,387.982134049,387.982134049,387.982134049,387.982134059,387.982134059,387.982134039,387.964268129,387.982134059,387.964268129,387.964268129,387.964268129,387.964268129,387.964268129,387.964268129,387.964268129,387.946402209,387.946402209,387.999999979,387.999999979,387.999999979,387.999999989,387.999999989,387.999999979,387.999999979,387.999999979,387.999999969,387.999999979,387.999999979,387.999999969,321.999999979,321.999999979,103.387533859,103.387533849,103.387533869,103.387533859,0,20.52272038,29.883730637,47.526262375,51.360058256,55.833893535,58.697539084,58.697539084,58.697539079,113.824751559,123.080397439,123.080397439,427.999999979,427.999999979,427.999999979 -387.997088029,387.997088029,387.997088029,387.999999979,387.999999979,387.999999989,387.999999999,387.999999989,387.999999979,387.999999979,387.999999959,387.999999969,387.999999959,387.999999969,387.999999969,387.999999969,387.999999969,387.999793979,387.999896969,387.999896979,387.999793999,387.999793999,387.999690949,387.999793959,387.999793979,387.999793999,387.999793989,387.999793989,387.999896949,387.999793989,387.999793989,387.999896979,387.999896979,387.999793989,387.999896949,387.999793949,387.999896979,387.999896989,387.999897039,387.999793979,387.999793979,387.999794019,387.999896989,387.999897039,387.999896979,387.999897009,387.999896999,387.999896999,387.999896999,387.999793989,387.982134049,387.982134069,387.982134059,387.964268129,387.982134049,387.964268119,387.964268129,387.964268129,387.982134049,387.999999969,387.999999969,387.982134049,387.982134049,387.964268129,387.964268119,387.999999959,387.964268139,387.982134049,387.964268139,387.982134059,387.982134059,387.982134059,387.964268129,387.964268129,387.964268119,387.964268119,387.964268129,387.964268129,387.964268139,387.964268139,387.946402209,387.946402219,387.964268119,387.982134049,387.964268129,387.964268129,387.964268119,387.964268119,387.982134049,387.982134049,387.982134039,387.982134039,387.982134059,387.999999989,387.999999989,387.982134049,387.982134049,387.982134049,387.999999979,387.999999979,387.999999979,387.999999979,387.999999979,387.982134059,387.982134059,387.982134059,387.982134059,387.982134059,387.964268109,387.982134039,387.982134039,387.964268119,387.982134039,387.982134039,387.964268119,387.946402209,387.946402209,387.946402209,387.964268119,387.946402199,387.946402199,387.964268119,387.964268119,387.982134039,387.982134039,387.982134049,387.982134049,387.964268119,387.982134039,387.982134039,387.982134039,387.964268119,387.964268119,387.964268129,387.964268129,387.964268129,387.964268119,387.964268119,387.964268129,387.946402209,387.946402209,387.964268119,387.964268119,387.964268119,387.964268119,387.982134039,387.982134039,387.982134049,387.982134049,387.982134049,387.982134059,387.982134059,387.982134039,387.964268129,387.982134059,387.964268129,387.964268129,387.964268129,387.964268129,387.964268129,387.964268129,387.964268129,387.946402209,387.946402209,387.999999979,387.999999979,387.999999979,387.999999989,387.999999989,387.999999979,387.999999979,387.999999979,387.999999969,387.999999979,387.999999979,387.999999969,321.999999979,321.999999979,103.387533859,103.387533849,103.387533869,103.387533859,20.52272038,0,29.883730637,47.526262375,51.360058256,55.833893535,58.697539084,58.697539084,58.697539079,113.824751559,123.080397439,123.080397439,427.999999979,427.999999979,427.999999979 -387.997088032,387.997088032,387.997088032,387.999999982,387.999999982,387.999999992,388.000000002,387.999999992,387.999999982,387.999999982,387.999999962,387.999999972,387.999999962,387.999999972,387.999999972,387.999999972,387.999999972,387.999793982,387.999896972,387.999896982,387.999794002,387.999794002,387.999690952,387.999793962,387.999793982,387.999794002,387.999793992,387.999793992,387.999896952,387.999793992,387.999793992,387.999896982,387.999896982,387.999793992,387.999896952,387.999793952,387.999896982,387.999896992,387.999897042,387.999793982,387.999793982,387.999794022,387.999896992,387.999897042,387.999896982,387.999897012,387.999897002,387.999897002,387.999897002,387.999793992,387.982134052,387.982134072,387.982134062,387.964268132,387.982134052,387.964268122,387.964268132,387.964268132,387.982134052,387.999999972,387.999999972,387.982134052,387.982134052,387.964268132,387.964268122,387.999999962,387.964268142,387.982134052,387.964268142,387.982134062,387.982134062,387.982134062,387.964268132,387.964268132,387.964268122,387.964268122,387.964268132,387.964268132,387.964268142,387.964268142,387.946402212,387.946402222,387.964268122,387.982134052,387.964268132,387.964268132,387.964268122,387.964268122,387.982134052,387.982134052,387.982134042,387.982134042,387.982134062,387.999999992,387.999999992,387.982134052,387.982134052,387.982134052,387.999999982,387.999999982,387.999999982,387.999999982,387.999999982,387.982134062,387.982134062,387.982134062,387.982134062,387.982134062,387.964268112,387.982134042,387.982134042,387.964268122,387.982134042,387.982134042,387.964268122,387.946402212,387.946402212,387.946402212,387.964268122,387.946402202,387.946402202,387.964268122,387.964268122,387.982134042,387.982134042,387.982134052,387.982134052,387.964268122,387.982134042,387.982134042,387.982134042,387.964268122,387.964268122,387.964268132,387.964268132,387.964268132,387.964268122,387.964268122,387.964268132,387.946402212,387.946402212,387.964268122,387.964268122,387.964268122,387.964268122,387.982134042,387.982134042,387.982134052,387.982134052,387.982134052,387.982134062,387.982134062,387.982134042,387.964268132,387.982134062,387.964268132,387.964268132,387.964268132,387.964268132,387.964268132,387.964268132,387.964268132,387.946402212,387.946402212,387.999999982,387.999999982,387.999999982,387.999999992,387.999999992,387.999999982,387.999999982,387.999999982,387.999999972,387.999999982,387.999999982,387.999999972,321.999999982,321.999999982,103.387533862,103.387533852,103.387533872,103.387533862,29.883730637,29.883730637,0,47.526262378,51.360058259,55.833893538,58.697539087,58.697539087,58.697539082,113.824751562,123.080397442,123.080397442,427.999999982,427.999999982,427.999999982 -387.997088034,387.997088034,387.997088034,387.999999984,387.999999984,387.999999994,388.000000004,387.999999994,387.999999984,387.999999984,387.999999964,387.999999974,387.999999964,387.999999974,387.999999974,387.999999974,387.999999974,387.999793984,387.999896974,387.999896984,387.999794004,387.999794004,387.999690954,387.999793964,387.999793984,387.999794004,387.999793994,387.999793994,387.999896954,387.999793994,387.999793994,387.999896984,387.999896984,387.999793994,387.999896954,387.999793954,387.999896984,387.999896994,387.999897044,387.999793984,387.999793984,387.999794024,387.999896994,387.999897044,387.999896984,387.999897014,387.999897004,387.999897004,387.999897004,387.999793994,387.982134054,387.982134074,387.982134064,387.964268134,387.982134054,387.964268124,387.964268134,387.964268134,387.982134054,387.999999974,387.999999974,387.982134054,387.982134054,387.964268134,387.964268124,387.999999964,387.964268144,387.982134054,387.964268144,387.982134064,387.982134064,387.982134064,387.964268134,387.964268134,387.964268124,387.964268124,387.964268134,387.964268134,387.964268144,387.964268144,387.946402214,387.946402224,387.964268124,387.982134054,387.964268134,387.964268134,387.964268124,387.964268124,387.982134054,387.982134054,387.982134044,387.982134044,387.982134064,387.999999994,387.999999994,387.982134054,387.982134054,387.982134054,387.999999984,387.999999984,387.999999984,387.999999984,387.999999984,387.982134064,387.982134064,387.982134064,387.982134064,387.982134064,387.964268114,387.982134044,387.982134044,387.964268124,387.982134044,387.982134044,387.964268124,387.946402214,387.946402214,387.946402214,387.964268124,387.946402204,387.946402204,387.964268124,387.964268124,387.982134044,387.982134044,387.982134054,387.982134054,387.964268124,387.982134044,387.982134044,387.982134044,387.964268124,387.964268124,387.964268134,387.964268134,387.964268134,387.964268124,387.964268124,387.964268134,387.946402214,387.946402214,387.964268124,387.964268124,387.964268124,387.964268124,387.982134044,387.982134044,387.982134054,387.982134054,387.982134054,387.982134064,387.982134064,387.982134044,387.964268134,387.982134064,387.964268134,387.964268134,387.964268134,387.964268134,387.964268134,387.964268134,387.964268134,387.946402214,387.946402214,387.999999984,387.999999984,387.999999984,387.999999994,387.999999994,387.999999984,387.999999984,387.999999984,387.999999974,387.999999984,387.999999984,387.999999974,321.999999984,321.999999984,103.387533864,103.387533854,103.387533874,103.387533864,47.526262375,47.526262375,47.526262378,0,51.360058261,55.83389354,58.697539089,58.697539089,58.697539084,113.824751564,123.080397444,123.080397444,427.999999984,427.999999984,427.999999984 -387.997088033,387.997088033,387.997088033,387.999999983,387.999999983,387.999999993,388.000000003,387.999999993,387.999999983,387.999999983,387.999999963,387.999999973,387.999999963,387.999999973,387.999999973,387.999999973,387.999999973,387.999793983,387.999896973,387.999896983,387.999794003,387.999794003,387.999690953,387.999793963,387.999793983,387.999794003,387.999793993,387.999793993,387.999896953,387.999793993,387.999793993,387.999896983,387.999896983,387.999793993,387.999896953,387.999793953,387.999896983,387.999896993,387.999897043,387.999793983,387.999793983,387.999794023,387.999896993,387.999897043,387.999896983,387.999897013,387.999897003,387.999897003,387.999897003,387.999793993,387.982134053,387.982134073,387.982134063,387.964268133,387.982134053,387.964268123,387.964268133,387.964268133,387.982134053,387.999999973,387.999999973,387.982134053,387.982134053,387.964268133,387.964268123,387.999999963,387.964268143,387.982134053,387.964268143,387.982134063,387.982134063,387.982134063,387.964268133,387.964268133,387.964268123,387.964268123,387.964268133,387.964268133,387.964268143,387.964268143,387.946402213,387.946402223,387.964268123,387.982134053,387.964268133,387.964268133,387.964268123,387.964268123,387.982134053,387.982134053,387.982134043,387.982134043,387.982134063,387.999999993,387.999999993,387.982134053,387.982134053,387.982134053,387.999999983,387.999999983,387.999999983,387.999999983,387.999999983,387.982134063,387.982134063,387.982134063,387.982134063,387.982134063,387.964268113,387.982134043,387.982134043,387.964268123,387.982134043,387.982134043,387.964268123,387.946402213,387.946402213,387.946402213,387.964268123,387.946402203,387.946402203,387.964268123,387.964268123,387.982134043,387.982134043,387.982134053,387.982134053,387.964268123,387.982134043,387.982134043,387.982134043,387.964268123,387.964268123,387.964268133,387.964268133,387.964268133,387.964268123,387.964268123,387.964268133,387.946402213,387.946402213,387.964268123,387.964268123,387.964268123,387.964268123,387.982134043,387.982134043,387.982134053,387.982134053,387.982134053,387.982134063,387.982134063,387.982134043,387.964268133,387.982134063,387.964268133,387.964268133,387.964268133,387.964268133,387.964268133,387.964268133,387.964268133,387.946402213,387.946402213,387.999999983,387.999999983,387.999999983,387.999999993,387.999999993,387.999999983,387.999999983,387.999999983,387.999999973,387.999999983,387.999999983,387.999999973,321.999999983,321.999999983,103.387533863,103.387533853,103.387533873,103.387533863,51.360058256,51.360058256,51.360058259,51.360058261,0,55.833893539,58.697539088,58.697539088,58.697539083,113.824751563,123.080397443,123.080397443,427.999999983,427.999999983,427.999999983 -387.997088034,387.997088034,387.997088034,387.999999984,387.999999984,387.999999994,388.000000004,387.999999994,387.999999984,387.999999984,387.999999964,387.999999974,387.999999964,387.999999974,387.999999974,387.999999974,387.999999974,387.999793984,387.999896974,387.999896984,387.999794004,387.999794004,387.999690954,387.999793964,387.999793984,387.999794004,387.999793994,387.999793994,387.999896954,387.999793994,387.999793994,387.999896984,387.999896984,387.999793994,387.999896954,387.999793954,387.999896984,387.999896994,387.999897044,387.999793984,387.999793984,387.999794024,387.999896994,387.999897044,387.999896984,387.999897014,387.999897004,387.999897004,387.999897004,387.999793994,387.982134054,387.982134074,387.982134064,387.964268134,387.982134054,387.964268124,387.964268134,387.964268134,387.982134054,387.999999974,387.999999974,387.982134054,387.982134054,387.964268134,387.964268124,387.999999964,387.964268144,387.982134054,387.964268144,387.982134064,387.982134064,387.982134064,387.964268134,387.964268134,387.964268124,387.964268124,387.964268134,387.964268134,387.964268144,387.964268144,387.946402214,387.946402224,387.964268124,387.982134054,387.964268134,387.964268134,387.964268124,387.964268124,387.982134054,387.982134054,387.982134044,387.982134044,387.982134064,387.999999994,387.999999994,387.982134054,387.982134054,387.982134054,387.999999984,387.999999984,387.999999984,387.999999984,387.999999984,387.982134064,387.982134064,387.982134064,387.982134064,387.982134064,387.964268114,387.982134044,387.982134044,387.964268124,387.982134044,387.982134044,387.964268124,387.946402214,387.946402214,387.946402214,387.964268124,387.946402204,387.946402204,387.964268124,387.964268124,387.982134044,387.982134044,387.982134054,387.982134054,387.964268124,387.982134044,387.982134044,387.982134044,387.964268124,387.964268124,387.964268134,387.964268134,387.964268134,387.964268124,387.964268124,387.964268134,387.946402214,387.946402214,387.964268124,387.964268124,387.964268124,387.964268124,387.982134044,387.982134044,387.982134054,387.982134054,387.982134054,387.982134064,387.982134064,387.982134044,387.964268134,387.982134064,387.964268134,387.964268134,387.964268134,387.964268134,387.964268134,387.964268134,387.964268134,387.946402214,387.946402214,387.999999984,387.999999984,387.999999984,387.999999994,387.999999994,387.999999984,387.999999984,387.999999984,387.999999974,387.999999984,387.999999984,387.999999974,321.999999984,321.999999984,103.387533864,103.387533854,103.387533874,103.387533864,55.833893535,55.833893535,55.833893538,55.83389354,55.833893539,0,58.697539089,58.697539089,58.697539084,113.824751564,123.080397444,123.080397444,427.999999984,427.999999984,427.999999984 -387.997088035,387.997088035,387.997088035,387.999999985,387.999999985,387.999999995,388.000000005,387.999999995,387.999999985,387.999999985,387.999999965,387.999999975,387.999999965,387.999999975,387.999999975,387.999999975,387.999999975,387.999793985,387.999896975,387.999896985,387.999794005,387.999794005,387.999690955,387.999793965,387.999793985,387.999794005,387.999793995,387.999793995,387.999896955,387.999793995,387.999793995,387.999896985,387.999896985,387.999793995,387.999896955,387.999793955,387.999896985,387.999896995,387.999897045,387.999793985,387.999793985,387.999794025,387.999896995,387.999897045,387.999896985,387.999897015,387.999897005,387.999897005,387.999897005,387.999793995,387.982134055,387.982134075,387.982134065,387.964268135,387.982134055,387.964268125,387.964268135,387.964268135,387.982134055,387.999999975,387.999999975,387.982134055,387.982134055,387.964268135,387.964268125,387.999999965,387.964268145,387.982134055,387.964268145,387.982134065,387.982134065,387.982134065,387.964268135,387.964268135,387.964268125,387.964268125,387.964268135,387.964268135,387.964268145,387.964268145,387.946402215,387.946402225,387.964268125,387.982134055,387.964268135,387.964268135,387.964268125,387.964268125,387.982134055,387.982134055,387.982134045,387.982134045,387.982134065,387.999999995,387.999999995,387.982134055,387.982134055,387.982134055,387.999999985,387.999999985,387.999999985,387.999999985,387.999999985,387.982134065,387.982134065,387.982134065,387.982134065,387.982134065,387.964268115,387.982134045,387.982134045,387.964268125,387.982134045,387.982134045,387.964268125,387.946402215,387.946402215,387.946402215,387.964268125,387.946402205,387.946402205,387.964268125,387.964268125,387.982134045,387.982134045,387.982134055,387.982134055,387.964268125,387.982134045,387.982134045,387.982134045,387.964268125,387.964268125,387.964268135,387.964268135,387.964268135,387.964268125,387.964268125,387.964268135,387.946402215,387.946402215,387.964268125,387.964268125,387.964268125,387.964268125,387.982134045,387.982134045,387.982134055,387.982134055,387.982134055,387.982134065,387.982134065,387.982134045,387.964268135,387.982134065,387.964268135,387.964268135,387.964268135,387.964268135,387.964268135,387.964268135,387.964268135,387.946402215,387.946402215,387.999999985,387.999999985,387.999999985,387.999999995,387.999999995,387.999999985,387.999999985,387.999999985,387.999999975,387.999999985,387.999999985,387.999999975,321.999999985,321.999999985,103.387533865,103.387533855,103.387533875,103.387533865,58.697539084,58.697539084,58.697539087,58.697539089,58.697539088,58.697539089,0,38.4904195,45.471444565,113.824751565,123.080397445,123.080397445,427.999999985,427.999999985,427.999999985 -387.997088035,387.997088035,387.997088035,387.999999985,387.999999985,387.999999995,388.000000005,387.999999995,387.999999985,387.999999985,387.999999965,387.999999975,387.999999965,387.999999975,387.999999975,387.999999975,387.999999975,387.999793985,387.999896975,387.999896985,387.999794005,387.999794005,387.999690955,387.999793965,387.999793985,387.999794005,387.999793995,387.999793995,387.999896955,387.999793995,387.999793995,387.999896985,387.999896985,387.999793995,387.999896955,387.999793955,387.999896985,387.999896995,387.999897045,387.999793985,387.999793985,387.999794025,387.999896995,387.999897045,387.999896985,387.999897015,387.999897005,387.999897005,387.999897005,387.999793995,387.982134055,387.982134075,387.982134065,387.964268135,387.982134055,387.964268125,387.964268135,387.964268135,387.982134055,387.999999975,387.999999975,387.982134055,387.982134055,387.964268135,387.964268125,387.999999965,387.964268145,387.982134055,387.964268145,387.982134065,387.982134065,387.982134065,387.964268135,387.964268135,387.964268125,387.964268125,387.964268135,387.964268135,387.964268145,387.964268145,387.946402215,387.946402225,387.964268125,387.982134055,387.964268135,387.964268135,387.964268125,387.964268125,387.982134055,387.982134055,387.982134045,387.982134045,387.982134065,387.999999995,387.999999995,387.982134055,387.982134055,387.982134055,387.999999985,387.999999985,387.999999985,387.999999985,387.999999985,387.982134065,387.982134065,387.982134065,387.982134065,387.982134065,387.964268115,387.982134045,387.982134045,387.964268125,387.982134045,387.982134045,387.964268125,387.946402215,387.946402215,387.946402215,387.964268125,387.946402205,387.946402205,387.964268125,387.964268125,387.982134045,387.982134045,387.982134055,387.982134055,387.964268125,387.982134045,387.982134045,387.982134045,387.964268125,387.964268125,387.964268135,387.964268135,387.964268135,387.964268125,387.964268125,387.964268135,387.946402215,387.946402215,387.964268125,387.964268125,387.964268125,387.964268125,387.982134045,387.982134045,387.982134055,387.982134055,387.982134055,387.982134065,387.982134065,387.982134045,387.964268135,387.982134065,387.964268135,387.964268135,387.964268135,387.964268135,387.964268135,387.964268135,387.964268135,387.946402215,387.946402215,387.999999985,387.999999985,387.999999985,387.999999995,387.999999995,387.999999985,387.999999985,387.999999985,387.999999975,387.999999985,387.999999985,387.999999975,321.999999985,321.999999985,103.387533865,103.387533855,103.387533875,103.387533865,58.697539084,58.697539084,58.697539087,58.697539089,58.697539088,58.697539089,38.4904195,0,45.471444565,113.824751565,123.080397445,123.080397445,427.999999985,427.999999985,427.999999985 -387.99708803,387.99708803,387.99708803,387.99999998,387.99999998,387.99999999,388,387.99999999,387.99999998,387.99999998,387.99999996,387.99999997,387.99999996,387.99999997,387.99999997,387.99999997,387.99999997,387.99979398,387.99989697,387.99989698,387.999794,387.999794,387.99969095,387.99979396,387.99979398,387.999794,387.99979399,387.99979399,387.99989695,387.99979399,387.99979399,387.99989698,387.99989698,387.99979399,387.99989695,387.99979395,387.99989698,387.99989699,387.99989704,387.99979398,387.99979398,387.99979402,387.99989699,387.99989704,387.99989698,387.99989701,387.999897,387.999897,387.999897,387.99979399,387.98213405,387.98213407,387.98213406,387.96426813,387.98213405,387.96426812,387.96426813,387.96426813,387.98213405,387.99999997,387.99999997,387.98213405,387.98213405,387.96426813,387.96426812,387.99999996,387.96426814,387.98213405,387.96426814,387.98213406,387.98213406,387.98213406,387.96426813,387.96426813,387.96426812,387.96426812,387.96426813,387.96426813,387.96426814,387.96426814,387.94640221,387.94640222,387.96426812,387.98213405,387.96426813,387.96426813,387.96426812,387.96426812,387.98213405,387.98213405,387.98213404,387.98213404,387.98213406,387.99999999,387.99999999,387.98213405,387.98213405,387.98213405,387.99999998,387.99999998,387.99999998,387.99999998,387.99999998,387.98213406,387.98213406,387.98213406,387.98213406,387.98213406,387.96426811,387.98213404,387.98213404,387.96426812,387.98213404,387.98213404,387.96426812,387.94640221,387.94640221,387.94640221,387.96426812,387.9464022,387.9464022,387.96426812,387.96426812,387.98213404,387.98213404,387.98213405,387.98213405,387.96426812,387.98213404,387.98213404,387.98213404,387.96426812,387.96426812,387.96426813,387.96426813,387.96426813,387.96426812,387.96426812,387.96426813,387.94640221,387.94640221,387.96426812,387.96426812,387.96426812,387.96426812,387.98213404,387.98213404,387.98213405,387.98213405,387.98213405,387.98213406,387.98213406,387.98213404,387.96426813,387.98213406,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.94640221,387.94640221,387.99999998,387.99999998,387.99999998,387.99999999,387.99999999,387.99999998,387.99999998,387.99999998,387.99999997,387.99999998,387.99999998,387.99999997,321.99999998,321.99999998,103.38753386,103.38753385,103.38753387,103.38753386,58.697539079,58.697539079,58.697539082,58.697539084,58.697539083,58.697539084,45.471444565,45.471444565,0,113.82475156,123.08039744,123.08039744,427.99999998,427.99999998,427.99999998 -387.99708805,387.99708805,387.99708805,388,388,388.00000001,388.00000002,388.00000001,388,388,387.99999998,387.99999999,387.99999998,387.99999999,387.99999999,387.99999999,387.99999999,387.999794,387.99989699,387.999897,387.99979402,387.99979402,387.99969097,387.99979398,387.999794,387.99979402,387.99979401,387.99979401,387.99989697,387.99979401,387.99979401,387.999897,387.999897,387.99979401,387.99989697,387.99979397,387.999897,387.99989701,387.99989706,387.999794,387.999794,387.99979404,387.99989701,387.99989706,387.999897,387.99989703,387.99989702,387.99989702,387.99989702,387.99979401,387.98213407,387.98213409,387.98213408,387.96426815,387.98213407,387.96426814,387.96426815,387.96426815,387.98213407,387.99999999,387.99999999,387.98213407,387.98213407,387.96426815,387.96426814,387.99999998,387.96426816,387.98213407,387.96426816,387.98213408,387.98213408,387.98213408,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.96426815,387.96426816,387.96426816,387.94640223,387.94640224,387.96426814,387.98213407,387.96426815,387.96426815,387.96426814,387.96426814,387.98213407,387.98213407,387.98213406,387.98213406,387.98213408,388.00000001,388.00000001,387.98213407,387.98213407,387.98213407,388,388,388,388,388,387.98213408,387.98213408,387.98213408,387.98213408,387.98213408,387.96426813,387.98213406,387.98213406,387.96426814,387.98213406,387.98213406,387.96426814,387.94640223,387.94640223,387.94640223,387.96426814,387.94640222,387.94640222,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.96426814,387.98213406,387.98213406,387.98213406,387.96426814,387.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.94640223,387.94640223,387.96426814,387.96426814,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.98213407,387.98213408,387.98213408,387.98213406,387.96426815,387.98213408,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.94640223,387.94640223,388,388,388,388.00000001,388.00000001,388,388,388,387.99999999,388,388,387.99999999,322,322,113.82475158,113.82475157,113.82475159,113.82475158,113.824751559,113.824751559,113.824751562,113.824751564,113.824751563,113.824751564,113.824751565,113.824751565,113.82475156,0,123.08039746,123.08039746,428,428,428 -387.99708803,387.99708803,387.99708803,387.99999998,387.99999998,387.99999999,388,387.99999999,387.99999998,387.99999998,387.99999996,387.99999997,387.99999996,387.99999997,387.99999997,387.99999997,387.99999997,387.99979398,387.99989697,387.99989698,387.999794,387.999794,387.99969095,387.99979396,387.99979398,387.999794,387.99979399,387.99979399,387.99989695,387.99979399,387.99979399,387.99989698,387.99989698,387.99979399,387.99989695,387.99979395,387.99989698,387.99989699,387.99989704,387.99979398,387.99979398,387.99979402,387.99989699,387.99989704,387.99989698,387.99989701,387.999897,387.999897,387.999897,387.99979399,387.98213405,387.98213407,387.98213406,387.96426813,387.98213405,387.96426812,387.96426813,387.96426813,387.98213405,387.99999997,387.99999997,387.98213405,387.98213405,387.96426813,387.96426812,387.99999996,387.96426814,387.98213405,387.96426814,387.98213406,387.98213406,387.98213406,387.96426813,387.96426813,387.96426812,387.96426812,387.96426813,387.96426813,387.96426814,387.96426814,387.94640221,387.94640222,387.96426812,387.98213405,387.96426813,387.96426813,387.96426812,387.96426812,387.98213405,387.98213405,387.98213404,387.98213404,387.98213406,387.99999999,387.99999999,387.98213405,387.98213405,387.98213405,387.99999998,387.99999998,387.99999998,387.99999998,387.99999998,387.98213406,387.98213406,387.98213406,387.98213406,387.98213406,387.96426811,387.98213404,387.98213404,387.96426812,387.98213404,387.98213404,387.96426812,387.94640221,387.94640221,387.94640221,387.96426812,387.9464022,387.9464022,387.96426812,387.96426812,387.98213404,387.98213404,387.98213405,387.98213405,387.96426812,387.98213404,387.98213404,387.98213404,387.96426812,387.96426812,387.96426813,387.96426813,387.96426813,387.96426812,387.96426812,387.96426813,387.94640221,387.94640221,387.96426812,387.96426812,387.96426812,387.96426812,387.98213404,387.98213404,387.98213405,387.98213405,387.98213405,387.98213406,387.98213406,387.98213404,387.96426813,387.98213406,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.94640221,387.94640221,387.99999998,387.99999998,387.99999998,387.99999999,387.99999999,387.99999998,387.99999998,387.99999998,387.99999997,387.99999998,387.99999998,387.99999997,321.99999998,321.99999998,123.08039746,123.08039745,123.08039747,123.08039746,123.080397439,123.080397439,123.080397442,123.080397444,123.080397443,123.080397444,123.080397445,123.080397445,123.08039744,123.08039746,0,95.11653114,427.99999998,427.99999998,427.99999998 -387.99708803,387.99708803,387.99708803,387.99999998,387.99999998,387.99999999,388,387.99999999,387.99999998,387.99999998,387.99999996,387.99999997,387.99999996,387.99999997,387.99999997,387.99999997,387.99999997,387.99979398,387.99989697,387.99989698,387.999794,387.999794,387.99969095,387.99979396,387.99979398,387.999794,387.99979399,387.99979399,387.99989695,387.99979399,387.99979399,387.99989698,387.99989698,387.99979399,387.99989695,387.99979395,387.99989698,387.99989699,387.99989704,387.99979398,387.99979398,387.99979402,387.99989699,387.99989704,387.99989698,387.99989701,387.999897,387.999897,387.999897,387.99979399,387.98213405,387.98213407,387.98213406,387.96426813,387.98213405,387.96426812,387.96426813,387.96426813,387.98213405,387.99999997,387.99999997,387.98213405,387.98213405,387.96426813,387.96426812,387.99999996,387.96426814,387.98213405,387.96426814,387.98213406,387.98213406,387.98213406,387.96426813,387.96426813,387.96426812,387.96426812,387.96426813,387.96426813,387.96426814,387.96426814,387.94640221,387.94640222,387.96426812,387.98213405,387.96426813,387.96426813,387.96426812,387.96426812,387.98213405,387.98213405,387.98213404,387.98213404,387.98213406,387.99999999,387.99999999,387.98213405,387.98213405,387.98213405,387.99999998,387.99999998,387.99999998,387.99999998,387.99999998,387.98213406,387.98213406,387.98213406,387.98213406,387.98213406,387.96426811,387.98213404,387.98213404,387.96426812,387.98213404,387.98213404,387.96426812,387.94640221,387.94640221,387.94640221,387.96426812,387.9464022,387.9464022,387.96426812,387.96426812,387.98213404,387.98213404,387.98213405,387.98213405,387.96426812,387.98213404,387.98213404,387.98213404,387.96426812,387.96426812,387.96426813,387.96426813,387.96426813,387.96426812,387.96426812,387.96426813,387.94640221,387.94640221,387.96426812,387.96426812,387.96426812,387.96426812,387.98213404,387.98213404,387.98213405,387.98213405,387.98213405,387.98213406,387.98213406,387.98213404,387.96426813,387.98213406,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.94640221,387.94640221,387.99999998,387.99999998,387.99999998,387.99999999,387.99999999,387.99999998,387.99999998,387.99999998,387.99999997,387.99999998,387.99999998,387.99999997,321.99999998,321.99999998,123.08039746,123.08039745,123.08039747,123.08039746,123.080397439,123.080397439,123.080397442,123.080397444,123.080397443,123.080397444,123.080397445,123.080397445,123.08039744,123.08039746,95.11653114,0,427.99999998,427.99999998,427.99999998 -427.99708805,427.99708805,427.99708805,428,428,428.00000001,428.00000002,428.00000001,428,428,427.99999998,427.99999999,427.99999998,427.99999999,427.99999999,427.99999999,427.99999999,427.999794,427.99989699,427.999897,427.99979402,427.99979402,427.99969097,427.99979398,427.999794,427.99979402,427.99979401,427.99979401,427.99989697,427.99979401,427.99979401,427.999897,427.999897,427.99979401,427.99989697,427.99979397,427.999897,427.99989701,427.99989706,427.999794,427.999794,427.99979404,427.99989701,427.99989706,427.999897,427.99989703,427.99989702,427.99989702,427.99989702,427.99979401,427.98213407,427.98213409,427.98213408,427.96426815,427.98213407,427.96426814,427.96426815,427.96426815,427.98213407,427.99999999,427.99999999,427.98213407,427.98213407,427.96426815,427.96426814,427.99999998,427.96426816,427.98213407,427.96426816,427.98213408,427.98213408,427.98213408,427.96426815,427.96426815,427.96426814,427.96426814,427.96426815,427.96426815,427.96426816,427.96426816,427.94640223,427.94640224,427.96426814,427.98213407,427.96426815,427.96426815,427.96426814,427.96426814,427.98213407,427.98213407,427.98213406,427.98213406,427.98213408,428.00000001,428.00000001,427.98213407,427.98213407,427.98213407,428,428,428,428,428,427.98213408,427.98213408,427.98213408,427.98213408,427.98213408,427.96426813,427.98213406,427.98213406,427.96426814,427.98213406,427.98213406,427.96426814,427.94640223,427.94640223,427.94640223,427.96426814,427.94640222,427.94640222,427.96426814,427.96426814,427.98213406,427.98213406,427.98213407,427.98213407,427.96426814,427.98213406,427.98213406,427.98213406,427.96426814,427.96426814,427.96426815,427.96426815,427.96426815,427.96426814,427.96426814,427.96426815,427.94640223,427.94640223,427.96426814,427.96426814,427.96426814,427.96426814,427.98213406,427.98213406,427.98213407,427.98213407,427.98213407,427.98213408,427.98213408,427.98213406,427.96426815,427.98213408,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.94640223,427.94640223,428,428,428,428.00000001,428.00000001,428,428,428,427.99999999,428,428,427.99999999,428,428,428,427.99999999,428.00000001,428,427.999999979,427.999999979,427.999999982,427.999999984,427.999999983,427.999999984,427.999999985,427.999999985,427.99999998,428,427.99999998,427.99999998,0,148,148 -427.99708805,427.99708805,427.99708805,428,428,428.00000001,428.00000002,428.00000001,428,428,427.99999998,427.99999999,427.99999998,427.99999999,427.99999999,427.99999999,427.99999999,427.999794,427.99989699,427.999897,427.99979402,427.99979402,427.99969097,427.99979398,427.999794,427.99979402,427.99979401,427.99979401,427.99989697,427.99979401,427.99979401,427.999897,427.999897,427.99979401,427.99989697,427.99979397,427.999897,427.99989701,427.99989706,427.999794,427.999794,427.99979404,427.99989701,427.99989706,427.999897,427.99989703,427.99989702,427.99989702,427.99989702,427.99979401,427.98213407,427.98213409,427.98213408,427.96426815,427.98213407,427.96426814,427.96426815,427.96426815,427.98213407,427.99999999,427.99999999,427.98213407,427.98213407,427.96426815,427.96426814,427.99999998,427.96426816,427.98213407,427.96426816,427.98213408,427.98213408,427.98213408,427.96426815,427.96426815,427.96426814,427.96426814,427.96426815,427.96426815,427.96426816,427.96426816,427.94640223,427.94640224,427.96426814,427.98213407,427.96426815,427.96426815,427.96426814,427.96426814,427.98213407,427.98213407,427.98213406,427.98213406,427.98213408,428.00000001,428.00000001,427.98213407,427.98213407,427.98213407,428,428,428,428,428,427.98213408,427.98213408,427.98213408,427.98213408,427.98213408,427.96426813,427.98213406,427.98213406,427.96426814,427.98213406,427.98213406,427.96426814,427.94640223,427.94640223,427.94640223,427.96426814,427.94640222,427.94640222,427.96426814,427.96426814,427.98213406,427.98213406,427.98213407,427.98213407,427.96426814,427.98213406,427.98213406,427.98213406,427.96426814,427.96426814,427.96426815,427.96426815,427.96426815,427.96426814,427.96426814,427.96426815,427.94640223,427.94640223,427.96426814,427.96426814,427.96426814,427.96426814,427.98213406,427.98213406,427.98213407,427.98213407,427.98213407,427.98213408,427.98213408,427.98213406,427.96426815,427.98213408,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.94640223,427.94640223,428,428,428,428.00000001,428.00000001,428,428,428,427.99999999,428,428,427.99999999,428,428,428,427.99999999,428.00000001,428,427.999999979,427.999999979,427.999999982,427.999999984,427.999999983,427.999999984,427.999999985,427.999999985,427.99999998,428,427.99999998,427.99999998,148,0,38.80040742 -427.99708805,427.99708805,427.99708805,428,428,428.00000001,428.00000002,428.00000001,428,428,427.99999998,427.99999999,427.99999998,427.99999999,427.99999999,427.99999999,427.99999999,427.999794,427.99989699,427.999897,427.99979402,427.99979402,427.99969097,427.99979398,427.999794,427.99979402,427.99979401,427.99979401,427.99989697,427.99979401,427.99979401,427.999897,427.999897,427.99979401,427.99989697,427.99979397,427.999897,427.99989701,427.99989706,427.999794,427.999794,427.99979404,427.99989701,427.99989706,427.999897,427.99989703,427.99989702,427.99989702,427.99989702,427.99979401,427.98213407,427.98213409,427.98213408,427.96426815,427.98213407,427.96426814,427.96426815,427.96426815,427.98213407,427.99999999,427.99999999,427.98213407,427.98213407,427.96426815,427.96426814,427.99999998,427.96426816,427.98213407,427.96426816,427.98213408,427.98213408,427.98213408,427.96426815,427.96426815,427.96426814,427.96426814,427.96426815,427.96426815,427.96426816,427.96426816,427.94640223,427.94640224,427.96426814,427.98213407,427.96426815,427.96426815,427.96426814,427.96426814,427.98213407,427.98213407,427.98213406,427.98213406,427.98213408,428.00000001,428.00000001,427.98213407,427.98213407,427.98213407,428,428,428,428,428,427.98213408,427.98213408,427.98213408,427.98213408,427.98213408,427.96426813,427.98213406,427.98213406,427.96426814,427.98213406,427.98213406,427.96426814,427.94640223,427.94640223,427.94640223,427.96426814,427.94640222,427.94640222,427.96426814,427.96426814,427.98213406,427.98213406,427.98213407,427.98213407,427.96426814,427.98213406,427.98213406,427.98213406,427.96426814,427.96426814,427.96426815,427.96426815,427.96426815,427.96426814,427.96426814,427.96426815,427.94640223,427.94640223,427.96426814,427.96426814,427.96426814,427.96426814,427.98213406,427.98213406,427.98213407,427.98213407,427.98213407,427.98213408,427.98213408,427.98213406,427.96426815,427.98213408,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.94640223,427.94640223,428,428,428,428.00000001,428.00000001,428,428,428,427.99999999,428,428,427.99999999,428,428,428,427.99999999,428.00000001,428,427.999999979,427.999999979,427.999999982,427.999999984,427.999999983,427.999999984,427.999999985,427.999999985,427.99999998,428,427.99999998,427.99999998,148,38.80040742,0 +"Dicamptodon_copei","Dicamptodon_tenebrosus","Dicamptodon_ensatus","Ambystoma_texanum","Ambystoma_barbouri","Ambystoma_opacum","Ambystoma_cingulatum","Ambystoma_annulatum","Ambystoma_laterale","Ambystoma_jeffersonianum","Ambystoma_ordinarium","Ambystoma_mavortium","Ambystoma_velasci","Ambystoma_californiense","Ambystoma_macrodactylum","Ambystoma_maculatum","Ambystoma_gracile","Salamandrina_terdigitata","Salamandra_atra","Salamandra_salamandra","Chioglossa_lusitanica","Mertensiella_caucasica","Taricha_granulosa","Taricha_torosa","Taricha_rivularis","Notophthalmus_meridionalis","Notophthalmus_perstriatus","Notophthalmus_viridescens","Ichthyosaura_alpestris","Lissotriton_vulgaris","Lissotriton_montandoni","Lissotriton_helveticus","Lissotriton_boscai","Triturus_pygmaeus","Triturus_cristatus","Calotriton_asper","Ommatotriton_vittatus","Neurergus_crocatus","Neurergus_strauchii","Cynops_pyrrhogaster","Cynops_ensicauda","Paramesotriton_caudopunctatus","Paramesotriton_chinensis","Paramesotriton_hongkongensis","Pachytriton_brevipes","Echinotriton_andersoni","Tylototriton_verrucosus","Tylototriton_kweichowensis","Tylototriton_asperrimus","Pleurodeles_waltl","Hemidactylium_scutatum","Bolitoglossa_adspersa","Bolitoglossa_palmata","Bolitoglossa_subpalmata","Bolitoglossa_dofleini","Bolitoglossa_morio","Bolitoglossa_engelhardti","Bolitoglossa_rostrata","Bolitoglossa_platydactyla","Bolitoglossa_mexicana","Bolitoglossa_yucatana","Bolitoglossa_occidentalis","Bolitoglossa_rufescens","Parvimolge_townsendi","Pseudoeurycea_leprosa","Pseudoeurycea_werleri","Pseudoeurycea_robertsi","Pseudoeurycea_gadovii","Pseudoeurycea_rex","Pseudoeurycea_bellii","Pseudoeurycea_cephalica","Pseudoeurycea_galeanae","Chiropterotriton_dimidiatus","Chiropterotriton_lavae","Chiropterotriton_priscus","Chiropterotriton_multidentatus","Chiropterotriton_chondrostega","Bradytriton_silus","Oedipina_complex","Oedipina_parvipes","Oedipina_cyclocauda","Oedipina_uniformis","Nototriton_picadoi","Nyctanolis_pernix","Cryptotriton_nasalis","Batrachoseps_wrighti","Batrachoseps_attenuatus","Batrachoseps_major","Stereochilus_marginatus","Gyrinophilus_porphyriticus","Pseudotriton_montanus","Pseudotriton_ruber","Eurycea_multiplicata","Eurycea_tynerensis","Eurycea_spelaea","Eurycea_quadridigitata","Eurycea_lucifuga","Eurycea_longicauda","Eurycea_cirrigera","Eurycea_bislineata","Eurycea_aquatica","Eurycea_junaluska","Eurycea_wilderae","Eurycea_rathbuni","Eurycea_nana","Eurycea_sosorum","Eurycea_neotenes","Eurycea_tridentifera","Plethodon_elongatus","Plethodon_vehiculum","Plethodon_dunni","Plethodon_neomexicanus","Plethodon_vandykei","Plethodon_idahoensis","Plethodon_serratus","Plethodon_hoffmani","Plethodon_cinereus","Plethodon_shenandoah","Plethodon_richmondi","Plethodon_nettingi","Plethodon_hubrichti","Plethodon_wehrlei","Plethodon_punctatus","Plethodon_welleri","Plethodon_angusticlavius","Plethodon_ventralis","Plethodon_dorsalis","Plethodon_yonahlossee","Plethodon_kentucki","Plethodon_metcalfi","Plethodon_jordani","Plethodon_caddoensis","Plethodon_ouachitae","Plethodon_montanus","Plethodon_amplus","Plethodon_meridianus","Plethodon_shermani","Plethodon_cheoah","Plethodon_chlorobryonis","Plethodon_teyahalee","Plethodon_cylindraceus","Plethodon_glutinosus","Plethodon_mississippi","Plethodon_albagula","Plethodon_grobmani","Hydromantes_italicus","Hydromantes_platycephalus","Ensatina_eschscholtzii","Aneides_aeneus","Aneides_hardii","Aneides_lugubris","Aneides_flavipunctatus","Phaeognathus_hubrichti","Desmognathus_wrighti","Desmognathus_aeneus","Desmognathus_quadramaculatus","Desmognathus_marmoratus","Desmognathus_imitator","Desmognathus_ochrophaeus","Desmognathus_welteri","Desmognathus_fuscus","Desmognathus_monticola","Desmognathus_brimleyorum","Desmognathus_auriculatus","Amphiuma_pholeter","Amphiuma_means","Amphiuma_tridactylum","Rhyacotriton_olympicus","Rhyacotriton_kezeri","Rhyacotriton_cascadae","Rhyacotriton_variegatus","Proteus_anguinus","Necturus_alabamensis","Necturus_beyeri","Necturus_maculosus","Necturus_punctatus","Andrias_davidianus","Cryptobranchus_alleganiensis","Batrachuperus_pinchonii","Batrachuperus_yenyuanensis","Liua_shihi","Salamandrella_keyserlingii","Hynobius_nebulosus","Hynobius_dunni","Hynobius_tsuensis","Hynobius_leechii","Hynobius_naevius","Hynobius_stejnegeri","Hynobius_nigrescens","Hynobius_lichenatus","Hynobius_abei","Pachyhynobius_shangchengensis","Paradactylodon_mustersi","Ranodon_sibiricus","Pseudobranchus_axanthus","Siren_lacertina","Siren_intermedia" +0,31.76812578,48.23322428,235.99708805,235.99708805,235.99708806,235.99708807,235.99708806,235.99708805,235.99708805,235.99708803,235.99708804,235.99708803,235.99708804,235.99708804,235.99708804,235.99708804,325.99688205,325.99698504,325.99698505,325.99688207,325.99688207,325.99677902,325.99688203,325.99688205,325.99688207,325.99688206,325.99688206,325.99698502,325.99688206,325.99688206,325.99698505,325.99698505,325.99688206,325.99698502,325.99688202,325.99698505,325.99698506,325.99698511,325.99688205,325.99688205,325.99688209,325.99698506,325.99698511,325.99698505,325.99698508,325.99698507,325.99698507,325.99698507,325.99688206,361.97922212,361.97922214,361.97922213,361.9613562,361.97922212,361.96135619,361.9613562,361.9613562,361.97922212,361.99708804,361.99708804,361.97922212,361.97922212,361.9613562,361.96135619,361.99708803,361.96135621,361.97922212,361.96135621,361.97922213,361.97922213,361.97922213,361.9613562,361.9613562,361.96135619,361.96135619,361.9613562,361.9613562,361.96135621,361.96135621,361.94349028,361.94349029,361.96135619,361.97922212,361.9613562,361.9613562,361.96135619,361.96135619,361.97922212,361.97922212,361.97922211,361.97922211,361.97922213,361.99708806,361.99708806,361.97922212,361.97922212,361.97922212,361.99708805,361.99708805,361.99708805,361.99708805,361.99708805,361.97922213,361.97922213,361.97922213,361.97922213,361.97922213,361.96135618,361.97922211,361.97922211,361.96135619,361.97922211,361.97922211,361.96135619,361.94349028,361.94349028,361.94349028,361.96135619,361.94349027,361.94349027,361.96135619,361.96135619,361.97922211,361.97922211,361.97922212,361.97922212,361.96135619,361.97922211,361.97922211,361.97922211,361.96135619,361.96135619,361.9613562,361.9613562,361.9613562,361.96135619,361.96135619,361.9613562,361.94349028,361.94349028,361.96135619,361.96135619,361.96135619,361.96135619,361.97922211,361.97922211,361.97922212,361.97922212,361.97922212,361.97922213,361.97922213,361.97922211,361.9613562,361.97922213,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.94349028,361.94349028,361.99708805,361.99708805,361.99708805,361.99708806,361.99708806,361.99708805,361.99708805,361.99708805,361.99708804,361.99708805,361.99708805,361.99708804,387.99708805,387.99708805,387.99708805,387.99708804,387.99708806,387.99708805,387.997088029,387.997088029,387.997088032,387.997088034,387.997088033,387.997088034,387.997088035,387.997088035,387.99708803,387.99708805,387.99708803,387.99708803,427.99708805,427.99708805,427.99708805 +31.76812578,0,48.23322428,235.99708805,235.99708805,235.99708806,235.99708807,235.99708806,235.99708805,235.99708805,235.99708803,235.99708804,235.99708803,235.99708804,235.99708804,235.99708804,235.99708804,325.99688205,325.99698504,325.99698505,325.99688207,325.99688207,325.99677902,325.99688203,325.99688205,325.99688207,325.99688206,325.99688206,325.99698502,325.99688206,325.99688206,325.99698505,325.99698505,325.99688206,325.99698502,325.99688202,325.99698505,325.99698506,325.99698511,325.99688205,325.99688205,325.99688209,325.99698506,325.99698511,325.99698505,325.99698508,325.99698507,325.99698507,325.99698507,325.99688206,361.97922212,361.97922214,361.97922213,361.9613562,361.97922212,361.96135619,361.9613562,361.9613562,361.97922212,361.99708804,361.99708804,361.97922212,361.97922212,361.9613562,361.96135619,361.99708803,361.96135621,361.97922212,361.96135621,361.97922213,361.97922213,361.97922213,361.9613562,361.9613562,361.96135619,361.96135619,361.9613562,361.9613562,361.96135621,361.96135621,361.94349028,361.94349029,361.96135619,361.97922212,361.9613562,361.9613562,361.96135619,361.96135619,361.97922212,361.97922212,361.97922211,361.97922211,361.97922213,361.99708806,361.99708806,361.97922212,361.97922212,361.97922212,361.99708805,361.99708805,361.99708805,361.99708805,361.99708805,361.97922213,361.97922213,361.97922213,361.97922213,361.97922213,361.96135618,361.97922211,361.97922211,361.96135619,361.97922211,361.97922211,361.96135619,361.94349028,361.94349028,361.94349028,361.96135619,361.94349027,361.94349027,361.96135619,361.96135619,361.97922211,361.97922211,361.97922212,361.97922212,361.96135619,361.97922211,361.97922211,361.97922211,361.96135619,361.96135619,361.9613562,361.9613562,361.9613562,361.96135619,361.96135619,361.9613562,361.94349028,361.94349028,361.96135619,361.96135619,361.96135619,361.96135619,361.97922211,361.97922211,361.97922212,361.97922212,361.97922212,361.97922213,361.97922213,361.97922211,361.9613562,361.97922213,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.94349028,361.94349028,361.99708805,361.99708805,361.99708805,361.99708806,361.99708806,361.99708805,361.99708805,361.99708805,361.99708804,361.99708805,361.99708805,361.99708804,387.99708805,387.99708805,387.99708805,387.99708804,387.99708806,387.99708805,387.997088029,387.997088029,387.997088032,387.997088034,387.997088033,387.997088034,387.997088035,387.997088035,387.99708803,387.99708805,387.99708803,387.99708803,427.99708805,427.99708805,427.99708805 +48.23322428,48.23322428,0,235.99708805,235.99708805,235.99708806,235.99708807,235.99708806,235.99708805,235.99708805,235.99708803,235.99708804,235.99708803,235.99708804,235.99708804,235.99708804,235.99708804,325.99688205,325.99698504,325.99698505,325.99688207,325.99688207,325.99677902,325.99688203,325.99688205,325.99688207,325.99688206,325.99688206,325.99698502,325.99688206,325.99688206,325.99698505,325.99698505,325.99688206,325.99698502,325.99688202,325.99698505,325.99698506,325.99698511,325.99688205,325.99688205,325.99688209,325.99698506,325.99698511,325.99698505,325.99698508,325.99698507,325.99698507,325.99698507,325.99688206,361.97922212,361.97922214,361.97922213,361.9613562,361.97922212,361.96135619,361.9613562,361.9613562,361.97922212,361.99708804,361.99708804,361.97922212,361.97922212,361.9613562,361.96135619,361.99708803,361.96135621,361.97922212,361.96135621,361.97922213,361.97922213,361.97922213,361.9613562,361.9613562,361.96135619,361.96135619,361.9613562,361.9613562,361.96135621,361.96135621,361.94349028,361.94349029,361.96135619,361.97922212,361.9613562,361.9613562,361.96135619,361.96135619,361.97922212,361.97922212,361.97922211,361.97922211,361.97922213,361.99708806,361.99708806,361.97922212,361.97922212,361.97922212,361.99708805,361.99708805,361.99708805,361.99708805,361.99708805,361.97922213,361.97922213,361.97922213,361.97922213,361.97922213,361.96135618,361.97922211,361.97922211,361.96135619,361.97922211,361.97922211,361.96135619,361.94349028,361.94349028,361.94349028,361.96135619,361.94349027,361.94349027,361.96135619,361.96135619,361.97922211,361.97922211,361.97922212,361.97922212,361.96135619,361.97922211,361.97922211,361.97922211,361.96135619,361.96135619,361.9613562,361.9613562,361.9613562,361.96135619,361.96135619,361.9613562,361.94349028,361.94349028,361.96135619,361.96135619,361.96135619,361.96135619,361.97922211,361.97922211,361.97922212,361.97922212,361.97922212,361.97922213,361.97922213,361.97922211,361.9613562,361.97922213,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.9613562,361.94349028,361.94349028,361.99708805,361.99708805,361.99708805,361.99708806,361.99708806,361.99708805,361.99708805,361.99708805,361.99708804,361.99708805,361.99708805,361.99708804,387.99708805,387.99708805,387.99708805,387.99708804,387.99708806,387.99708805,387.997088029,387.997088029,387.997088032,387.997088034,387.997088033,387.997088034,387.997088035,387.997088035,387.99708803,387.99708805,387.99708803,387.99708803,427.99708805,427.99708805,427.99708805 +235.99708805,235.99708805,235.99708805,0,19.10653358,80.56326553,91.85789584,91.85789583,102.51158612,102.51158612,104.34922622,104.34922623,104.34922622,104.34922623,115.89221069,118.83999999,118.83999999,325.999794,325.99989699,325.999897,325.99979402,325.99979402,325.99969097,325.99979398,325.999794,325.99979402,325.99979401,325.99979401,325.99989697,325.99979401,325.99979401,325.999897,325.999897,325.99979401,325.99989697,325.99979397,325.999897,325.99989701,325.99989706,325.999794,325.999794,325.99979404,325.99989701,325.99989706,325.999897,325.99989703,325.99989702,325.99989702,325.99989702,325.99979401,361.98213407,361.98213409,361.98213408,361.96426815,361.98213407,361.96426814,361.96426815,361.96426815,361.98213407,361.99999999,361.99999999,361.98213407,361.98213407,361.96426815,361.96426814,361.99999998,361.96426816,361.98213407,361.96426816,361.98213408,361.98213408,361.98213408,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.96426815,361.96426816,361.96426816,361.94640223,361.94640224,361.96426814,361.98213407,361.96426815,361.96426815,361.96426814,361.96426814,361.98213407,361.98213407,361.98213406,361.98213406,361.98213408,362.00000001,362.00000001,361.98213407,361.98213407,361.98213407,362,362,362,362,362,361.98213408,361.98213408,361.98213408,361.98213408,361.98213408,361.96426813,361.98213406,361.98213406,361.96426814,361.98213406,361.98213406,361.96426814,361.94640223,361.94640223,361.94640223,361.96426814,361.94640222,361.94640222,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.96426814,361.98213406,361.98213406,361.98213406,361.96426814,361.96426814,361.96426815,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.94640223,361.94640223,361.96426814,361.96426814,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.98213407,361.98213408,361.98213408,361.98213406,361.96426815,361.98213408,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.94640223,361.94640223,362,362,362,362.00000001,362.00000001,362,362,362,361.99999999,362,362,361.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +235.99708805,235.99708805,235.99708805,19.10653358,0,80.56326553,91.85789584,91.85789583,102.51158612,102.51158612,104.34922622,104.34922623,104.34922622,104.34922623,115.89221069,118.83999999,118.83999999,325.999794,325.99989699,325.999897,325.99979402,325.99979402,325.99969097,325.99979398,325.999794,325.99979402,325.99979401,325.99979401,325.99989697,325.99979401,325.99979401,325.999897,325.999897,325.99979401,325.99989697,325.99979397,325.999897,325.99989701,325.99989706,325.999794,325.999794,325.99979404,325.99989701,325.99989706,325.999897,325.99989703,325.99989702,325.99989702,325.99989702,325.99979401,361.98213407,361.98213409,361.98213408,361.96426815,361.98213407,361.96426814,361.96426815,361.96426815,361.98213407,361.99999999,361.99999999,361.98213407,361.98213407,361.96426815,361.96426814,361.99999998,361.96426816,361.98213407,361.96426816,361.98213408,361.98213408,361.98213408,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.96426815,361.96426816,361.96426816,361.94640223,361.94640224,361.96426814,361.98213407,361.96426815,361.96426815,361.96426814,361.96426814,361.98213407,361.98213407,361.98213406,361.98213406,361.98213408,362.00000001,362.00000001,361.98213407,361.98213407,361.98213407,362,362,362,362,362,361.98213408,361.98213408,361.98213408,361.98213408,361.98213408,361.96426813,361.98213406,361.98213406,361.96426814,361.98213406,361.98213406,361.96426814,361.94640223,361.94640223,361.94640223,361.96426814,361.94640222,361.94640222,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.96426814,361.98213406,361.98213406,361.98213406,361.96426814,361.96426814,361.96426815,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.94640223,361.94640223,361.96426814,361.96426814,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.98213407,361.98213408,361.98213408,361.98213406,361.96426815,361.98213408,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.94640223,361.94640223,362,362,362,362.00000001,362.00000001,362,362,362,361.99999999,362,362,361.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +235.99708806,235.99708806,235.99708806,80.56326553,80.56326553,0,91.85789585,91.85789584,102.51158613,102.51158613,104.34922623,104.34922624,104.34922623,104.34922624,115.8922107,118.84,118.84,325.99979401,325.999897,325.99989701,325.99979403,325.99979403,325.99969098,325.99979399,325.99979401,325.99979403,325.99979402,325.99979402,325.99989698,325.99979402,325.99979402,325.99989701,325.99989701,325.99979402,325.99989698,325.99979398,325.99989701,325.99989702,325.99989707,325.99979401,325.99979401,325.99979405,325.99989702,325.99989707,325.99989701,325.99989704,325.99989703,325.99989703,325.99989703,325.99979402,361.98213408,361.9821341,361.98213409,361.96426816,361.98213408,361.96426815,361.96426816,361.96426816,361.98213408,362,362,361.98213408,361.98213408,361.96426816,361.96426815,361.99999999,361.96426817,361.98213408,361.96426817,361.98213409,361.98213409,361.98213409,361.96426816,361.96426816,361.96426815,361.96426815,361.96426816,361.96426816,361.96426817,361.96426817,361.94640224,361.94640225,361.96426815,361.98213408,361.96426816,361.96426816,361.96426815,361.96426815,361.98213408,361.98213408,361.98213407,361.98213407,361.98213409,362.00000002,362.00000002,361.98213408,361.98213408,361.98213408,362.00000001,362.00000001,362.00000001,362.00000001,362.00000001,361.98213409,361.98213409,361.98213409,361.98213409,361.98213409,361.96426814,361.98213407,361.98213407,361.96426815,361.98213407,361.98213407,361.96426815,361.94640224,361.94640224,361.94640224,361.96426815,361.94640223,361.94640223,361.96426815,361.96426815,361.98213407,361.98213407,361.98213408,361.98213408,361.96426815,361.98213407,361.98213407,361.98213407,361.96426815,361.96426815,361.96426816,361.96426816,361.96426816,361.96426815,361.96426815,361.96426816,361.94640224,361.94640224,361.96426815,361.96426815,361.96426815,361.96426815,361.98213407,361.98213407,361.98213408,361.98213408,361.98213408,361.98213409,361.98213409,361.98213407,361.96426816,361.98213409,361.96426816,361.96426816,361.96426816,361.96426816,361.96426816,361.96426816,361.96426816,361.94640224,361.94640224,362.00000001,362.00000001,362.00000001,362.00000002,362.00000002,362.00000001,362.00000001,362.00000001,362,362.00000001,362.00000001,362,388.00000001,388.00000001,388.00000001,388,388.00000002,388.00000001,387.999999989,387.999999989,387.999999992,387.999999994,387.999999993,387.999999994,387.999999995,387.999999995,387.99999999,388.00000001,387.99999999,387.99999999,428.00000001,428.00000001,428.00000001 +235.99708807,235.99708807,235.99708807,91.85789584,91.85789584,91.85789585,0,85.80757595,102.51158614,102.51158614,104.34922624,104.34922625,104.34922624,104.34922625,115.89221071,118.84000001,118.84000001,325.99979402,325.99989701,325.99989702,325.99979404,325.99979404,325.99969099,325.999794,325.99979402,325.99979404,325.99979403,325.99979403,325.99989699,325.99979403,325.99979403,325.99989702,325.99989702,325.99979403,325.99989699,325.99979399,325.99989702,325.99989703,325.99989708,325.99979402,325.99979402,325.99979406,325.99989703,325.99989708,325.99989702,325.99989705,325.99989704,325.99989704,325.99989704,325.99979403,361.98213409,361.98213411,361.9821341,361.96426817,361.98213409,361.96426816,361.96426817,361.96426817,361.98213409,362.00000001,362.00000001,361.98213409,361.98213409,361.96426817,361.96426816,362,361.96426818,361.98213409,361.96426818,361.9821341,361.9821341,361.9821341,361.96426817,361.96426817,361.96426816,361.96426816,361.96426817,361.96426817,361.96426818,361.96426818,361.94640225,361.94640226,361.96426816,361.98213409,361.96426817,361.96426817,361.96426816,361.96426816,361.98213409,361.98213409,361.98213408,361.98213408,361.9821341,362.00000003,362.00000003,361.98213409,361.98213409,361.98213409,362.00000002,362.00000002,362.00000002,362.00000002,362.00000002,361.9821341,361.9821341,361.9821341,361.9821341,361.9821341,361.96426815,361.98213408,361.98213408,361.96426816,361.98213408,361.98213408,361.96426816,361.94640225,361.94640225,361.94640225,361.96426816,361.94640224,361.94640224,361.96426816,361.96426816,361.98213408,361.98213408,361.98213409,361.98213409,361.96426816,361.98213408,361.98213408,361.98213408,361.96426816,361.96426816,361.96426817,361.96426817,361.96426817,361.96426816,361.96426816,361.96426817,361.94640225,361.94640225,361.96426816,361.96426816,361.96426816,361.96426816,361.98213408,361.98213408,361.98213409,361.98213409,361.98213409,361.9821341,361.9821341,361.98213408,361.96426817,361.9821341,361.96426817,361.96426817,361.96426817,361.96426817,361.96426817,361.96426817,361.96426817,361.94640225,361.94640225,362.00000002,362.00000002,362.00000002,362.00000003,362.00000003,362.00000002,362.00000002,362.00000002,362.00000001,362.00000002,362.00000002,362.00000001,388.00000002,388.00000002,388.00000002,388.00000001,388.00000003,388.00000002,387.999999999,387.999999999,388.000000002,388.000000004,388.000000003,388.000000004,388.000000005,388.000000005,388,388.00000002,388,388,428.00000002,428.00000002,428.00000002 +235.99708806,235.99708806,235.99708806,91.85789583,91.85789583,91.85789584,85.80757595,0,102.51158613,102.51158613,104.34922623,104.34922624,104.34922623,104.34922624,115.8922107,118.84,118.84,325.99979401,325.999897,325.99989701,325.99979403,325.99979403,325.99969098,325.99979399,325.99979401,325.99979403,325.99979402,325.99979402,325.99989698,325.99979402,325.99979402,325.99989701,325.99989701,325.99979402,325.99989698,325.99979398,325.99989701,325.99989702,325.99989707,325.99979401,325.99979401,325.99979405,325.99989702,325.99989707,325.99989701,325.99989704,325.99989703,325.99989703,325.99989703,325.99979402,361.98213408,361.9821341,361.98213409,361.96426816,361.98213408,361.96426815,361.96426816,361.96426816,361.98213408,362,362,361.98213408,361.98213408,361.96426816,361.96426815,361.99999999,361.96426817,361.98213408,361.96426817,361.98213409,361.98213409,361.98213409,361.96426816,361.96426816,361.96426815,361.96426815,361.96426816,361.96426816,361.96426817,361.96426817,361.94640224,361.94640225,361.96426815,361.98213408,361.96426816,361.96426816,361.96426815,361.96426815,361.98213408,361.98213408,361.98213407,361.98213407,361.98213409,362.00000002,362.00000002,361.98213408,361.98213408,361.98213408,362.00000001,362.00000001,362.00000001,362.00000001,362.00000001,361.98213409,361.98213409,361.98213409,361.98213409,361.98213409,361.96426814,361.98213407,361.98213407,361.96426815,361.98213407,361.98213407,361.96426815,361.94640224,361.94640224,361.94640224,361.96426815,361.94640223,361.94640223,361.96426815,361.96426815,361.98213407,361.98213407,361.98213408,361.98213408,361.96426815,361.98213407,361.98213407,361.98213407,361.96426815,361.96426815,361.96426816,361.96426816,361.96426816,361.96426815,361.96426815,361.96426816,361.94640224,361.94640224,361.96426815,361.96426815,361.96426815,361.96426815,361.98213407,361.98213407,361.98213408,361.98213408,361.98213408,361.98213409,361.98213409,361.98213407,361.96426816,361.98213409,361.96426816,361.96426816,361.96426816,361.96426816,361.96426816,361.96426816,361.96426816,361.94640224,361.94640224,362.00000001,362.00000001,362.00000001,362.00000002,362.00000002,362.00000001,362.00000001,362.00000001,362,362.00000001,362.00000001,362,388.00000001,388.00000001,388.00000001,388,388.00000002,388.00000001,387.999999989,387.999999989,387.999999992,387.999999994,387.999999993,387.999999994,387.999999995,387.999999995,387.99999999,388.00000001,387.99999999,387.99999999,428.00000001,428.00000001,428.00000001 +235.99708805,235.99708805,235.99708805,102.51158612,102.51158612,102.51158613,102.51158614,102.51158613,0,72.31140646,104.34922622,104.34922623,104.34922622,104.34922623,115.89221069,118.83999999,118.83999999,325.999794,325.99989699,325.999897,325.99979402,325.99979402,325.99969097,325.99979398,325.999794,325.99979402,325.99979401,325.99979401,325.99989697,325.99979401,325.99979401,325.999897,325.999897,325.99979401,325.99989697,325.99979397,325.999897,325.99989701,325.99989706,325.999794,325.999794,325.99979404,325.99989701,325.99989706,325.999897,325.99989703,325.99989702,325.99989702,325.99989702,325.99979401,361.98213407,361.98213409,361.98213408,361.96426815,361.98213407,361.96426814,361.96426815,361.96426815,361.98213407,361.99999999,361.99999999,361.98213407,361.98213407,361.96426815,361.96426814,361.99999998,361.96426816,361.98213407,361.96426816,361.98213408,361.98213408,361.98213408,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.96426815,361.96426816,361.96426816,361.94640223,361.94640224,361.96426814,361.98213407,361.96426815,361.96426815,361.96426814,361.96426814,361.98213407,361.98213407,361.98213406,361.98213406,361.98213408,362.00000001,362.00000001,361.98213407,361.98213407,361.98213407,362,362,362,362,362,361.98213408,361.98213408,361.98213408,361.98213408,361.98213408,361.96426813,361.98213406,361.98213406,361.96426814,361.98213406,361.98213406,361.96426814,361.94640223,361.94640223,361.94640223,361.96426814,361.94640222,361.94640222,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.96426814,361.98213406,361.98213406,361.98213406,361.96426814,361.96426814,361.96426815,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.94640223,361.94640223,361.96426814,361.96426814,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.98213407,361.98213408,361.98213408,361.98213406,361.96426815,361.98213408,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.94640223,361.94640223,362,362,362,362.00000001,362.00000001,362,362,362,361.99999999,362,362,361.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +235.99708805,235.99708805,235.99708805,102.51158612,102.51158612,102.51158613,102.51158614,102.51158613,72.31140646,0,104.34922622,104.34922623,104.34922622,104.34922623,115.89221069,118.83999999,118.83999999,325.999794,325.99989699,325.999897,325.99979402,325.99979402,325.99969097,325.99979398,325.999794,325.99979402,325.99979401,325.99979401,325.99989697,325.99979401,325.99979401,325.999897,325.999897,325.99979401,325.99989697,325.99979397,325.999897,325.99989701,325.99989706,325.999794,325.999794,325.99979404,325.99989701,325.99989706,325.999897,325.99989703,325.99989702,325.99989702,325.99989702,325.99979401,361.98213407,361.98213409,361.98213408,361.96426815,361.98213407,361.96426814,361.96426815,361.96426815,361.98213407,361.99999999,361.99999999,361.98213407,361.98213407,361.96426815,361.96426814,361.99999998,361.96426816,361.98213407,361.96426816,361.98213408,361.98213408,361.98213408,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.96426815,361.96426816,361.96426816,361.94640223,361.94640224,361.96426814,361.98213407,361.96426815,361.96426815,361.96426814,361.96426814,361.98213407,361.98213407,361.98213406,361.98213406,361.98213408,362.00000001,362.00000001,361.98213407,361.98213407,361.98213407,362,362,362,362,362,361.98213408,361.98213408,361.98213408,361.98213408,361.98213408,361.96426813,361.98213406,361.98213406,361.96426814,361.98213406,361.98213406,361.96426814,361.94640223,361.94640223,361.94640223,361.96426814,361.94640222,361.94640222,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.96426814,361.98213406,361.98213406,361.98213406,361.96426814,361.96426814,361.96426815,361.96426815,361.96426815,361.96426814,361.96426814,361.96426815,361.94640223,361.94640223,361.96426814,361.96426814,361.96426814,361.96426814,361.98213406,361.98213406,361.98213407,361.98213407,361.98213407,361.98213408,361.98213408,361.98213406,361.96426815,361.98213408,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.96426815,361.94640223,361.94640223,362,362,362,362.00000001,362.00000001,362,362,362,361.99999999,362,362,361.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +235.99708803,235.99708803,235.99708803,104.34922622,104.34922622,104.34922623,104.34922624,104.34922623,104.34922622,104.34922622,0,31.72545619,56.4377159,85.53988873,115.89221067,118.83999997,118.83999997,325.99979398,325.99989697,325.99989698,325.999794,325.999794,325.99969095,325.99979396,325.99979398,325.999794,325.99979399,325.99979399,325.99989695,325.99979399,325.99979399,325.99989698,325.99989698,325.99979399,325.99989695,325.99979395,325.99989698,325.99989699,325.99989704,325.99979398,325.99979398,325.99979402,325.99989699,325.99989704,325.99989698,325.99989701,325.999897,325.999897,325.999897,325.99979399,361.98213405,361.98213407,361.98213406,361.96426813,361.98213405,361.96426812,361.96426813,361.96426813,361.98213405,361.99999997,361.99999997,361.98213405,361.98213405,361.96426813,361.96426812,361.99999996,361.96426814,361.98213405,361.96426814,361.98213406,361.98213406,361.98213406,361.96426813,361.96426813,361.96426812,361.96426812,361.96426813,361.96426813,361.96426814,361.96426814,361.94640221,361.94640222,361.96426812,361.98213405,361.96426813,361.96426813,361.96426812,361.96426812,361.98213405,361.98213405,361.98213404,361.98213404,361.98213406,361.99999999,361.99999999,361.98213405,361.98213405,361.98213405,361.99999998,361.99999998,361.99999998,361.99999998,361.99999998,361.98213406,361.98213406,361.98213406,361.98213406,361.98213406,361.96426811,361.98213404,361.98213404,361.96426812,361.98213404,361.98213404,361.96426812,361.94640221,361.94640221,361.94640221,361.96426812,361.9464022,361.9464022,361.96426812,361.96426812,361.98213404,361.98213404,361.98213405,361.98213405,361.96426812,361.98213404,361.98213404,361.98213404,361.96426812,361.96426812,361.96426813,361.96426813,361.96426813,361.96426812,361.96426812,361.96426813,361.94640221,361.94640221,361.96426812,361.96426812,361.96426812,361.96426812,361.98213404,361.98213404,361.98213405,361.98213405,361.98213405,361.98213406,361.98213406,361.98213404,361.96426813,361.98213406,361.96426813,361.96426813,361.96426813,361.96426813,361.96426813,361.96426813,361.96426813,361.94640221,361.94640221,361.99999998,361.99999998,361.99999998,361.99999999,361.99999999,361.99999998,361.99999998,361.99999998,361.99999997,361.99999998,361.99999998,361.99999997,387.99999998,387.99999998,387.99999998,387.99999997,387.99999999,387.99999998,387.999999959,387.999999959,387.999999962,387.999999964,387.999999963,387.999999964,387.999999965,387.999999965,387.99999996,387.99999998,387.99999996,387.99999996,427.99999998,427.99999998,427.99999998 +235.99708804,235.99708804,235.99708804,104.34922623,104.34922623,104.34922624,104.34922625,104.34922624,104.34922623,104.34922623,31.72545619,0,56.43771591,85.53988874,115.89221068,118.83999998,118.83999998,325.99979399,325.99989698,325.99989699,325.99979401,325.99979401,325.99969096,325.99979397,325.99979399,325.99979401,325.999794,325.999794,325.99989696,325.999794,325.999794,325.99989699,325.99989699,325.999794,325.99989696,325.99979396,325.99989699,325.999897,325.99989705,325.99979399,325.99979399,325.99979403,325.999897,325.99989705,325.99989699,325.99989702,325.99989701,325.99989701,325.99989701,325.999794,361.98213406,361.98213408,361.98213407,361.96426814,361.98213406,361.96426813,361.96426814,361.96426814,361.98213406,361.99999998,361.99999998,361.98213406,361.98213406,361.96426814,361.96426813,361.99999997,361.96426815,361.98213406,361.96426815,361.98213407,361.98213407,361.98213407,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.96426814,361.96426815,361.96426815,361.94640222,361.94640223,361.96426813,361.98213406,361.96426814,361.96426814,361.96426813,361.96426813,361.98213406,361.98213406,361.98213405,361.98213405,361.98213407,362,362,361.98213406,361.98213406,361.98213406,361.99999999,361.99999999,361.99999999,361.99999999,361.99999999,361.98213407,361.98213407,361.98213407,361.98213407,361.98213407,361.96426812,361.98213405,361.98213405,361.96426813,361.98213405,361.98213405,361.96426813,361.94640222,361.94640222,361.94640222,361.96426813,361.94640221,361.94640221,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.96426813,361.98213405,361.98213405,361.98213405,361.96426813,361.96426813,361.96426814,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.94640222,361.94640222,361.96426813,361.96426813,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.98213406,361.98213407,361.98213407,361.98213405,361.96426814,361.98213407,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.94640222,361.94640222,361.99999999,361.99999999,361.99999999,362,362,361.99999999,361.99999999,361.99999999,361.99999998,361.99999999,361.99999999,361.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 +235.99708803,235.99708803,235.99708803,104.34922622,104.34922622,104.34922623,104.34922624,104.34922623,104.34922622,104.34922622,56.4377159,56.43771591,0,85.53988873,115.89221067,118.83999997,118.83999997,325.99979398,325.99989697,325.99989698,325.999794,325.999794,325.99969095,325.99979396,325.99979398,325.999794,325.99979399,325.99979399,325.99989695,325.99979399,325.99979399,325.99989698,325.99989698,325.99979399,325.99989695,325.99979395,325.99989698,325.99989699,325.99989704,325.99979398,325.99979398,325.99979402,325.99989699,325.99989704,325.99989698,325.99989701,325.999897,325.999897,325.999897,325.99979399,361.98213405,361.98213407,361.98213406,361.96426813,361.98213405,361.96426812,361.96426813,361.96426813,361.98213405,361.99999997,361.99999997,361.98213405,361.98213405,361.96426813,361.96426812,361.99999996,361.96426814,361.98213405,361.96426814,361.98213406,361.98213406,361.98213406,361.96426813,361.96426813,361.96426812,361.96426812,361.96426813,361.96426813,361.96426814,361.96426814,361.94640221,361.94640222,361.96426812,361.98213405,361.96426813,361.96426813,361.96426812,361.96426812,361.98213405,361.98213405,361.98213404,361.98213404,361.98213406,361.99999999,361.99999999,361.98213405,361.98213405,361.98213405,361.99999998,361.99999998,361.99999998,361.99999998,361.99999998,361.98213406,361.98213406,361.98213406,361.98213406,361.98213406,361.96426811,361.98213404,361.98213404,361.96426812,361.98213404,361.98213404,361.96426812,361.94640221,361.94640221,361.94640221,361.96426812,361.9464022,361.9464022,361.96426812,361.96426812,361.98213404,361.98213404,361.98213405,361.98213405,361.96426812,361.98213404,361.98213404,361.98213404,361.96426812,361.96426812,361.96426813,361.96426813,361.96426813,361.96426812,361.96426812,361.96426813,361.94640221,361.94640221,361.96426812,361.96426812,361.96426812,361.96426812,361.98213404,361.98213404,361.98213405,361.98213405,361.98213405,361.98213406,361.98213406,361.98213404,361.96426813,361.98213406,361.96426813,361.96426813,361.96426813,361.96426813,361.96426813,361.96426813,361.96426813,361.94640221,361.94640221,361.99999998,361.99999998,361.99999998,361.99999999,361.99999999,361.99999998,361.99999998,361.99999998,361.99999997,361.99999998,361.99999998,361.99999997,387.99999998,387.99999998,387.99999998,387.99999997,387.99999999,387.99999998,387.999999959,387.999999959,387.999999962,387.999999964,387.999999963,387.999999964,387.999999965,387.999999965,387.99999996,387.99999998,387.99999996,387.99999996,427.99999998,427.99999998,427.99999998 +235.99708804,235.99708804,235.99708804,104.34922623,104.34922623,104.34922624,104.34922625,104.34922624,104.34922623,104.34922623,85.53988873,85.53988874,85.53988873,0,115.89221068,118.83999998,118.83999998,325.99979399,325.99989698,325.99989699,325.99979401,325.99979401,325.99969096,325.99979397,325.99979399,325.99979401,325.999794,325.999794,325.99989696,325.999794,325.999794,325.99989699,325.99989699,325.999794,325.99989696,325.99979396,325.99989699,325.999897,325.99989705,325.99979399,325.99979399,325.99979403,325.999897,325.99989705,325.99989699,325.99989702,325.99989701,325.99989701,325.99989701,325.999794,361.98213406,361.98213408,361.98213407,361.96426814,361.98213406,361.96426813,361.96426814,361.96426814,361.98213406,361.99999998,361.99999998,361.98213406,361.98213406,361.96426814,361.96426813,361.99999997,361.96426815,361.98213406,361.96426815,361.98213407,361.98213407,361.98213407,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.96426814,361.96426815,361.96426815,361.94640222,361.94640223,361.96426813,361.98213406,361.96426814,361.96426814,361.96426813,361.96426813,361.98213406,361.98213406,361.98213405,361.98213405,361.98213407,362,362,361.98213406,361.98213406,361.98213406,361.99999999,361.99999999,361.99999999,361.99999999,361.99999999,361.98213407,361.98213407,361.98213407,361.98213407,361.98213407,361.96426812,361.98213405,361.98213405,361.96426813,361.98213405,361.98213405,361.96426813,361.94640222,361.94640222,361.94640222,361.96426813,361.94640221,361.94640221,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.96426813,361.98213405,361.98213405,361.98213405,361.96426813,361.96426813,361.96426814,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.94640222,361.94640222,361.96426813,361.96426813,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.98213406,361.98213407,361.98213407,361.98213405,361.96426814,361.98213407,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.94640222,361.94640222,361.99999999,361.99999999,361.99999999,362,362,361.99999999,361.99999999,361.99999999,361.99999998,361.99999999,361.99999999,361.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 +235.99708804,235.99708804,235.99708804,115.89221069,115.89221069,115.8922107,115.89221071,115.8922107,115.89221069,115.89221069,115.89221067,115.89221068,115.89221067,115.89221068,0,118.83999998,118.83999998,325.99979399,325.99989698,325.99989699,325.99979401,325.99979401,325.99969096,325.99979397,325.99979399,325.99979401,325.999794,325.999794,325.99989696,325.999794,325.999794,325.99989699,325.99989699,325.999794,325.99989696,325.99979396,325.99989699,325.999897,325.99989705,325.99979399,325.99979399,325.99979403,325.999897,325.99989705,325.99989699,325.99989702,325.99989701,325.99989701,325.99989701,325.999794,361.98213406,361.98213408,361.98213407,361.96426814,361.98213406,361.96426813,361.96426814,361.96426814,361.98213406,361.99999998,361.99999998,361.98213406,361.98213406,361.96426814,361.96426813,361.99999997,361.96426815,361.98213406,361.96426815,361.98213407,361.98213407,361.98213407,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.96426814,361.96426815,361.96426815,361.94640222,361.94640223,361.96426813,361.98213406,361.96426814,361.96426814,361.96426813,361.96426813,361.98213406,361.98213406,361.98213405,361.98213405,361.98213407,362,362,361.98213406,361.98213406,361.98213406,361.99999999,361.99999999,361.99999999,361.99999999,361.99999999,361.98213407,361.98213407,361.98213407,361.98213407,361.98213407,361.96426812,361.98213405,361.98213405,361.96426813,361.98213405,361.98213405,361.96426813,361.94640222,361.94640222,361.94640222,361.96426813,361.94640221,361.94640221,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.96426813,361.98213405,361.98213405,361.98213405,361.96426813,361.96426813,361.96426814,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.94640222,361.94640222,361.96426813,361.96426813,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.98213406,361.98213407,361.98213407,361.98213405,361.96426814,361.98213407,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.94640222,361.94640222,361.99999999,361.99999999,361.99999999,362,362,361.99999999,361.99999999,361.99999999,361.99999998,361.99999999,361.99999999,361.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 +235.99708804,235.99708804,235.99708804,118.83999999,118.83999999,118.84,118.84000001,118.84,118.83999999,118.83999999,118.83999997,118.83999998,118.83999997,118.83999998,118.83999998,0,102.82232778,325.99979399,325.99989698,325.99989699,325.99979401,325.99979401,325.99969096,325.99979397,325.99979399,325.99979401,325.999794,325.999794,325.99989696,325.999794,325.999794,325.99989699,325.99989699,325.999794,325.99989696,325.99979396,325.99989699,325.999897,325.99989705,325.99979399,325.99979399,325.99979403,325.999897,325.99989705,325.99989699,325.99989702,325.99989701,325.99989701,325.99989701,325.999794,361.98213406,361.98213408,361.98213407,361.96426814,361.98213406,361.96426813,361.96426814,361.96426814,361.98213406,361.99999998,361.99999998,361.98213406,361.98213406,361.96426814,361.96426813,361.99999997,361.96426815,361.98213406,361.96426815,361.98213407,361.98213407,361.98213407,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.96426814,361.96426815,361.96426815,361.94640222,361.94640223,361.96426813,361.98213406,361.96426814,361.96426814,361.96426813,361.96426813,361.98213406,361.98213406,361.98213405,361.98213405,361.98213407,362,362,361.98213406,361.98213406,361.98213406,361.99999999,361.99999999,361.99999999,361.99999999,361.99999999,361.98213407,361.98213407,361.98213407,361.98213407,361.98213407,361.96426812,361.98213405,361.98213405,361.96426813,361.98213405,361.98213405,361.96426813,361.94640222,361.94640222,361.94640222,361.96426813,361.94640221,361.94640221,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.96426813,361.98213405,361.98213405,361.98213405,361.96426813,361.96426813,361.96426814,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.94640222,361.94640222,361.96426813,361.96426813,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.98213406,361.98213407,361.98213407,361.98213405,361.96426814,361.98213407,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.94640222,361.94640222,361.99999999,361.99999999,361.99999999,362,362,361.99999999,361.99999999,361.99999999,361.99999998,361.99999999,361.99999999,361.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 +235.99708804,235.99708804,235.99708804,118.83999999,118.83999999,118.84,118.84000001,118.84,118.83999999,118.83999999,118.83999997,118.83999998,118.83999997,118.83999998,118.83999998,102.82232778,0,325.99979399,325.99989698,325.99989699,325.99979401,325.99979401,325.99969096,325.99979397,325.99979399,325.99979401,325.999794,325.999794,325.99989696,325.999794,325.999794,325.99989699,325.99989699,325.999794,325.99989696,325.99979396,325.99989699,325.999897,325.99989705,325.99979399,325.99979399,325.99979403,325.999897,325.99989705,325.99989699,325.99989702,325.99989701,325.99989701,325.99989701,325.999794,361.98213406,361.98213408,361.98213407,361.96426814,361.98213406,361.96426813,361.96426814,361.96426814,361.98213406,361.99999998,361.99999998,361.98213406,361.98213406,361.96426814,361.96426813,361.99999997,361.96426815,361.98213406,361.96426815,361.98213407,361.98213407,361.98213407,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.96426814,361.96426815,361.96426815,361.94640222,361.94640223,361.96426813,361.98213406,361.96426814,361.96426814,361.96426813,361.96426813,361.98213406,361.98213406,361.98213405,361.98213405,361.98213407,362,362,361.98213406,361.98213406,361.98213406,361.99999999,361.99999999,361.99999999,361.99999999,361.99999999,361.98213407,361.98213407,361.98213407,361.98213407,361.98213407,361.96426812,361.98213405,361.98213405,361.96426813,361.98213405,361.98213405,361.96426813,361.94640222,361.94640222,361.94640222,361.96426813,361.94640221,361.94640221,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.96426813,361.98213405,361.98213405,361.98213405,361.96426813,361.96426813,361.96426814,361.96426814,361.96426814,361.96426813,361.96426813,361.96426814,361.94640222,361.94640222,361.96426813,361.96426813,361.96426813,361.96426813,361.98213405,361.98213405,361.98213406,361.98213406,361.98213406,361.98213407,361.98213407,361.98213405,361.96426814,361.98213407,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.96426814,361.94640222,361.94640222,361.99999999,361.99999999,361.99999999,362,362,361.99999999,361.99999999,361.99999999,361.99999998,361.99999999,361.99999999,361.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 +325.99688205,325.99688205,325.99688205,325.999794,325.999794,325.99979401,325.99979402,325.99979401,325.999794,325.999794,325.99979398,325.99979399,325.99979398,325.99979399,325.99979399,325.99979399,325.99979399,0,128.52612993,128.52612994,128.52602696,128.52602696,205.99948497,205.99958798,205.999588,205.99958802,205.99958801,205.99958801,205.99969097,205.99958801,205.99958801,205.999691,205.999691,205.99958801,205.99969097,205.99958797,205.999691,205.99969101,205.99969106,205.999588,205.999588,205.99958804,205.99969101,205.99969106,205.999691,205.99969103,205.99969102,205.99969102,205.99969102,205.99958801,361.98192807,361.98192809,361.98192808,361.96406215,361.98192807,361.96406214,361.96406215,361.96406215,361.98192807,361.99979399,361.99979399,361.98192807,361.98192807,361.96406215,361.96406214,361.99979398,361.96406216,361.98192807,361.96406216,361.98192808,361.98192808,361.98192808,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.96406215,361.96406216,361.96406216,361.94619623,361.94619624,361.96406214,361.98192807,361.96406215,361.96406215,361.96406214,361.96406214,361.98192807,361.98192807,361.98192806,361.98192806,361.98192808,361.99979401,361.99979401,361.98192807,361.98192807,361.98192807,361.999794,361.999794,361.999794,361.999794,361.999794,361.98192808,361.98192808,361.98192808,361.98192808,361.98192808,361.96406213,361.98192806,361.98192806,361.96406214,361.98192806,361.98192806,361.96406214,361.94619623,361.94619623,361.94619623,361.96406214,361.94619622,361.94619622,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.96406214,361.98192806,361.98192806,361.98192806,361.96406214,361.96406214,361.96406215,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.94619623,361.94619623,361.96406214,361.96406214,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.98192807,361.98192808,361.98192808,361.98192806,361.96406215,361.98192808,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.94619623,361.94619623,361.999794,361.999794,361.999794,361.99979401,361.99979401,361.999794,361.999794,361.999794,361.99979399,361.999794,361.999794,361.99979399,387.999794,387.999794,387.999794,387.99979399,387.99979401,387.999794,387.999793979,387.999793979,387.999793982,387.999793984,387.999793983,387.999793984,387.999793985,387.999793985,387.99979398,387.999794,387.99979398,387.99979398,427.999794,427.999794,427.999794 +325.99698504,325.99698504,325.99698504,325.99989699,325.99989699,325.999897,325.99989701,325.999897,325.99989699,325.99989699,325.99989697,325.99989698,325.99989697,325.99989698,325.99989698,325.99989698,325.99989698,128.52612993,0,49.68751261,117.16257469,117.16257469,205.99958796,205.99969097,205.99969099,205.99969101,205.999691,205.999691,205.99979396,205.999691,205.999691,205.99979399,205.99979399,205.999691,205.99979396,205.99969096,205.99979399,205.999794,205.99979405,205.99969099,205.99969099,205.99969103,205.999794,205.99979405,205.99979399,205.99979402,205.99979401,205.99979401,205.99979401,205.999691,361.98203106,361.98203108,361.98203107,361.96416514,361.98203106,361.96416513,361.96416514,361.96416514,361.98203106,361.99989698,361.99989698,361.98203106,361.98203106,361.96416514,361.96416513,361.99989697,361.96416515,361.98203106,361.96416515,361.98203107,361.98203107,361.98203107,361.96416514,361.96416514,361.96416513,361.96416513,361.96416514,361.96416514,361.96416515,361.96416515,361.94629922,361.94629923,361.96416513,361.98203106,361.96416514,361.96416514,361.96416513,361.96416513,361.98203106,361.98203106,361.98203105,361.98203105,361.98203107,361.999897,361.999897,361.98203106,361.98203106,361.98203106,361.99989699,361.99989699,361.99989699,361.99989699,361.99989699,361.98203107,361.98203107,361.98203107,361.98203107,361.98203107,361.96416512,361.98203105,361.98203105,361.96416513,361.98203105,361.98203105,361.96416513,361.94629922,361.94629922,361.94629922,361.96416513,361.94629921,361.94629921,361.96416513,361.96416513,361.98203105,361.98203105,361.98203106,361.98203106,361.96416513,361.98203105,361.98203105,361.98203105,361.96416513,361.96416513,361.96416514,361.96416514,361.96416514,361.96416513,361.96416513,361.96416514,361.94629922,361.94629922,361.96416513,361.96416513,361.96416513,361.96416513,361.98203105,361.98203105,361.98203106,361.98203106,361.98203106,361.98203107,361.98203107,361.98203105,361.96416514,361.98203107,361.96416514,361.96416514,361.96416514,361.96416514,361.96416514,361.96416514,361.96416514,361.94629922,361.94629922,361.99989699,361.99989699,361.99989699,361.999897,361.999897,361.99989699,361.99989699,361.99989699,361.99989698,361.99989699,361.99989699,361.99989698,387.99989699,387.99989699,387.99989699,387.99989698,387.999897,387.99989699,387.999896969,387.999896969,387.999896972,387.999896974,387.999896973,387.999896974,387.999896975,387.999896975,387.99989697,387.99989699,387.99989697,387.99989697,427.99989699,427.99989699,427.99989699 +325.99698505,325.99698505,325.99698505,325.999897,325.999897,325.99989701,325.99989702,325.99989701,325.999897,325.999897,325.99989698,325.99989699,325.99989698,325.99989699,325.99989699,325.99989699,325.99989699,128.52612994,49.68751261,0,117.1625747,117.1625747,205.99958797,205.99969098,205.999691,205.99969102,205.99969101,205.99969101,205.99979397,205.99969101,205.99969101,205.999794,205.999794,205.99969101,205.99979397,205.99969097,205.999794,205.99979401,205.99979406,205.999691,205.999691,205.99969104,205.99979401,205.99979406,205.999794,205.99979403,205.99979402,205.99979402,205.99979402,205.99969101,361.98203107,361.98203109,361.98203108,361.96416515,361.98203107,361.96416514,361.96416515,361.96416515,361.98203107,361.99989699,361.99989699,361.98203107,361.98203107,361.96416515,361.96416514,361.99989698,361.96416516,361.98203107,361.96416516,361.98203108,361.98203108,361.98203108,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.96416515,361.96416516,361.96416516,361.94629923,361.94629924,361.96416514,361.98203107,361.96416515,361.96416515,361.96416514,361.96416514,361.98203107,361.98203107,361.98203106,361.98203106,361.98203108,361.99989701,361.99989701,361.98203107,361.98203107,361.98203107,361.999897,361.999897,361.999897,361.999897,361.999897,361.98203108,361.98203108,361.98203108,361.98203108,361.98203108,361.96416513,361.98203106,361.98203106,361.96416514,361.98203106,361.98203106,361.96416514,361.94629923,361.94629923,361.94629923,361.96416514,361.94629922,361.94629922,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.96416514,361.98203106,361.98203106,361.98203106,361.96416514,361.96416514,361.96416515,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.94629923,361.94629923,361.96416514,361.96416514,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.98203107,361.98203108,361.98203108,361.98203106,361.96416515,361.98203108,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.94629923,361.94629923,361.999897,361.999897,361.999897,361.99989701,361.99989701,361.999897,361.999897,361.999897,361.99989699,361.999897,361.999897,361.99989699,387.999897,387.999897,387.999897,387.99989699,387.99989701,387.999897,387.999896979,387.999896979,387.999896982,387.999896984,387.999896983,387.999896984,387.999896985,387.999896985,387.99989698,387.999897,387.99989698,387.99989698,427.999897,427.999897,427.999897 +325.99688207,325.99688207,325.99688207,325.99979402,325.99979402,325.99979403,325.99979404,325.99979403,325.99979402,325.99979402,325.999794,325.99979401,325.999794,325.99979401,325.99979401,325.99979401,325.99979401,128.52602696,117.16257469,117.1625747,0,107.14471176,205.99948499,205.999588,205.99958802,205.99958804,205.99958803,205.99958803,205.99969099,205.99958803,205.99958803,205.99969102,205.99969102,205.99958803,205.99969099,205.99958799,205.99969102,205.99969103,205.99969108,205.99958802,205.99958802,205.99958806,205.99969103,205.99969108,205.99969102,205.99969105,205.99969104,205.99969104,205.99969104,205.99958803,361.98192809,361.98192811,361.9819281,361.96406217,361.98192809,361.96406216,361.96406217,361.96406217,361.98192809,361.99979401,361.99979401,361.98192809,361.98192809,361.96406217,361.96406216,361.999794,361.96406218,361.98192809,361.96406218,361.9819281,361.9819281,361.9819281,361.96406217,361.96406217,361.96406216,361.96406216,361.96406217,361.96406217,361.96406218,361.96406218,361.94619625,361.94619626,361.96406216,361.98192809,361.96406217,361.96406217,361.96406216,361.96406216,361.98192809,361.98192809,361.98192808,361.98192808,361.9819281,361.99979403,361.99979403,361.98192809,361.98192809,361.98192809,361.99979402,361.99979402,361.99979402,361.99979402,361.99979402,361.9819281,361.9819281,361.9819281,361.9819281,361.9819281,361.96406215,361.98192808,361.98192808,361.96406216,361.98192808,361.98192808,361.96406216,361.94619625,361.94619625,361.94619625,361.96406216,361.94619624,361.94619624,361.96406216,361.96406216,361.98192808,361.98192808,361.98192809,361.98192809,361.96406216,361.98192808,361.98192808,361.98192808,361.96406216,361.96406216,361.96406217,361.96406217,361.96406217,361.96406216,361.96406216,361.96406217,361.94619625,361.94619625,361.96406216,361.96406216,361.96406216,361.96406216,361.98192808,361.98192808,361.98192809,361.98192809,361.98192809,361.9819281,361.9819281,361.98192808,361.96406217,361.9819281,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.94619625,361.94619625,361.99979402,361.99979402,361.99979402,361.99979403,361.99979403,361.99979402,361.99979402,361.99979402,361.99979401,361.99979402,361.99979402,361.99979401,387.99979402,387.99979402,387.99979402,387.99979401,387.99979403,387.99979402,387.999793999,387.999793999,387.999794002,387.999794004,387.999794003,387.999794004,387.999794005,387.999794005,387.999794,387.99979402,387.999794,387.999794,427.99979402,427.99979402,427.99979402 +325.99688207,325.99688207,325.99688207,325.99979402,325.99979402,325.99979403,325.99979404,325.99979403,325.99979402,325.99979402,325.999794,325.99979401,325.999794,325.99979401,325.99979401,325.99979401,325.99979401,128.52602696,117.16257469,117.1625747,107.14471176,0,205.99948499,205.999588,205.99958802,205.99958804,205.99958803,205.99958803,205.99969099,205.99958803,205.99958803,205.99969102,205.99969102,205.99958803,205.99969099,205.99958799,205.99969102,205.99969103,205.99969108,205.99958802,205.99958802,205.99958806,205.99969103,205.99969108,205.99969102,205.99969105,205.99969104,205.99969104,205.99969104,205.99958803,361.98192809,361.98192811,361.9819281,361.96406217,361.98192809,361.96406216,361.96406217,361.96406217,361.98192809,361.99979401,361.99979401,361.98192809,361.98192809,361.96406217,361.96406216,361.999794,361.96406218,361.98192809,361.96406218,361.9819281,361.9819281,361.9819281,361.96406217,361.96406217,361.96406216,361.96406216,361.96406217,361.96406217,361.96406218,361.96406218,361.94619625,361.94619626,361.96406216,361.98192809,361.96406217,361.96406217,361.96406216,361.96406216,361.98192809,361.98192809,361.98192808,361.98192808,361.9819281,361.99979403,361.99979403,361.98192809,361.98192809,361.98192809,361.99979402,361.99979402,361.99979402,361.99979402,361.99979402,361.9819281,361.9819281,361.9819281,361.9819281,361.9819281,361.96406215,361.98192808,361.98192808,361.96406216,361.98192808,361.98192808,361.96406216,361.94619625,361.94619625,361.94619625,361.96406216,361.94619624,361.94619624,361.96406216,361.96406216,361.98192808,361.98192808,361.98192809,361.98192809,361.96406216,361.98192808,361.98192808,361.98192808,361.96406216,361.96406216,361.96406217,361.96406217,361.96406217,361.96406216,361.96406216,361.96406217,361.94619625,361.94619625,361.96406216,361.96406216,361.96406216,361.96406216,361.98192808,361.98192808,361.98192809,361.98192809,361.98192809,361.9819281,361.9819281,361.98192808,361.96406217,361.9819281,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.94619625,361.94619625,361.99979402,361.99979402,361.99979402,361.99979403,361.99979403,361.99979402,361.99979402,361.99979402,361.99979401,361.99979402,361.99979402,361.99979401,387.99979402,387.99979402,387.99979402,387.99979401,387.99979403,387.99979402,387.999793999,387.999793999,387.999794002,387.999794004,387.999794003,387.999794004,387.999794005,387.999794005,387.999794,387.99979402,387.999794,387.999794,427.99979402,427.99979402,427.99979402 +325.99677902,325.99677902,325.99677902,325.99969097,325.99969097,325.99969098,325.99969099,325.99969098,325.99969097,325.99969097,325.99969095,325.99969096,325.99969095,325.99969096,325.99969096,325.99969096,325.99969096,205.99948497,205.99958796,205.99958797,205.99948499,205.99948499,0,62.08652477,70.93935709,146.24127051,146.2412705,146.2412705,164.34173326,164.3416303,164.3416303,164.34173329,164.34173329,164.3416303,164.34173326,164.34163026,164.34173329,164.3417333,164.34173335,164.34163029,164.34163029,164.34163033,164.3417333,164.34173335,164.34173329,177.66578668,177.66578667,177.66578667,177.66578667,177.66568366,361.98182504,361.98182506,361.98182505,361.96395912,361.98182504,361.96395911,361.96395912,361.96395912,361.98182504,361.99969096,361.99969096,361.98182504,361.98182504,361.96395912,361.96395911,361.99969095,361.96395913,361.98182504,361.96395913,361.98182505,361.98182505,361.98182505,361.96395912,361.96395912,361.96395911,361.96395911,361.96395912,361.96395912,361.96395913,361.96395913,361.9460932,361.94609321,361.96395911,361.98182504,361.96395912,361.96395912,361.96395911,361.96395911,361.98182504,361.98182504,361.98182503,361.98182503,361.98182505,361.99969098,361.99969098,361.98182504,361.98182504,361.98182504,361.99969097,361.99969097,361.99969097,361.99969097,361.99969097,361.98182505,361.98182505,361.98182505,361.98182505,361.98182505,361.9639591,361.98182503,361.98182503,361.96395911,361.98182503,361.98182503,361.96395911,361.9460932,361.9460932,361.9460932,361.96395911,361.94609319,361.94609319,361.96395911,361.96395911,361.98182503,361.98182503,361.98182504,361.98182504,361.96395911,361.98182503,361.98182503,361.98182503,361.96395911,361.96395911,361.96395912,361.96395912,361.96395912,361.96395911,361.96395911,361.96395912,361.9460932,361.9460932,361.96395911,361.96395911,361.96395911,361.96395911,361.98182503,361.98182503,361.98182504,361.98182504,361.98182504,361.98182505,361.98182505,361.98182503,361.96395912,361.98182505,361.96395912,361.96395912,361.96395912,361.96395912,361.96395912,361.96395912,361.96395912,361.9460932,361.9460932,361.99969097,361.99969097,361.99969097,361.99969098,361.99969098,361.99969097,361.99969097,361.99969097,361.99969096,361.99969097,361.99969097,361.99969096,387.99969097,387.99969097,387.99969097,387.99969096,387.99969098,387.99969097,387.999690949,387.999690949,387.999690952,387.999690954,387.999690953,387.999690954,387.999690955,387.999690955,387.99969095,387.99969097,387.99969095,387.99969095,427.99969097,427.99969097,427.99969097 +325.99688203,325.99688203,325.99688203,325.99979398,325.99979398,325.99979399,325.999794,325.99979399,325.99979398,325.99979398,325.99979396,325.99979397,325.99979396,325.99979397,325.99979397,325.99979397,325.99979397,205.99958798,205.99969097,205.99969098,205.999588,205.999588,62.08652477,0,70.9394601,146.24137352,146.24137351,146.24137351,164.34183627,164.34173331,164.34173331,164.3418363,164.3418363,164.34173331,164.34183627,164.34173327,164.3418363,164.34183631,164.34183636,164.3417333,164.3417333,164.34173334,164.34183631,164.34183636,164.3418363,177.66588969,177.66588968,177.66588968,177.66588968,177.66578667,361.98192805,361.98192807,361.98192806,361.96406213,361.98192805,361.96406212,361.96406213,361.96406213,361.98192805,361.99979397,361.99979397,361.98192805,361.98192805,361.96406213,361.96406212,361.99979396,361.96406214,361.98192805,361.96406214,361.98192806,361.98192806,361.98192806,361.96406213,361.96406213,361.96406212,361.96406212,361.96406213,361.96406213,361.96406214,361.96406214,361.94619621,361.94619622,361.96406212,361.98192805,361.96406213,361.96406213,361.96406212,361.96406212,361.98192805,361.98192805,361.98192804,361.98192804,361.98192806,361.99979399,361.99979399,361.98192805,361.98192805,361.98192805,361.99979398,361.99979398,361.99979398,361.99979398,361.99979398,361.98192806,361.98192806,361.98192806,361.98192806,361.98192806,361.96406211,361.98192804,361.98192804,361.96406212,361.98192804,361.98192804,361.96406212,361.94619621,361.94619621,361.94619621,361.96406212,361.9461962,361.9461962,361.96406212,361.96406212,361.98192804,361.98192804,361.98192805,361.98192805,361.96406212,361.98192804,361.98192804,361.98192804,361.96406212,361.96406212,361.96406213,361.96406213,361.96406213,361.96406212,361.96406212,361.96406213,361.94619621,361.94619621,361.96406212,361.96406212,361.96406212,361.96406212,361.98192804,361.98192804,361.98192805,361.98192805,361.98192805,361.98192806,361.98192806,361.98192804,361.96406213,361.98192806,361.96406213,361.96406213,361.96406213,361.96406213,361.96406213,361.96406213,361.96406213,361.94619621,361.94619621,361.99979398,361.99979398,361.99979398,361.99979399,361.99979399,361.99979398,361.99979398,361.99979398,361.99979397,361.99979398,361.99979398,361.99979397,387.99979398,387.99979398,387.99979398,387.99979397,387.99979399,387.99979398,387.999793959,387.999793959,387.999793962,387.999793964,387.999793963,387.999793964,387.999793965,387.999793965,387.99979396,387.99979398,387.99979396,387.99979396,427.99979398,427.99979398,427.99979398 +325.99688205,325.99688205,325.99688205,325.999794,325.999794,325.99979401,325.99979402,325.99979401,325.999794,325.999794,325.99979398,325.99979399,325.99979398,325.99979399,325.99979399,325.99979399,325.99979399,205.999588,205.99969099,205.999691,205.99958802,205.99958802,70.93935709,70.9394601,0,146.24137354,146.24137353,146.24137353,164.34183629,164.34173333,164.34173333,164.34183632,164.34183632,164.34173333,164.34183629,164.34173329,164.34183632,164.34183633,164.34183638,164.34173332,164.34173332,164.34173336,164.34183633,164.34183638,164.34183632,177.66588971,177.6658897,177.6658897,177.6658897,177.66578669,361.98192807,361.98192809,361.98192808,361.96406215,361.98192807,361.96406214,361.96406215,361.96406215,361.98192807,361.99979399,361.99979399,361.98192807,361.98192807,361.96406215,361.96406214,361.99979398,361.96406216,361.98192807,361.96406216,361.98192808,361.98192808,361.98192808,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.96406215,361.96406216,361.96406216,361.94619623,361.94619624,361.96406214,361.98192807,361.96406215,361.96406215,361.96406214,361.96406214,361.98192807,361.98192807,361.98192806,361.98192806,361.98192808,361.99979401,361.99979401,361.98192807,361.98192807,361.98192807,361.999794,361.999794,361.999794,361.999794,361.999794,361.98192808,361.98192808,361.98192808,361.98192808,361.98192808,361.96406213,361.98192806,361.98192806,361.96406214,361.98192806,361.98192806,361.96406214,361.94619623,361.94619623,361.94619623,361.96406214,361.94619622,361.94619622,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.96406214,361.98192806,361.98192806,361.98192806,361.96406214,361.96406214,361.96406215,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.94619623,361.94619623,361.96406214,361.96406214,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.98192807,361.98192808,361.98192808,361.98192806,361.96406215,361.98192808,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.94619623,361.94619623,361.999794,361.999794,361.999794,361.99979401,361.99979401,361.999794,361.999794,361.999794,361.99979399,361.999794,361.999794,361.99979399,387.999794,387.999794,387.999794,387.99979399,387.99979401,387.999794,387.999793979,387.999793979,387.999793982,387.999793984,387.999793983,387.999793984,387.999793985,387.999793985,387.99979398,387.999794,387.99979398,387.99979398,427.999794,427.999794,427.999794 +325.99688207,325.99688207,325.99688207,325.99979402,325.99979402,325.99979403,325.99979404,325.99979403,325.99979402,325.99979402,325.999794,325.99979401,325.999794,325.99979401,325.99979401,325.99979401,325.99979401,205.99958802,205.99969101,205.99969102,205.99958804,205.99958804,146.24127051,146.24137352,146.24137354,0,119.91812819,119.91812819,164.34183631,164.34173335,164.34173335,164.34183634,164.34183634,164.34173335,164.34183631,164.34173331,164.34183634,164.34183635,164.3418364,164.34173334,164.34173334,164.34173338,164.34183635,164.3418364,164.34183634,177.66588973,177.66588972,177.66588972,177.66588972,177.66578671,361.98192809,361.98192811,361.9819281,361.96406217,361.98192809,361.96406216,361.96406217,361.96406217,361.98192809,361.99979401,361.99979401,361.98192809,361.98192809,361.96406217,361.96406216,361.999794,361.96406218,361.98192809,361.96406218,361.9819281,361.9819281,361.9819281,361.96406217,361.96406217,361.96406216,361.96406216,361.96406217,361.96406217,361.96406218,361.96406218,361.94619625,361.94619626,361.96406216,361.98192809,361.96406217,361.96406217,361.96406216,361.96406216,361.98192809,361.98192809,361.98192808,361.98192808,361.9819281,361.99979403,361.99979403,361.98192809,361.98192809,361.98192809,361.99979402,361.99979402,361.99979402,361.99979402,361.99979402,361.9819281,361.9819281,361.9819281,361.9819281,361.9819281,361.96406215,361.98192808,361.98192808,361.96406216,361.98192808,361.98192808,361.96406216,361.94619625,361.94619625,361.94619625,361.96406216,361.94619624,361.94619624,361.96406216,361.96406216,361.98192808,361.98192808,361.98192809,361.98192809,361.96406216,361.98192808,361.98192808,361.98192808,361.96406216,361.96406216,361.96406217,361.96406217,361.96406217,361.96406216,361.96406216,361.96406217,361.94619625,361.94619625,361.96406216,361.96406216,361.96406216,361.96406216,361.98192808,361.98192808,361.98192809,361.98192809,361.98192809,361.9819281,361.9819281,361.98192808,361.96406217,361.9819281,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.96406217,361.94619625,361.94619625,361.99979402,361.99979402,361.99979402,361.99979403,361.99979403,361.99979402,361.99979402,361.99979402,361.99979401,361.99979402,361.99979402,361.99979401,387.99979402,387.99979402,387.99979402,387.99979401,387.99979403,387.99979402,387.999793999,387.999793999,387.999794002,387.999794004,387.999794003,387.999794004,387.999794005,387.999794005,387.999794,387.99979402,387.999794,387.999794,427.99979402,427.99979402,427.99979402 +325.99688206,325.99688206,325.99688206,325.99979401,325.99979401,325.99979402,325.99979403,325.99979402,325.99979401,325.99979401,325.99979399,325.999794,325.99979399,325.999794,325.999794,325.999794,325.999794,205.99958801,205.999691,205.99969101,205.99958803,205.99958803,146.2412705,146.24137351,146.24137353,119.91812819,0,84.62813276,164.3418363,164.34173334,164.34173334,164.34183633,164.34183633,164.34173334,164.3418363,164.3417333,164.34183633,164.34183634,164.34183639,164.34173333,164.34173333,164.34173337,164.34183634,164.34183639,164.34183633,177.66588972,177.66588971,177.66588971,177.66588971,177.6657867,361.98192808,361.9819281,361.98192809,361.96406216,361.98192808,361.96406215,361.96406216,361.96406216,361.98192808,361.999794,361.999794,361.98192808,361.98192808,361.96406216,361.96406215,361.99979399,361.96406217,361.98192808,361.96406217,361.98192809,361.98192809,361.98192809,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.96406216,361.96406217,361.96406217,361.94619624,361.94619625,361.96406215,361.98192808,361.96406216,361.96406216,361.96406215,361.96406215,361.98192808,361.98192808,361.98192807,361.98192807,361.98192809,361.99979402,361.99979402,361.98192808,361.98192808,361.98192808,361.99979401,361.99979401,361.99979401,361.99979401,361.99979401,361.98192809,361.98192809,361.98192809,361.98192809,361.98192809,361.96406214,361.98192807,361.98192807,361.96406215,361.98192807,361.98192807,361.96406215,361.94619624,361.94619624,361.94619624,361.96406215,361.94619623,361.94619623,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.96406215,361.98192807,361.98192807,361.98192807,361.96406215,361.96406215,361.96406216,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.94619624,361.94619624,361.96406215,361.96406215,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.98192808,361.98192809,361.98192809,361.98192807,361.96406216,361.98192809,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.94619624,361.94619624,361.99979401,361.99979401,361.99979401,361.99979402,361.99979402,361.99979401,361.99979401,361.99979401,361.999794,361.99979401,361.99979401,361.999794,387.99979401,387.99979401,387.99979401,387.999794,387.99979402,387.99979401,387.999793989,387.999793989,387.999793992,387.999793994,387.999793993,387.999793994,387.999793995,387.999793995,387.99979399,387.99979401,387.99979399,387.99979399,427.99979401,427.99979401,427.99979401 +325.99688206,325.99688206,325.99688206,325.99979401,325.99979401,325.99979402,325.99979403,325.99979402,325.99979401,325.99979401,325.99979399,325.999794,325.99979399,325.999794,325.999794,325.999794,325.999794,205.99958801,205.999691,205.99969101,205.99958803,205.99958803,146.2412705,146.24137351,146.24137353,119.91812819,84.62813276,0,164.3418363,164.34173334,164.34173334,164.34183633,164.34183633,164.34173334,164.3418363,164.3417333,164.34183633,164.34183634,164.34183639,164.34173333,164.34173333,164.34173337,164.34183634,164.34183639,164.34183633,177.66588972,177.66588971,177.66588971,177.66588971,177.6657867,361.98192808,361.9819281,361.98192809,361.96406216,361.98192808,361.96406215,361.96406216,361.96406216,361.98192808,361.999794,361.999794,361.98192808,361.98192808,361.96406216,361.96406215,361.99979399,361.96406217,361.98192808,361.96406217,361.98192809,361.98192809,361.98192809,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.96406216,361.96406217,361.96406217,361.94619624,361.94619625,361.96406215,361.98192808,361.96406216,361.96406216,361.96406215,361.96406215,361.98192808,361.98192808,361.98192807,361.98192807,361.98192809,361.99979402,361.99979402,361.98192808,361.98192808,361.98192808,361.99979401,361.99979401,361.99979401,361.99979401,361.99979401,361.98192809,361.98192809,361.98192809,361.98192809,361.98192809,361.96406214,361.98192807,361.98192807,361.96406215,361.98192807,361.98192807,361.96406215,361.94619624,361.94619624,361.94619624,361.96406215,361.94619623,361.94619623,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.96406215,361.98192807,361.98192807,361.98192807,361.96406215,361.96406215,361.96406216,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.94619624,361.94619624,361.96406215,361.96406215,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.98192808,361.98192809,361.98192809,361.98192807,361.96406216,361.98192809,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.94619624,361.94619624,361.99979401,361.99979401,361.99979401,361.99979402,361.99979402,361.99979401,361.99979401,361.99979401,361.999794,361.99979401,361.99979401,361.999794,387.99979401,387.99979401,387.99979401,387.999794,387.99979402,387.99979401,387.999793989,387.999793989,387.999793992,387.999793994,387.999793993,387.999793994,387.999793995,387.999793995,387.99979399,387.99979401,387.99979399,387.99979399,427.99979401,427.99979401,427.99979401 +325.99698502,325.99698502,325.99698502,325.99989697,325.99989697,325.99989698,325.99989699,325.99989698,325.99989697,325.99989697,325.99989695,325.99989696,325.99989695,325.99989696,325.99989696,325.99989696,325.99989696,205.99969097,205.99979396,205.99979397,205.99969099,205.99969099,164.34173326,164.34183627,164.34183629,164.34183631,164.3418363,164.3418363,0,133.90292518,133.90292518,133.90302817,133.90302817,134.52030594,134.5204089,134.5203059,134.52040893,134.52040894,134.52040899,134.52030593,134.52030593,134.52030597,134.52040894,134.52040899,134.52040893,177.66599268,177.66599267,177.66599267,177.66599267,177.66588966,361.98203104,361.98203106,361.98203105,361.96416512,361.98203104,361.96416511,361.96416512,361.96416512,361.98203104,361.99989696,361.99989696,361.98203104,361.98203104,361.96416512,361.96416511,361.99989695,361.96416513,361.98203104,361.96416513,361.98203105,361.98203105,361.98203105,361.96416512,361.96416512,361.96416511,361.96416511,361.96416512,361.96416512,361.96416513,361.96416513,361.9462992,361.94629921,361.96416511,361.98203104,361.96416512,361.96416512,361.96416511,361.96416511,361.98203104,361.98203104,361.98203103,361.98203103,361.98203105,361.99989698,361.99989698,361.98203104,361.98203104,361.98203104,361.99989697,361.99989697,361.99989697,361.99989697,361.99989697,361.98203105,361.98203105,361.98203105,361.98203105,361.98203105,361.9641651,361.98203103,361.98203103,361.96416511,361.98203103,361.98203103,361.96416511,361.9462992,361.9462992,361.9462992,361.96416511,361.94629919,361.94629919,361.96416511,361.96416511,361.98203103,361.98203103,361.98203104,361.98203104,361.96416511,361.98203103,361.98203103,361.98203103,361.96416511,361.96416511,361.96416512,361.96416512,361.96416512,361.96416511,361.96416511,361.96416512,361.9462992,361.9462992,361.96416511,361.96416511,361.96416511,361.96416511,361.98203103,361.98203103,361.98203104,361.98203104,361.98203104,361.98203105,361.98203105,361.98203103,361.96416512,361.98203105,361.96416512,361.96416512,361.96416512,361.96416512,361.96416512,361.96416512,361.96416512,361.9462992,361.9462992,361.99989697,361.99989697,361.99989697,361.99989698,361.99989698,361.99989697,361.99989697,361.99989697,361.99989696,361.99989697,361.99989697,361.99989696,387.99989697,387.99989697,387.99989697,387.99989696,387.99989698,387.99989697,387.999896949,387.999896949,387.999896952,387.999896954,387.999896953,387.999896954,387.999896955,387.999896955,387.99989695,387.99989697,387.99989695,387.99989695,427.99989697,427.99989697,427.99989697 +325.99688206,325.99688206,325.99688206,325.99979401,325.99979401,325.99979402,325.99979403,325.99979402,325.99979401,325.99979401,325.99979399,325.999794,325.99979399,325.999794,325.999794,325.999794,325.999794,205.99958801,205.999691,205.99969101,205.99958803,205.99958803,164.3416303,164.34173331,164.34173333,164.34173335,164.34173334,164.34173334,133.90292518,0,21.34715026,79.10394481,79.10394481,134.52020298,134.52030594,134.52020294,134.52030597,134.52030598,134.52030603,134.52020297,134.52020297,134.52020301,134.52030598,134.52030603,134.52030597,177.66588972,177.66588971,177.66588971,177.66588971,177.6657867,361.98192808,361.9819281,361.98192809,361.96406216,361.98192808,361.96406215,361.96406216,361.96406216,361.98192808,361.999794,361.999794,361.98192808,361.98192808,361.96406216,361.96406215,361.99979399,361.96406217,361.98192808,361.96406217,361.98192809,361.98192809,361.98192809,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.96406216,361.96406217,361.96406217,361.94619624,361.94619625,361.96406215,361.98192808,361.96406216,361.96406216,361.96406215,361.96406215,361.98192808,361.98192808,361.98192807,361.98192807,361.98192809,361.99979402,361.99979402,361.98192808,361.98192808,361.98192808,361.99979401,361.99979401,361.99979401,361.99979401,361.99979401,361.98192809,361.98192809,361.98192809,361.98192809,361.98192809,361.96406214,361.98192807,361.98192807,361.96406215,361.98192807,361.98192807,361.96406215,361.94619624,361.94619624,361.94619624,361.96406215,361.94619623,361.94619623,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.96406215,361.98192807,361.98192807,361.98192807,361.96406215,361.96406215,361.96406216,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.94619624,361.94619624,361.96406215,361.96406215,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.98192808,361.98192809,361.98192809,361.98192807,361.96406216,361.98192809,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.94619624,361.94619624,361.99979401,361.99979401,361.99979401,361.99979402,361.99979402,361.99979401,361.99979401,361.99979401,361.999794,361.99979401,361.99979401,361.999794,387.99979401,387.99979401,387.99979401,387.999794,387.99979402,387.99979401,387.999793989,387.999793989,387.999793992,387.999793994,387.999793993,387.999793994,387.999793995,387.999793995,387.99979399,387.99979401,387.99979399,387.99979399,427.99979401,427.99979401,427.99979401 +325.99688206,325.99688206,325.99688206,325.99979401,325.99979401,325.99979402,325.99979403,325.99979402,325.99979401,325.99979401,325.99979399,325.999794,325.99979399,325.999794,325.999794,325.999794,325.999794,205.99958801,205.999691,205.99969101,205.99958803,205.99958803,164.3416303,164.34173331,164.34173333,164.34173335,164.34173334,164.34173334,133.90292518,21.34715026,0,79.10394481,79.10394481,134.52020298,134.52030594,134.52020294,134.52030597,134.52030598,134.52030603,134.52020297,134.52020297,134.52020301,134.52030598,134.52030603,134.52030597,177.66588972,177.66588971,177.66588971,177.66588971,177.6657867,361.98192808,361.9819281,361.98192809,361.96406216,361.98192808,361.96406215,361.96406216,361.96406216,361.98192808,361.999794,361.999794,361.98192808,361.98192808,361.96406216,361.96406215,361.99979399,361.96406217,361.98192808,361.96406217,361.98192809,361.98192809,361.98192809,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.96406216,361.96406217,361.96406217,361.94619624,361.94619625,361.96406215,361.98192808,361.96406216,361.96406216,361.96406215,361.96406215,361.98192808,361.98192808,361.98192807,361.98192807,361.98192809,361.99979402,361.99979402,361.98192808,361.98192808,361.98192808,361.99979401,361.99979401,361.99979401,361.99979401,361.99979401,361.98192809,361.98192809,361.98192809,361.98192809,361.98192809,361.96406214,361.98192807,361.98192807,361.96406215,361.98192807,361.98192807,361.96406215,361.94619624,361.94619624,361.94619624,361.96406215,361.94619623,361.94619623,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.96406215,361.98192807,361.98192807,361.98192807,361.96406215,361.96406215,361.96406216,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.94619624,361.94619624,361.96406215,361.96406215,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.98192808,361.98192809,361.98192809,361.98192807,361.96406216,361.98192809,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.94619624,361.94619624,361.99979401,361.99979401,361.99979401,361.99979402,361.99979402,361.99979401,361.99979401,361.99979401,361.999794,361.99979401,361.99979401,361.999794,387.99979401,387.99979401,387.99979401,387.999794,387.99979402,387.99979401,387.999793989,387.999793989,387.999793992,387.999793994,387.999793993,387.999793994,387.999793995,387.999793995,387.99979399,387.99979401,387.99979399,387.99979399,427.99979401,427.99979401,427.99979401 +325.99698505,325.99698505,325.99698505,325.999897,325.999897,325.99989701,325.99989702,325.99989701,325.999897,325.999897,325.99989698,325.99989699,325.99989698,325.99989699,325.99989699,325.99989699,325.99989699,205.999691,205.99979399,205.999794,205.99969102,205.99969102,164.34173329,164.3418363,164.34183632,164.34183634,164.34183633,164.34183633,133.90302817,79.10394481,79.10394481,0,57.75689754,134.52030597,134.52040893,134.52030593,134.52040896,134.52040897,134.52040902,134.52030596,134.52030596,134.520306,134.52040897,134.52040902,134.52040896,177.66599271,177.6659927,177.6659927,177.6659927,177.66588969,361.98203107,361.98203109,361.98203108,361.96416515,361.98203107,361.96416514,361.96416515,361.96416515,361.98203107,361.99989699,361.99989699,361.98203107,361.98203107,361.96416515,361.96416514,361.99989698,361.96416516,361.98203107,361.96416516,361.98203108,361.98203108,361.98203108,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.96416515,361.96416516,361.96416516,361.94629923,361.94629924,361.96416514,361.98203107,361.96416515,361.96416515,361.96416514,361.96416514,361.98203107,361.98203107,361.98203106,361.98203106,361.98203108,361.99989701,361.99989701,361.98203107,361.98203107,361.98203107,361.999897,361.999897,361.999897,361.999897,361.999897,361.98203108,361.98203108,361.98203108,361.98203108,361.98203108,361.96416513,361.98203106,361.98203106,361.96416514,361.98203106,361.98203106,361.96416514,361.94629923,361.94629923,361.94629923,361.96416514,361.94629922,361.94629922,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.96416514,361.98203106,361.98203106,361.98203106,361.96416514,361.96416514,361.96416515,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.94629923,361.94629923,361.96416514,361.96416514,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.98203107,361.98203108,361.98203108,361.98203106,361.96416515,361.98203108,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.94629923,361.94629923,361.999897,361.999897,361.999897,361.99989701,361.99989701,361.999897,361.999897,361.999897,361.99989699,361.999897,361.999897,361.99989699,387.999897,387.999897,387.999897,387.99989699,387.99989701,387.999897,387.999896979,387.999896979,387.999896982,387.999896984,387.999896983,387.999896984,387.999896985,387.999896985,387.99989698,387.999897,387.99989698,387.99989698,427.999897,427.999897,427.999897 +325.99698505,325.99698505,325.99698505,325.999897,325.999897,325.99989701,325.99989702,325.99989701,325.999897,325.999897,325.99989698,325.99989699,325.99989698,325.99989699,325.99989699,325.99989699,325.99989699,205.999691,205.99979399,205.999794,205.99969102,205.99969102,164.34173329,164.3418363,164.34183632,164.34183634,164.34183633,164.34183633,133.90302817,79.10394481,79.10394481,57.75689754,0,134.52030597,134.52040893,134.52030593,134.52040896,134.52040897,134.52040902,134.52030596,134.52030596,134.520306,134.52040897,134.52040902,134.52040896,177.66599271,177.6659927,177.6659927,177.6659927,177.66588969,361.98203107,361.98203109,361.98203108,361.96416515,361.98203107,361.96416514,361.96416515,361.96416515,361.98203107,361.99989699,361.99989699,361.98203107,361.98203107,361.96416515,361.96416514,361.99989698,361.96416516,361.98203107,361.96416516,361.98203108,361.98203108,361.98203108,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.96416515,361.96416516,361.96416516,361.94629923,361.94629924,361.96416514,361.98203107,361.96416515,361.96416515,361.96416514,361.96416514,361.98203107,361.98203107,361.98203106,361.98203106,361.98203108,361.99989701,361.99989701,361.98203107,361.98203107,361.98203107,361.999897,361.999897,361.999897,361.999897,361.999897,361.98203108,361.98203108,361.98203108,361.98203108,361.98203108,361.96416513,361.98203106,361.98203106,361.96416514,361.98203106,361.98203106,361.96416514,361.94629923,361.94629923,361.94629923,361.96416514,361.94629922,361.94629922,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.96416514,361.98203106,361.98203106,361.98203106,361.96416514,361.96416514,361.96416515,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.94629923,361.94629923,361.96416514,361.96416514,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.98203107,361.98203108,361.98203108,361.98203106,361.96416515,361.98203108,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.94629923,361.94629923,361.999897,361.999897,361.999897,361.99989701,361.99989701,361.999897,361.999897,361.999897,361.99989699,361.999897,361.999897,361.99989699,387.999897,387.999897,387.999897,387.99989699,387.99989701,387.999897,387.999896979,387.999896979,387.999896982,387.999896984,387.999896983,387.999896984,387.999896985,387.999896985,387.99989698,387.999897,387.99989698,387.99989698,427.999897,427.999897,427.999897 +325.99688206,325.99688206,325.99688206,325.99979401,325.99979401,325.99979402,325.99979403,325.99979402,325.99979401,325.99979401,325.99979399,325.999794,325.99979399,325.999794,325.999794,325.999794,325.999794,205.99958801,205.999691,205.99969101,205.99958803,205.99958803,164.3416303,164.34173331,164.34173333,164.34173335,164.34173334,164.34173334,134.52030594,134.52020298,134.52020298,134.52030597,134.52030597,0,46.31107634,81.07642018,102.39899621,102.39899622,102.39899627,104.40821319,104.40821319,104.40821323,104.4083162,104.40831625,104.40831619,177.66588972,177.66588971,177.66588971,177.66588971,177.6657867,361.98192808,361.9819281,361.98192809,361.96406216,361.98192808,361.96406215,361.96406216,361.96406216,361.98192808,361.999794,361.999794,361.98192808,361.98192808,361.96406216,361.96406215,361.99979399,361.96406217,361.98192808,361.96406217,361.98192809,361.98192809,361.98192809,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.96406216,361.96406217,361.96406217,361.94619624,361.94619625,361.96406215,361.98192808,361.96406216,361.96406216,361.96406215,361.96406215,361.98192808,361.98192808,361.98192807,361.98192807,361.98192809,361.99979402,361.99979402,361.98192808,361.98192808,361.98192808,361.99979401,361.99979401,361.99979401,361.99979401,361.99979401,361.98192809,361.98192809,361.98192809,361.98192809,361.98192809,361.96406214,361.98192807,361.98192807,361.96406215,361.98192807,361.98192807,361.96406215,361.94619624,361.94619624,361.94619624,361.96406215,361.94619623,361.94619623,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.96406215,361.98192807,361.98192807,361.98192807,361.96406215,361.96406215,361.96406216,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.94619624,361.94619624,361.96406215,361.96406215,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.98192808,361.98192809,361.98192809,361.98192807,361.96406216,361.98192809,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.94619624,361.94619624,361.99979401,361.99979401,361.99979401,361.99979402,361.99979402,361.99979401,361.99979401,361.99979401,361.999794,361.99979401,361.99979401,361.999794,387.99979401,387.99979401,387.99979401,387.999794,387.99979402,387.99979401,387.999793989,387.999793989,387.999793992,387.999793994,387.999793993,387.999793994,387.999793995,387.999793995,387.99979399,387.99979401,387.99979399,387.99979399,427.99979401,427.99979401,427.99979401 +325.99698502,325.99698502,325.99698502,325.99989697,325.99989697,325.99989698,325.99989699,325.99989698,325.99989697,325.99989697,325.99989695,325.99989696,325.99989695,325.99989696,325.99989696,325.99989696,325.99989696,205.99969097,205.99979396,205.99979397,205.99969099,205.99969099,164.34173326,164.34183627,164.34183629,164.34183631,164.3418363,164.3418363,134.5204089,134.52030594,134.52030594,134.52040893,134.52040893,46.31107634,0,81.07652314,102.39909917,102.39909918,102.39909923,104.40831615,104.40831615,104.40831619,104.40841916,104.40841921,104.40841915,177.66599268,177.66599267,177.66599267,177.66599267,177.66588966,361.98203104,361.98203106,361.98203105,361.96416512,361.98203104,361.96416511,361.96416512,361.96416512,361.98203104,361.99989696,361.99989696,361.98203104,361.98203104,361.96416512,361.96416511,361.99989695,361.96416513,361.98203104,361.96416513,361.98203105,361.98203105,361.98203105,361.96416512,361.96416512,361.96416511,361.96416511,361.96416512,361.96416512,361.96416513,361.96416513,361.9462992,361.94629921,361.96416511,361.98203104,361.96416512,361.96416512,361.96416511,361.96416511,361.98203104,361.98203104,361.98203103,361.98203103,361.98203105,361.99989698,361.99989698,361.98203104,361.98203104,361.98203104,361.99989697,361.99989697,361.99989697,361.99989697,361.99989697,361.98203105,361.98203105,361.98203105,361.98203105,361.98203105,361.9641651,361.98203103,361.98203103,361.96416511,361.98203103,361.98203103,361.96416511,361.9462992,361.9462992,361.9462992,361.96416511,361.94629919,361.94629919,361.96416511,361.96416511,361.98203103,361.98203103,361.98203104,361.98203104,361.96416511,361.98203103,361.98203103,361.98203103,361.96416511,361.96416511,361.96416512,361.96416512,361.96416512,361.96416511,361.96416511,361.96416512,361.9462992,361.9462992,361.96416511,361.96416511,361.96416511,361.96416511,361.98203103,361.98203103,361.98203104,361.98203104,361.98203104,361.98203105,361.98203105,361.98203103,361.96416512,361.98203105,361.96416512,361.96416512,361.96416512,361.96416512,361.96416512,361.96416512,361.96416512,361.9462992,361.9462992,361.99989697,361.99989697,361.99989697,361.99989698,361.99989698,361.99989697,361.99989697,361.99989697,361.99989696,361.99989697,361.99989697,361.99989696,387.99989697,387.99989697,387.99989697,387.99989696,387.99989698,387.99989697,387.999896949,387.999896949,387.999896952,387.999896954,387.999896953,387.999896954,387.999896955,387.999896955,387.99989695,387.99989697,387.99989695,387.99989695,427.99989697,427.99989697,427.99989697 +325.99688202,325.99688202,325.99688202,325.99979397,325.99979397,325.99979398,325.99979399,325.99979398,325.99979397,325.99979397,325.99979395,325.99979396,325.99979395,325.99979396,325.99979396,325.99979396,325.99979396,205.99958797,205.99969096,205.99969097,205.99958799,205.99958799,164.34163026,164.34173327,164.34173329,164.34173331,164.3417333,164.3417333,134.5203059,134.52020294,134.52020294,134.52030593,134.52030593,81.07642018,81.07652314,0,102.39899617,102.39899618,102.39899623,104.40821315,104.40821315,104.40821319,104.40831616,104.40831621,104.40831615,177.66588968,177.66588967,177.66588967,177.66588967,177.66578666,361.98192804,361.98192806,361.98192805,361.96406212,361.98192804,361.96406211,361.96406212,361.96406212,361.98192804,361.99979396,361.99979396,361.98192804,361.98192804,361.96406212,361.96406211,361.99979395,361.96406213,361.98192804,361.96406213,361.98192805,361.98192805,361.98192805,361.96406212,361.96406212,361.96406211,361.96406211,361.96406212,361.96406212,361.96406213,361.96406213,361.9461962,361.94619621,361.96406211,361.98192804,361.96406212,361.96406212,361.96406211,361.96406211,361.98192804,361.98192804,361.98192803,361.98192803,361.98192805,361.99979398,361.99979398,361.98192804,361.98192804,361.98192804,361.99979397,361.99979397,361.99979397,361.99979397,361.99979397,361.98192805,361.98192805,361.98192805,361.98192805,361.98192805,361.9640621,361.98192803,361.98192803,361.96406211,361.98192803,361.98192803,361.96406211,361.9461962,361.9461962,361.9461962,361.96406211,361.94619619,361.94619619,361.96406211,361.96406211,361.98192803,361.98192803,361.98192804,361.98192804,361.96406211,361.98192803,361.98192803,361.98192803,361.96406211,361.96406211,361.96406212,361.96406212,361.96406212,361.96406211,361.96406211,361.96406212,361.9461962,361.9461962,361.96406211,361.96406211,361.96406211,361.96406211,361.98192803,361.98192803,361.98192804,361.98192804,361.98192804,361.98192805,361.98192805,361.98192803,361.96406212,361.98192805,361.96406212,361.96406212,361.96406212,361.96406212,361.96406212,361.96406212,361.96406212,361.9461962,361.9461962,361.99979397,361.99979397,361.99979397,361.99979398,361.99979398,361.99979397,361.99979397,361.99979397,361.99979396,361.99979397,361.99979397,361.99979396,387.99979397,387.99979397,387.99979397,387.99979396,387.99979398,387.99979397,387.999793949,387.999793949,387.999793952,387.999793954,387.999793953,387.999793954,387.999793955,387.999793955,387.99979395,387.99979397,387.99979395,387.99979395,427.99979397,427.99979397,427.99979397 +325.99698505,325.99698505,325.99698505,325.999897,325.999897,325.99989701,325.99989702,325.99989701,325.999897,325.999897,325.99989698,325.99989699,325.99989698,325.99989699,325.99989699,325.99989699,325.99989699,205.999691,205.99979399,205.999794,205.99969102,205.99969102,164.34173329,164.3418363,164.34183632,164.34183634,164.34183633,164.34183633,134.52040893,134.52030597,134.52030597,134.52040896,134.52040896,102.39899621,102.39909917,102.39899617,0,102.11523179,102.11523184,104.40831618,104.40831618,104.40831622,104.40841919,104.40841924,104.40841918,177.66599271,177.6659927,177.6659927,177.6659927,177.66588969,361.98203107,361.98203109,361.98203108,361.96416515,361.98203107,361.96416514,361.96416515,361.96416515,361.98203107,361.99989699,361.99989699,361.98203107,361.98203107,361.96416515,361.96416514,361.99989698,361.96416516,361.98203107,361.96416516,361.98203108,361.98203108,361.98203108,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.96416515,361.96416516,361.96416516,361.94629923,361.94629924,361.96416514,361.98203107,361.96416515,361.96416515,361.96416514,361.96416514,361.98203107,361.98203107,361.98203106,361.98203106,361.98203108,361.99989701,361.99989701,361.98203107,361.98203107,361.98203107,361.999897,361.999897,361.999897,361.999897,361.999897,361.98203108,361.98203108,361.98203108,361.98203108,361.98203108,361.96416513,361.98203106,361.98203106,361.96416514,361.98203106,361.98203106,361.96416514,361.94629923,361.94629923,361.94629923,361.96416514,361.94629922,361.94629922,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.96416514,361.98203106,361.98203106,361.98203106,361.96416514,361.96416514,361.96416515,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.94629923,361.94629923,361.96416514,361.96416514,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.98203107,361.98203108,361.98203108,361.98203106,361.96416515,361.98203108,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.94629923,361.94629923,361.999897,361.999897,361.999897,361.99989701,361.99989701,361.999897,361.999897,361.999897,361.99989699,361.999897,361.999897,361.99989699,387.999897,387.999897,387.999897,387.99989699,387.99989701,387.999897,387.999896979,387.999896979,387.999896982,387.999896984,387.999896983,387.999896984,387.999896985,387.999896985,387.99989698,387.999897,387.99989698,387.99989698,427.999897,427.999897,427.999897 +325.99698506,325.99698506,325.99698506,325.99989701,325.99989701,325.99989702,325.99989703,325.99989702,325.99989701,325.99989701,325.99989699,325.999897,325.99989699,325.999897,325.999897,325.999897,325.999897,205.99969101,205.999794,205.99979401,205.99969103,205.99969103,164.3417333,164.34183631,164.34183633,164.34183635,164.34183634,164.34183634,134.52040894,134.52030598,134.52030598,134.52040897,134.52040897,102.39899622,102.39909918,102.39899618,102.11523179,0,51.92590421,104.40831619,104.40831619,104.40831623,104.4084192,104.40841925,104.40841919,177.66599272,177.66599271,177.66599271,177.66599271,177.6658897,361.98203108,361.9820311,361.98203109,361.96416516,361.98203108,361.96416515,361.96416516,361.96416516,361.98203108,361.999897,361.999897,361.98203108,361.98203108,361.96416516,361.96416515,361.99989699,361.96416517,361.98203108,361.96416517,361.98203109,361.98203109,361.98203109,361.96416516,361.96416516,361.96416515,361.96416515,361.96416516,361.96416516,361.96416517,361.96416517,361.94629924,361.94629925,361.96416515,361.98203108,361.96416516,361.96416516,361.96416515,361.96416515,361.98203108,361.98203108,361.98203107,361.98203107,361.98203109,361.99989702,361.99989702,361.98203108,361.98203108,361.98203108,361.99989701,361.99989701,361.99989701,361.99989701,361.99989701,361.98203109,361.98203109,361.98203109,361.98203109,361.98203109,361.96416514,361.98203107,361.98203107,361.96416515,361.98203107,361.98203107,361.96416515,361.94629924,361.94629924,361.94629924,361.96416515,361.94629923,361.94629923,361.96416515,361.96416515,361.98203107,361.98203107,361.98203108,361.98203108,361.96416515,361.98203107,361.98203107,361.98203107,361.96416515,361.96416515,361.96416516,361.96416516,361.96416516,361.96416515,361.96416515,361.96416516,361.94629924,361.94629924,361.96416515,361.96416515,361.96416515,361.96416515,361.98203107,361.98203107,361.98203108,361.98203108,361.98203108,361.98203109,361.98203109,361.98203107,361.96416516,361.98203109,361.96416516,361.96416516,361.96416516,361.96416516,361.96416516,361.96416516,361.96416516,361.94629924,361.94629924,361.99989701,361.99989701,361.99989701,361.99989702,361.99989702,361.99989701,361.99989701,361.99989701,361.999897,361.99989701,361.99989701,361.999897,387.99989701,387.99989701,387.99989701,387.999897,387.99989702,387.99989701,387.999896989,387.999896989,387.999896992,387.999896994,387.999896993,387.999896994,387.999896995,387.999896995,387.99989699,387.99989701,387.99989699,387.99989699,427.99989701,427.99989701,427.99989701 +325.99698511,325.99698511,325.99698511,325.99989706,325.99989706,325.99989707,325.99989708,325.99989707,325.99989706,325.99989706,325.99989704,325.99989705,325.99989704,325.99989705,325.99989705,325.99989705,325.99989705,205.99969106,205.99979405,205.99979406,205.99969108,205.99969108,164.34173335,164.34183636,164.34183638,164.3418364,164.34183639,164.34183639,134.52040899,134.52030603,134.52030603,134.52040902,134.52040902,102.39899627,102.39909923,102.39899623,102.11523184,51.92590421,0,104.40831624,104.40831624,104.40831628,104.40841925,104.4084193,104.40841924,177.66599277,177.66599276,177.66599276,177.66599276,177.66588975,361.98203113,361.98203115,361.98203114,361.96416521,361.98203113,361.9641652,361.96416521,361.96416521,361.98203113,361.99989705,361.99989705,361.98203113,361.98203113,361.96416521,361.9641652,361.99989704,361.96416522,361.98203113,361.96416522,361.98203114,361.98203114,361.98203114,361.96416521,361.96416521,361.9641652,361.9641652,361.96416521,361.96416521,361.96416522,361.96416522,361.94629929,361.9462993,361.9641652,361.98203113,361.96416521,361.96416521,361.9641652,361.9641652,361.98203113,361.98203113,361.98203112,361.98203112,361.98203114,361.99989707,361.99989707,361.98203113,361.98203113,361.98203113,361.99989706,361.99989706,361.99989706,361.99989706,361.99989706,361.98203114,361.98203114,361.98203114,361.98203114,361.98203114,361.96416519,361.98203112,361.98203112,361.9641652,361.98203112,361.98203112,361.9641652,361.94629929,361.94629929,361.94629929,361.9641652,361.94629928,361.94629928,361.9641652,361.9641652,361.98203112,361.98203112,361.98203113,361.98203113,361.9641652,361.98203112,361.98203112,361.98203112,361.9641652,361.9641652,361.96416521,361.96416521,361.96416521,361.9641652,361.9641652,361.96416521,361.94629929,361.94629929,361.9641652,361.9641652,361.9641652,361.9641652,361.98203112,361.98203112,361.98203113,361.98203113,361.98203113,361.98203114,361.98203114,361.98203112,361.96416521,361.98203114,361.96416521,361.96416521,361.96416521,361.96416521,361.96416521,361.96416521,361.96416521,361.94629929,361.94629929,361.99989706,361.99989706,361.99989706,361.99989707,361.99989707,361.99989706,361.99989706,361.99989706,361.99989705,361.99989706,361.99989706,361.99989705,387.99989706,387.99989706,387.99989706,387.99989705,387.99989707,387.99989706,387.999897039,387.999897039,387.999897042,387.999897044,387.999897043,387.999897044,387.999897045,387.999897045,387.99989704,387.99989706,387.99989704,387.99989704,427.99989706,427.99989706,427.99989706 +325.99688205,325.99688205,325.99688205,325.999794,325.999794,325.99979401,325.99979402,325.99979401,325.999794,325.999794,325.99979398,325.99979399,325.99979398,325.99979399,325.99979399,325.99979399,325.99979399,205.999588,205.99969099,205.999691,205.99958802,205.99958802,164.34163029,164.3417333,164.34173332,164.34173334,164.34173333,164.34173333,134.52030593,134.52020297,134.52020297,134.52030596,134.52030596,104.40821319,104.40831615,104.40821315,104.40831618,104.40831619,104.40831624,0,19.21172758,68.27650348,68.27660645,68.2766065,68.27660644,177.66588971,177.6658897,177.6658897,177.6658897,177.66578669,361.98192807,361.98192809,361.98192808,361.96406215,361.98192807,361.96406214,361.96406215,361.96406215,361.98192807,361.99979399,361.99979399,361.98192807,361.98192807,361.96406215,361.96406214,361.99979398,361.96406216,361.98192807,361.96406216,361.98192808,361.98192808,361.98192808,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.96406215,361.96406216,361.96406216,361.94619623,361.94619624,361.96406214,361.98192807,361.96406215,361.96406215,361.96406214,361.96406214,361.98192807,361.98192807,361.98192806,361.98192806,361.98192808,361.99979401,361.99979401,361.98192807,361.98192807,361.98192807,361.999794,361.999794,361.999794,361.999794,361.999794,361.98192808,361.98192808,361.98192808,361.98192808,361.98192808,361.96406213,361.98192806,361.98192806,361.96406214,361.98192806,361.98192806,361.96406214,361.94619623,361.94619623,361.94619623,361.96406214,361.94619622,361.94619622,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.96406214,361.98192806,361.98192806,361.98192806,361.96406214,361.96406214,361.96406215,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.94619623,361.94619623,361.96406214,361.96406214,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.98192807,361.98192808,361.98192808,361.98192806,361.96406215,361.98192808,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.94619623,361.94619623,361.999794,361.999794,361.999794,361.99979401,361.99979401,361.999794,361.999794,361.999794,361.99979399,361.999794,361.999794,361.99979399,387.999794,387.999794,387.999794,387.99979399,387.99979401,387.999794,387.999793979,387.999793979,387.999793982,387.999793984,387.999793983,387.999793984,387.999793985,387.999793985,387.99979398,387.999794,387.99979398,387.99979398,427.999794,427.999794,427.999794 +325.99688205,325.99688205,325.99688205,325.999794,325.999794,325.99979401,325.99979402,325.99979401,325.999794,325.999794,325.99979398,325.99979399,325.99979398,325.99979399,325.99979399,325.99979399,325.99979399,205.999588,205.99969099,205.999691,205.99958802,205.99958802,164.34163029,164.3417333,164.34173332,164.34173334,164.34173333,164.34173333,134.52030593,134.52020297,134.52020297,134.52030596,134.52030596,104.40821319,104.40831615,104.40821315,104.40831618,104.40831619,104.40831624,19.21172758,0,68.27650348,68.27660645,68.2766065,68.27660644,177.66588971,177.6658897,177.6658897,177.6658897,177.66578669,361.98192807,361.98192809,361.98192808,361.96406215,361.98192807,361.96406214,361.96406215,361.96406215,361.98192807,361.99979399,361.99979399,361.98192807,361.98192807,361.96406215,361.96406214,361.99979398,361.96406216,361.98192807,361.96406216,361.98192808,361.98192808,361.98192808,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.96406215,361.96406216,361.96406216,361.94619623,361.94619624,361.96406214,361.98192807,361.96406215,361.96406215,361.96406214,361.96406214,361.98192807,361.98192807,361.98192806,361.98192806,361.98192808,361.99979401,361.99979401,361.98192807,361.98192807,361.98192807,361.999794,361.999794,361.999794,361.999794,361.999794,361.98192808,361.98192808,361.98192808,361.98192808,361.98192808,361.96406213,361.98192806,361.98192806,361.96406214,361.98192806,361.98192806,361.96406214,361.94619623,361.94619623,361.94619623,361.96406214,361.94619622,361.94619622,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.96406214,361.98192806,361.98192806,361.98192806,361.96406214,361.96406214,361.96406215,361.96406215,361.96406215,361.96406214,361.96406214,361.96406215,361.94619623,361.94619623,361.96406214,361.96406214,361.96406214,361.96406214,361.98192806,361.98192806,361.98192807,361.98192807,361.98192807,361.98192808,361.98192808,361.98192806,361.96406215,361.98192808,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.96406215,361.94619623,361.94619623,361.999794,361.999794,361.999794,361.99979401,361.99979401,361.999794,361.999794,361.999794,361.99979399,361.999794,361.999794,361.99979399,387.999794,387.999794,387.999794,387.99979399,387.99979401,387.999794,387.999793979,387.999793979,387.999793982,387.999793984,387.999793983,387.999793984,387.999793985,387.999793985,387.99979398,387.999794,387.99979398,387.99979398,427.999794,427.999794,427.999794 +325.99688209,325.99688209,325.99688209,325.99979404,325.99979404,325.99979405,325.99979406,325.99979405,325.99979404,325.99979404,325.99979402,325.99979403,325.99979402,325.99979403,325.99979403,325.99979403,325.99979403,205.99958804,205.99969103,205.99969104,205.99958806,205.99958806,164.34163033,164.34173334,164.34173336,164.34173338,164.34173337,164.34173337,134.52030597,134.52020301,134.52020301,134.520306,134.520306,104.40821323,104.40831619,104.40821319,104.40831622,104.40831623,104.40831628,68.27650348,68.27650348,0,37.93636919,37.93636924,54.58546188,177.66588975,177.66588974,177.66588974,177.66588974,177.66578673,361.98192811,361.98192813,361.98192812,361.96406219,361.98192811,361.96406218,361.96406219,361.96406219,361.98192811,361.99979403,361.99979403,361.98192811,361.98192811,361.96406219,361.96406218,361.99979402,361.9640622,361.98192811,361.9640622,361.98192812,361.98192812,361.98192812,361.96406219,361.96406219,361.96406218,361.96406218,361.96406219,361.96406219,361.9640622,361.9640622,361.94619627,361.94619628,361.96406218,361.98192811,361.96406219,361.96406219,361.96406218,361.96406218,361.98192811,361.98192811,361.9819281,361.9819281,361.98192812,361.99979405,361.99979405,361.98192811,361.98192811,361.98192811,361.99979404,361.99979404,361.99979404,361.99979404,361.99979404,361.98192812,361.98192812,361.98192812,361.98192812,361.98192812,361.96406217,361.9819281,361.9819281,361.96406218,361.9819281,361.9819281,361.96406218,361.94619627,361.94619627,361.94619627,361.96406218,361.94619626,361.94619626,361.96406218,361.96406218,361.9819281,361.9819281,361.98192811,361.98192811,361.96406218,361.9819281,361.9819281,361.9819281,361.96406218,361.96406218,361.96406219,361.96406219,361.96406219,361.96406218,361.96406218,361.96406219,361.94619627,361.94619627,361.96406218,361.96406218,361.96406218,361.96406218,361.9819281,361.9819281,361.98192811,361.98192811,361.98192811,361.98192812,361.98192812,361.9819281,361.96406219,361.98192812,361.96406219,361.96406219,361.96406219,361.96406219,361.96406219,361.96406219,361.96406219,361.94619627,361.94619627,361.99979404,361.99979404,361.99979404,361.99979405,361.99979405,361.99979404,361.99979404,361.99979404,361.99979403,361.99979404,361.99979404,361.99979403,387.99979404,387.99979404,387.99979404,387.99979403,387.99979405,387.99979404,387.999794019,387.999794019,387.999794022,387.999794024,387.999794023,387.999794024,387.999794025,387.999794025,387.99979402,387.99979404,387.99979402,387.99979402,427.99979404,427.99979404,427.99979404 +325.99698506,325.99698506,325.99698506,325.99989701,325.99989701,325.99989702,325.99989703,325.99989702,325.99989701,325.99989701,325.99989699,325.999897,325.99989699,325.999897,325.999897,325.999897,325.999897,205.99969101,205.999794,205.99979401,205.99969103,205.99969103,164.3417333,164.34183631,164.34183633,164.34183635,164.34183634,164.34183634,134.52040894,134.52030598,134.52030598,134.52040897,134.52040897,104.4083162,104.40841916,104.40831616,104.40841919,104.4084192,104.40841925,68.27660645,68.27660645,37.93636919,0,25.77446251,54.58556485,177.66599272,177.66599271,177.66599271,177.66599271,177.6658897,361.98203108,361.9820311,361.98203109,361.96416516,361.98203108,361.96416515,361.96416516,361.96416516,361.98203108,361.999897,361.999897,361.98203108,361.98203108,361.96416516,361.96416515,361.99989699,361.96416517,361.98203108,361.96416517,361.98203109,361.98203109,361.98203109,361.96416516,361.96416516,361.96416515,361.96416515,361.96416516,361.96416516,361.96416517,361.96416517,361.94629924,361.94629925,361.96416515,361.98203108,361.96416516,361.96416516,361.96416515,361.96416515,361.98203108,361.98203108,361.98203107,361.98203107,361.98203109,361.99989702,361.99989702,361.98203108,361.98203108,361.98203108,361.99989701,361.99989701,361.99989701,361.99989701,361.99989701,361.98203109,361.98203109,361.98203109,361.98203109,361.98203109,361.96416514,361.98203107,361.98203107,361.96416515,361.98203107,361.98203107,361.96416515,361.94629924,361.94629924,361.94629924,361.96416515,361.94629923,361.94629923,361.96416515,361.96416515,361.98203107,361.98203107,361.98203108,361.98203108,361.96416515,361.98203107,361.98203107,361.98203107,361.96416515,361.96416515,361.96416516,361.96416516,361.96416516,361.96416515,361.96416515,361.96416516,361.94629924,361.94629924,361.96416515,361.96416515,361.96416515,361.96416515,361.98203107,361.98203107,361.98203108,361.98203108,361.98203108,361.98203109,361.98203109,361.98203107,361.96416516,361.98203109,361.96416516,361.96416516,361.96416516,361.96416516,361.96416516,361.96416516,361.96416516,361.94629924,361.94629924,361.99989701,361.99989701,361.99989701,361.99989702,361.99989702,361.99989701,361.99989701,361.99989701,361.999897,361.99989701,361.99989701,361.999897,387.99989701,387.99989701,387.99989701,387.999897,387.99989702,387.99989701,387.999896989,387.999896989,387.999896992,387.999896994,387.999896993,387.999896994,387.999896995,387.999896995,387.99989699,387.99989701,387.99989699,387.99989699,427.99989701,427.99989701,427.99989701 +325.99698511,325.99698511,325.99698511,325.99989706,325.99989706,325.99989707,325.99989708,325.99989707,325.99989706,325.99989706,325.99989704,325.99989705,325.99989704,325.99989705,325.99989705,325.99989705,325.99989705,205.99969106,205.99979405,205.99979406,205.99969108,205.99969108,164.34173335,164.34183636,164.34183638,164.3418364,164.34183639,164.34183639,134.52040899,134.52030603,134.52030603,134.52040902,134.52040902,104.40831625,104.40841921,104.40831621,104.40841924,104.40841925,104.4084193,68.2766065,68.2766065,37.93636924,25.77446251,0,54.5855649,177.66599277,177.66599276,177.66599276,177.66599276,177.66588975,361.98203113,361.98203115,361.98203114,361.96416521,361.98203113,361.9641652,361.96416521,361.96416521,361.98203113,361.99989705,361.99989705,361.98203113,361.98203113,361.96416521,361.9641652,361.99989704,361.96416522,361.98203113,361.96416522,361.98203114,361.98203114,361.98203114,361.96416521,361.96416521,361.9641652,361.9641652,361.96416521,361.96416521,361.96416522,361.96416522,361.94629929,361.9462993,361.9641652,361.98203113,361.96416521,361.96416521,361.9641652,361.9641652,361.98203113,361.98203113,361.98203112,361.98203112,361.98203114,361.99989707,361.99989707,361.98203113,361.98203113,361.98203113,361.99989706,361.99989706,361.99989706,361.99989706,361.99989706,361.98203114,361.98203114,361.98203114,361.98203114,361.98203114,361.96416519,361.98203112,361.98203112,361.9641652,361.98203112,361.98203112,361.9641652,361.94629929,361.94629929,361.94629929,361.9641652,361.94629928,361.94629928,361.9641652,361.9641652,361.98203112,361.98203112,361.98203113,361.98203113,361.9641652,361.98203112,361.98203112,361.98203112,361.9641652,361.9641652,361.96416521,361.96416521,361.96416521,361.9641652,361.9641652,361.96416521,361.94629929,361.94629929,361.9641652,361.9641652,361.9641652,361.9641652,361.98203112,361.98203112,361.98203113,361.98203113,361.98203113,361.98203114,361.98203114,361.98203112,361.96416521,361.98203114,361.96416521,361.96416521,361.96416521,361.96416521,361.96416521,361.96416521,361.96416521,361.94629929,361.94629929,361.99989706,361.99989706,361.99989706,361.99989707,361.99989707,361.99989706,361.99989706,361.99989706,361.99989705,361.99989706,361.99989706,361.99989705,387.99989706,387.99989706,387.99989706,387.99989705,387.99989707,387.99989706,387.999897039,387.999897039,387.999897042,387.999897044,387.999897043,387.999897044,387.999897045,387.999897045,387.99989704,387.99989706,387.99989704,387.99989704,427.99989706,427.99989706,427.99989706 +325.99698505,325.99698505,325.99698505,325.999897,325.999897,325.99989701,325.99989702,325.99989701,325.999897,325.999897,325.99989698,325.99989699,325.99989698,325.99989699,325.99989699,325.99989699,325.99989699,205.999691,205.99979399,205.999794,205.99969102,205.99969102,164.34173329,164.3418363,164.34183632,164.34183634,164.34183633,164.34183633,134.52040893,134.52030597,134.52030597,134.52040896,134.52040896,104.40831619,104.40841915,104.40831615,104.40841918,104.40841919,104.40841924,68.27660644,68.27660644,54.58546188,54.58556485,54.5855649,0,177.66599271,177.6659927,177.6659927,177.6659927,177.66588969,361.98203107,361.98203109,361.98203108,361.96416515,361.98203107,361.96416514,361.96416515,361.96416515,361.98203107,361.99989699,361.99989699,361.98203107,361.98203107,361.96416515,361.96416514,361.99989698,361.96416516,361.98203107,361.96416516,361.98203108,361.98203108,361.98203108,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.96416515,361.96416516,361.96416516,361.94629923,361.94629924,361.96416514,361.98203107,361.96416515,361.96416515,361.96416514,361.96416514,361.98203107,361.98203107,361.98203106,361.98203106,361.98203108,361.99989701,361.99989701,361.98203107,361.98203107,361.98203107,361.999897,361.999897,361.999897,361.999897,361.999897,361.98203108,361.98203108,361.98203108,361.98203108,361.98203108,361.96416513,361.98203106,361.98203106,361.96416514,361.98203106,361.98203106,361.96416514,361.94629923,361.94629923,361.94629923,361.96416514,361.94629922,361.94629922,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.96416514,361.98203106,361.98203106,361.98203106,361.96416514,361.96416514,361.96416515,361.96416515,361.96416515,361.96416514,361.96416514,361.96416515,361.94629923,361.94629923,361.96416514,361.96416514,361.96416514,361.96416514,361.98203106,361.98203106,361.98203107,361.98203107,361.98203107,361.98203108,361.98203108,361.98203106,361.96416515,361.98203108,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.96416515,361.94629923,361.94629923,361.999897,361.999897,361.999897,361.99989701,361.99989701,361.999897,361.999897,361.999897,361.99989699,361.999897,361.999897,361.99989699,387.999897,387.999897,387.999897,387.99989699,387.99989701,387.999897,387.999896979,387.999896979,387.999896982,387.999896984,387.999896983,387.999896984,387.999896985,387.999896985,387.99989698,387.999897,387.99989698,387.99989698,427.999897,427.999897,427.999897 +325.99698508,325.99698508,325.99698508,325.99989703,325.99989703,325.99989704,325.99989705,325.99989704,325.99989703,325.99989703,325.99989701,325.99989702,325.99989701,325.99989702,325.99989702,325.99989702,325.99989702,205.99969103,205.99979402,205.99979403,205.99969105,205.99969105,177.66578668,177.66588969,177.66588971,177.66588973,177.66588972,177.66588972,177.66599268,177.66588972,177.66588972,177.66599271,177.66599271,177.66588972,177.66599268,177.66588968,177.66599271,177.66599272,177.66599277,177.66588971,177.66588971,177.66588975,177.66599272,177.66599277,177.66599271,0,108.27400149,108.27400149,108.27400149,156.14573076,361.9820311,361.98203112,361.98203111,361.96416518,361.9820311,361.96416517,361.96416518,361.96416518,361.9820311,361.99989702,361.99989702,361.9820311,361.9820311,361.96416518,361.96416517,361.99989701,361.96416519,361.9820311,361.96416519,361.98203111,361.98203111,361.98203111,361.96416518,361.96416518,361.96416517,361.96416517,361.96416518,361.96416518,361.96416519,361.96416519,361.94629926,361.94629927,361.96416517,361.9820311,361.96416518,361.96416518,361.96416517,361.96416517,361.9820311,361.9820311,361.98203109,361.98203109,361.98203111,361.99989704,361.99989704,361.9820311,361.9820311,361.9820311,361.99989703,361.99989703,361.99989703,361.99989703,361.99989703,361.98203111,361.98203111,361.98203111,361.98203111,361.98203111,361.96416516,361.98203109,361.98203109,361.96416517,361.98203109,361.98203109,361.96416517,361.94629926,361.94629926,361.94629926,361.96416517,361.94629925,361.94629925,361.96416517,361.96416517,361.98203109,361.98203109,361.9820311,361.9820311,361.96416517,361.98203109,361.98203109,361.98203109,361.96416517,361.96416517,361.96416518,361.96416518,361.96416518,361.96416517,361.96416517,361.96416518,361.94629926,361.94629926,361.96416517,361.96416517,361.96416517,361.96416517,361.98203109,361.98203109,361.9820311,361.9820311,361.9820311,361.98203111,361.98203111,361.98203109,361.96416518,361.98203111,361.96416518,361.96416518,361.96416518,361.96416518,361.96416518,361.96416518,361.96416518,361.94629926,361.94629926,361.99989703,361.99989703,361.99989703,361.99989704,361.99989704,361.99989703,361.99989703,361.99989703,361.99989702,361.99989703,361.99989703,361.99989702,387.99989703,387.99989703,387.99989703,387.99989702,387.99989704,387.99989703,387.999897009,387.999897009,387.999897012,387.999897014,387.999897013,387.999897014,387.999897015,387.999897015,387.99989701,387.99989703,387.99989701,387.99989701,427.99989703,427.99989703,427.99989703 +325.99698507,325.99698507,325.99698507,325.99989702,325.99989702,325.99989703,325.99989704,325.99989703,325.99989702,325.99989702,325.999897,325.99989701,325.999897,325.99989701,325.99989701,325.99989701,325.99989701,205.99969102,205.99979401,205.99979402,205.99969104,205.99969104,177.66578667,177.66588968,177.6658897,177.66588972,177.66588971,177.66588971,177.66599267,177.66588971,177.66588971,177.6659927,177.6659927,177.66588971,177.66599267,177.66588967,177.6659927,177.66599271,177.66599276,177.6658897,177.6658897,177.66588974,177.66599271,177.66599276,177.6659927,108.27400149,0,39.28700544,78.29817742,156.14573075,361.98203109,361.98203111,361.9820311,361.96416517,361.98203109,361.96416516,361.96416517,361.96416517,361.98203109,361.99989701,361.99989701,361.98203109,361.98203109,361.96416517,361.96416516,361.999897,361.96416518,361.98203109,361.96416518,361.9820311,361.9820311,361.9820311,361.96416517,361.96416517,361.96416516,361.96416516,361.96416517,361.96416517,361.96416518,361.96416518,361.94629925,361.94629926,361.96416516,361.98203109,361.96416517,361.96416517,361.96416516,361.96416516,361.98203109,361.98203109,361.98203108,361.98203108,361.9820311,361.99989703,361.99989703,361.98203109,361.98203109,361.98203109,361.99989702,361.99989702,361.99989702,361.99989702,361.99989702,361.9820311,361.9820311,361.9820311,361.9820311,361.9820311,361.96416515,361.98203108,361.98203108,361.96416516,361.98203108,361.98203108,361.96416516,361.94629925,361.94629925,361.94629925,361.96416516,361.94629924,361.94629924,361.96416516,361.96416516,361.98203108,361.98203108,361.98203109,361.98203109,361.96416516,361.98203108,361.98203108,361.98203108,361.96416516,361.96416516,361.96416517,361.96416517,361.96416517,361.96416516,361.96416516,361.96416517,361.94629925,361.94629925,361.96416516,361.96416516,361.96416516,361.96416516,361.98203108,361.98203108,361.98203109,361.98203109,361.98203109,361.9820311,361.9820311,361.98203108,361.96416517,361.9820311,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.94629925,361.94629925,361.99989702,361.99989702,361.99989702,361.99989703,361.99989703,361.99989702,361.99989702,361.99989702,361.99989701,361.99989702,361.99989702,361.99989701,387.99989702,387.99989702,387.99989702,387.99989701,387.99989703,387.99989702,387.999896999,387.999896999,387.999897002,387.999897004,387.999897003,387.999897004,387.999897005,387.999897005,387.999897,387.99989702,387.999897,387.999897,427.99989702,427.99989702,427.99989702 +325.99698507,325.99698507,325.99698507,325.99989702,325.99989702,325.99989703,325.99989704,325.99989703,325.99989702,325.99989702,325.999897,325.99989701,325.999897,325.99989701,325.99989701,325.99989701,325.99989701,205.99969102,205.99979401,205.99979402,205.99969104,205.99969104,177.66578667,177.66588968,177.6658897,177.66588972,177.66588971,177.66588971,177.66599267,177.66588971,177.66588971,177.6659927,177.6659927,177.66588971,177.66599267,177.66588967,177.6659927,177.66599271,177.66599276,177.6658897,177.6658897,177.66588974,177.66599271,177.66599276,177.6659927,108.27400149,39.28700544,0,78.29817742,156.14573075,361.98203109,361.98203111,361.9820311,361.96416517,361.98203109,361.96416516,361.96416517,361.96416517,361.98203109,361.99989701,361.99989701,361.98203109,361.98203109,361.96416517,361.96416516,361.999897,361.96416518,361.98203109,361.96416518,361.9820311,361.9820311,361.9820311,361.96416517,361.96416517,361.96416516,361.96416516,361.96416517,361.96416517,361.96416518,361.96416518,361.94629925,361.94629926,361.96416516,361.98203109,361.96416517,361.96416517,361.96416516,361.96416516,361.98203109,361.98203109,361.98203108,361.98203108,361.9820311,361.99989703,361.99989703,361.98203109,361.98203109,361.98203109,361.99989702,361.99989702,361.99989702,361.99989702,361.99989702,361.9820311,361.9820311,361.9820311,361.9820311,361.9820311,361.96416515,361.98203108,361.98203108,361.96416516,361.98203108,361.98203108,361.96416516,361.94629925,361.94629925,361.94629925,361.96416516,361.94629924,361.94629924,361.96416516,361.96416516,361.98203108,361.98203108,361.98203109,361.98203109,361.96416516,361.98203108,361.98203108,361.98203108,361.96416516,361.96416516,361.96416517,361.96416517,361.96416517,361.96416516,361.96416516,361.96416517,361.94629925,361.94629925,361.96416516,361.96416516,361.96416516,361.96416516,361.98203108,361.98203108,361.98203109,361.98203109,361.98203109,361.9820311,361.9820311,361.98203108,361.96416517,361.9820311,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.94629925,361.94629925,361.99989702,361.99989702,361.99989702,361.99989703,361.99989703,361.99989702,361.99989702,361.99989702,361.99989701,361.99989702,361.99989702,361.99989701,387.99989702,387.99989702,387.99989702,387.99989701,387.99989703,387.99989702,387.999896999,387.999896999,387.999897002,387.999897004,387.999897003,387.999897004,387.999897005,387.999897005,387.999897,387.99989702,387.999897,387.999897,427.99989702,427.99989702,427.99989702 +325.99698507,325.99698507,325.99698507,325.99989702,325.99989702,325.99989703,325.99989704,325.99989703,325.99989702,325.99989702,325.999897,325.99989701,325.999897,325.99989701,325.99989701,325.99989701,325.99989701,205.99969102,205.99979401,205.99979402,205.99969104,205.99969104,177.66578667,177.66588968,177.6658897,177.66588972,177.66588971,177.66588971,177.66599267,177.66588971,177.66588971,177.6659927,177.6659927,177.66588971,177.66599267,177.66588967,177.6659927,177.66599271,177.66599276,177.6658897,177.6658897,177.66588974,177.66599271,177.66599276,177.6659927,108.27400149,78.29817742,78.29817742,0,156.14573075,361.98203109,361.98203111,361.9820311,361.96416517,361.98203109,361.96416516,361.96416517,361.96416517,361.98203109,361.99989701,361.99989701,361.98203109,361.98203109,361.96416517,361.96416516,361.999897,361.96416518,361.98203109,361.96416518,361.9820311,361.9820311,361.9820311,361.96416517,361.96416517,361.96416516,361.96416516,361.96416517,361.96416517,361.96416518,361.96416518,361.94629925,361.94629926,361.96416516,361.98203109,361.96416517,361.96416517,361.96416516,361.96416516,361.98203109,361.98203109,361.98203108,361.98203108,361.9820311,361.99989703,361.99989703,361.98203109,361.98203109,361.98203109,361.99989702,361.99989702,361.99989702,361.99989702,361.99989702,361.9820311,361.9820311,361.9820311,361.9820311,361.9820311,361.96416515,361.98203108,361.98203108,361.96416516,361.98203108,361.98203108,361.96416516,361.94629925,361.94629925,361.94629925,361.96416516,361.94629924,361.94629924,361.96416516,361.96416516,361.98203108,361.98203108,361.98203109,361.98203109,361.96416516,361.98203108,361.98203108,361.98203108,361.96416516,361.96416516,361.96416517,361.96416517,361.96416517,361.96416516,361.96416516,361.96416517,361.94629925,361.94629925,361.96416516,361.96416516,361.96416516,361.96416516,361.98203108,361.98203108,361.98203109,361.98203109,361.98203109,361.9820311,361.9820311,361.98203108,361.96416517,361.9820311,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.96416517,361.94629925,361.94629925,361.99989702,361.99989702,361.99989702,361.99989703,361.99989703,361.99989702,361.99989702,361.99989702,361.99989701,361.99989702,361.99989702,361.99989701,387.99989702,387.99989702,387.99989702,387.99989701,387.99989703,387.99989702,387.999896999,387.999896999,387.999897002,387.999897004,387.999897003,387.999897004,387.999897005,387.999897005,387.999897,387.99989702,387.999897,387.999897,427.99989702,427.99989702,427.99989702 +325.99688206,325.99688206,325.99688206,325.99979401,325.99979401,325.99979402,325.99979403,325.99979402,325.99979401,325.99979401,325.99979399,325.999794,325.99979399,325.999794,325.999794,325.999794,325.999794,205.99958801,205.999691,205.99969101,205.99958803,205.99958803,177.66568366,177.66578667,177.66578669,177.66578671,177.6657867,177.6657867,177.66588966,177.6657867,177.6657867,177.66588969,177.66588969,177.6657867,177.66588966,177.66578666,177.66588969,177.6658897,177.66588975,177.66578669,177.66578669,177.66578673,177.6658897,177.66588975,177.66588969,156.14573076,156.14573075,156.14573075,156.14573075,0,361.98192808,361.9819281,361.98192809,361.96406216,361.98192808,361.96406215,361.96406216,361.96406216,361.98192808,361.999794,361.999794,361.98192808,361.98192808,361.96406216,361.96406215,361.99979399,361.96406217,361.98192808,361.96406217,361.98192809,361.98192809,361.98192809,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.96406216,361.96406217,361.96406217,361.94619624,361.94619625,361.96406215,361.98192808,361.96406216,361.96406216,361.96406215,361.96406215,361.98192808,361.98192808,361.98192807,361.98192807,361.98192809,361.99979402,361.99979402,361.98192808,361.98192808,361.98192808,361.99979401,361.99979401,361.99979401,361.99979401,361.99979401,361.98192809,361.98192809,361.98192809,361.98192809,361.98192809,361.96406214,361.98192807,361.98192807,361.96406215,361.98192807,361.98192807,361.96406215,361.94619624,361.94619624,361.94619624,361.96406215,361.94619623,361.94619623,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.96406215,361.98192807,361.98192807,361.98192807,361.96406215,361.96406215,361.96406216,361.96406216,361.96406216,361.96406215,361.96406215,361.96406216,361.94619624,361.94619624,361.96406215,361.96406215,361.96406215,361.96406215,361.98192807,361.98192807,361.98192808,361.98192808,361.98192808,361.98192809,361.98192809,361.98192807,361.96406216,361.98192809,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.96406216,361.94619624,361.94619624,361.99979401,361.99979401,361.99979401,361.99979402,361.99979402,361.99979401,361.99979401,361.99979401,361.999794,361.99979401,361.99979401,361.999794,387.99979401,387.99979401,387.99979401,387.999794,387.99979402,387.99979401,387.999793989,387.999793989,387.999793992,387.999793994,387.999793993,387.999793994,387.999793995,387.999793995,387.99979399,387.99979401,387.99979399,387.99979399,427.99979401,427.99979401,427.99979401 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,0,199.9196853,199.91968529,199.90181936,199.91968528,199.90181935,199.90181936,199.90181936,199.91968528,199.9375512,199.9375512,199.91968528,199.91968528,199.90181936,199.90181935,199.93755119,199.90181937,199.91968528,199.90181937,199.91968529,199.91968529,199.91968529,199.90181936,199.90181936,199.90181935,199.90181935,199.90181936,199.90181936,199.90181937,199.90181937,199.88395344,199.88395345,199.90181935,199.91968528,199.90181936,199.90181936,199.90181935,199.90181935,199.91968528,199.91968528,199.91968527,199.91968527,199.91968529,199.93755122,199.93755122,199.91968528,199.91968528,199.91968528,199.93755121,199.93755121,199.93755121,199.93755121,199.93755121,199.91968529,199.91968529,199.91968529,199.91968529,199.91968529,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.97922214,361.97922214,361.97922214,361.98213409,361.98213409,361.9821341,361.98213411,361.9821341,361.98213409,361.98213409,361.98213407,361.98213408,361.98213407,361.98213408,361.98213408,361.98213408,361.98213408,361.98192809,361.98203108,361.98203109,361.98192811,361.98192811,361.98182506,361.98192807,361.98192809,361.98192811,361.9819281,361.9819281,361.98203106,361.9819281,361.9819281,361.98203109,361.98203109,361.9819281,361.98203106,361.98192806,361.98203109,361.9820311,361.98203115,361.98192809,361.98192809,361.98192813,361.9820311,361.98203115,361.98203109,361.98203112,361.98203111,361.98203111,361.98203111,361.9819281,199.9196853,0,26.44156695,58.08211768,83.93410916,83.91624323,83.91624324,83.91624324,83.93410916,83.95197508,83.95197508,83.93410916,83.93410916,108.3210949,108.32109489,108.35682673,108.32109491,108.33896082,108.32109491,108.33896083,108.33896083,108.33896083,127.29470578,127.29470578,127.29470577,127.29470577,127.29470578,140.33683002,140.33683003,140.33683003,140.3189641,140.31896411,140.33683001,140.35469594,142.98098672,161.31142436,161.31142435,161.31142435,177.40862154,177.40862154,177.40862153,177.40862153,177.40862155,177.42648748,177.42648748,177.40862154,177.40862154,177.40862154,177.42648747,177.42648747,177.42648747,177.42648747,177.42648747,177.40862155,177.40862155,177.40862155,177.40862155,177.40862155,217.94640222,217.96426815,217.96426815,217.94640223,217.96426815,217.96426815,217.94640223,217.92853632,217.92853632,217.92853632,217.94640223,217.92853631,217.92853631,217.94640223,217.94640223,217.96426815,217.96426815,217.96426816,217.96426816,217.94640223,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640224,217.94640224,217.94640224,217.94640223,217.94640223,217.94640224,217.92853632,217.92853632,217.94640223,217.94640223,217.94640223,217.94640223,217.96426815,217.96426815,217.96426816,217.96426816,217.96426816,217.96426817,217.96426817,217.96426815,217.94640224,217.96426817,217.94640224,217.94640224,217.94640224,217.94640224,217.94640224,217.94640224,217.94640224,217.92853632,217.92853632,279.98213409,279.98213409,279.98213409,303.9821341,303.9821341,303.98213409,303.98213409,339.98213409,339.98213408,339.98213409,339.98213409,339.98213408,387.98213409,387.98213409,387.98213409,387.98213408,387.9821341,387.98213409,387.982134069,387.982134069,387.982134072,387.982134074,387.982134073,387.982134074,387.982134075,387.982134075,387.98213407,387.98213409,387.98213407,387.98213407,427.98213409,427.98213409,427.98213409 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,26.44156695,0,58.08211767,83.93410915,83.91624322,83.91624323,83.91624323,83.93410915,83.95197507,83.95197507,83.93410915,83.93410915,108.32109489,108.32109488,108.35682672,108.3210949,108.33896081,108.3210949,108.33896082,108.33896082,108.33896082,127.29470577,127.29470577,127.29470576,127.29470576,127.29470577,140.33683001,140.33683002,140.33683002,140.31896409,140.3189641,140.33683,140.35469593,142.98098671,161.31142435,161.31142434,161.31142434,177.40862153,177.40862153,177.40862152,177.40862152,177.40862154,177.42648747,177.42648747,177.40862153,177.40862153,177.40862153,177.42648746,177.42648746,177.42648746,177.42648746,177.42648746,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,58.08211768,58.08211767,0,83.91624322,83.89837729,83.8983773,83.8983773,83.91624322,83.93410914,83.93410914,83.91624322,83.91624322,108.30322896,108.30322895,108.33896079,108.30322897,108.32109488,108.30322897,108.32109489,108.32109489,108.32109489,127.27683984,127.27683984,127.27683983,127.27683983,127.27683984,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,83.93410916,83.93410915,83.91624322,0,61.04786099,65.4428782,65.4428782,78.0740862,78.09195212,78.09195212,78.0740862,78.0740862,108.32109488,108.32109487,108.35682671,108.32109489,108.3389608,108.32109489,108.33896081,108.33896081,108.33896081,127.29470576,127.29470576,127.29470575,127.29470575,127.29470576,140.33683,140.33683001,140.33683001,140.31896408,140.31896409,140.33682999,140.35469592,142.9809867,161.31142434,161.31142433,161.31142433,177.40862152,177.40862152,177.40862151,177.40862151,177.40862153,177.42648746,177.42648746,177.40862152,177.40862152,177.40862152,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,83.91624323,83.91624322,83.89837729,61.04786099,0,65.42501227,65.42501227,78.05622027,78.07408619,78.07408619,78.05622027,78.05622027,108.30322895,108.30322894,108.33896078,108.30322896,108.32109487,108.30322896,108.32109488,108.32109488,108.32109488,127.27683983,127.27683983,127.27683982,127.27683982,127.27683983,140.31896407,140.31896408,140.31896408,140.30109815,140.30109816,140.31896406,140.33682999,142.96312077,161.29355841,161.2935584,161.2935584,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,83.91624324,83.91624323,83.8983773,65.4428782,65.42501227,0,29.15718734,78.05622028,78.0740862,78.0740862,78.05622028,78.05622028,108.30322896,108.30322895,108.33896079,108.30322897,108.32109488,108.30322897,108.32109489,108.32109489,108.32109489,127.27683984,127.27683984,127.27683983,127.27683983,127.27683984,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,83.91624324,83.91624323,83.8983773,65.4428782,65.42501227,29.15718734,0,78.05622028,78.0740862,78.0740862,78.05622028,78.05622028,108.30322896,108.30322895,108.33896079,108.30322897,108.32109488,108.30322897,108.32109489,108.32109489,108.32109489,127.27683984,127.27683984,127.27683983,127.27683983,127.27683984,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,83.93410916,83.93410915,83.91624322,78.0740862,78.05622027,78.05622028,78.05622028,0,42.61022782,42.61022782,63.45976068,63.45976068,108.32109488,108.32109487,108.35682671,108.32109489,108.3389608,108.32109489,108.33896081,108.33896081,108.33896081,127.29470576,127.29470576,127.29470575,127.29470575,127.29470576,140.33683,140.33683001,140.33683001,140.31896408,140.31896409,140.33682999,140.35469592,142.9809867,161.31142434,161.31142433,161.31142433,177.40862152,177.40862152,177.40862151,177.40862151,177.40862153,177.42648746,177.42648746,177.40862152,177.40862152,177.40862152,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.99708804,361.99708804,361.99708804,361.99999999,361.99999999,362,362.00000001,362,361.99999999,361.99999999,361.99999997,361.99999998,361.99999997,361.99999998,361.99999998,361.99999998,361.99999998,361.99979399,361.99989698,361.99989699,361.99979401,361.99979401,361.99969096,361.99979397,361.99979399,361.99979401,361.999794,361.999794,361.99989696,361.999794,361.999794,361.99989699,361.99989699,361.999794,361.99989696,361.99979396,361.99989699,361.999897,361.99989705,361.99979399,361.99979399,361.99979403,361.999897,361.99989705,361.99989699,361.99989702,361.99989701,361.99989701,361.99989701,361.999794,199.9375512,83.95197508,83.95197507,83.93410914,78.09195212,78.07408619,78.0740862,78.0740862,42.61022782,0,19.90263892,63.4776266,63.4776266,108.3389608,108.33896079,108.37469263,108.33896081,108.35682672,108.33896081,108.35682673,108.35682673,108.35682673,127.31257168,127.31257168,127.31257167,127.31257167,127.31257168,140.35469592,140.35469593,140.35469593,140.33683,140.33683001,140.35469591,140.37256184,142.99885262,161.32929026,161.32929025,161.32929025,177.42648744,177.42648744,177.42648743,177.42648743,177.42648745,177.44435338,177.44435338,177.42648744,177.42648744,177.42648744,177.44435337,177.44435337,177.44435337,177.44435337,177.44435337,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,217.96426812,217.98213405,217.98213405,217.96426813,217.98213405,217.98213405,217.96426813,217.94640222,217.94640222,217.94640222,217.96426813,217.94640221,217.94640221,217.96426813,217.96426813,217.98213405,217.98213405,217.98213406,217.98213406,217.96426813,217.98213405,217.98213405,217.98213405,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426813,217.96426813,217.96426814,217.94640222,217.94640222,217.96426813,217.96426813,217.96426813,217.96426813,217.98213405,217.98213405,217.98213406,217.98213406,217.98213406,217.98213407,217.98213407,217.98213405,217.96426814,217.98213407,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,279.99999999,279.99999999,279.99999999,304,304,303.99999999,303.99999999,339.99999999,339.99999998,339.99999999,339.99999999,339.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 +361.99708804,361.99708804,361.99708804,361.99999999,361.99999999,362,362.00000001,362,361.99999999,361.99999999,361.99999997,361.99999998,361.99999997,361.99999998,361.99999998,361.99999998,361.99999998,361.99979399,361.99989698,361.99989699,361.99979401,361.99979401,361.99969096,361.99979397,361.99979399,361.99979401,361.999794,361.999794,361.99989696,361.999794,361.999794,361.99989699,361.99989699,361.999794,361.99989696,361.99979396,361.99989699,361.999897,361.99989705,361.99979399,361.99979399,361.99979403,361.999897,361.99989705,361.99989699,361.99989702,361.99989701,361.99989701,361.99989701,361.999794,199.9375512,83.95197508,83.95197507,83.93410914,78.09195212,78.07408619,78.0740862,78.0740862,42.61022782,19.90263892,0,63.4776266,63.4776266,108.3389608,108.33896079,108.37469263,108.33896081,108.35682672,108.33896081,108.35682673,108.35682673,108.35682673,127.31257168,127.31257168,127.31257167,127.31257167,127.31257168,140.35469592,140.35469593,140.35469593,140.33683,140.33683001,140.35469591,140.37256184,142.99885262,161.32929026,161.32929025,161.32929025,177.42648744,177.42648744,177.42648743,177.42648743,177.42648745,177.44435338,177.44435338,177.42648744,177.42648744,177.42648744,177.44435337,177.44435337,177.44435337,177.44435337,177.44435337,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,217.96426812,217.98213405,217.98213405,217.96426813,217.98213405,217.98213405,217.96426813,217.94640222,217.94640222,217.94640222,217.96426813,217.94640221,217.94640221,217.96426813,217.96426813,217.98213405,217.98213405,217.98213406,217.98213406,217.96426813,217.98213405,217.98213405,217.98213405,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426813,217.96426813,217.96426814,217.94640222,217.94640222,217.96426813,217.96426813,217.96426813,217.96426813,217.98213405,217.98213405,217.98213406,217.98213406,217.98213406,217.98213407,217.98213407,217.98213405,217.96426814,217.98213407,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,279.99999999,279.99999999,279.99999999,304,304,303.99999999,303.99999999,339.99999999,339.99999998,339.99999999,339.99999999,339.99999998,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,83.93410916,83.93410915,83.91624322,78.0740862,78.05622027,78.05622028,78.05622028,63.45976068,63.4776266,63.4776266,0,36.80380264,108.32109488,108.32109487,108.35682671,108.32109489,108.3389608,108.32109489,108.33896081,108.33896081,108.33896081,127.29470576,127.29470576,127.29470575,127.29470575,127.29470576,140.33683,140.33683001,140.33683001,140.31896408,140.31896409,140.33682999,140.35469592,142.9809867,161.31142434,161.31142433,161.31142433,177.40862152,177.40862152,177.40862151,177.40862151,177.40862153,177.42648746,177.42648746,177.40862152,177.40862152,177.40862152,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,83.93410916,83.93410915,83.91624322,78.0740862,78.05622027,78.05622028,78.05622028,63.45976068,63.4776266,63.4776266,36.80380264,0,108.32109488,108.32109487,108.35682671,108.32109489,108.3389608,108.32109489,108.33896081,108.33896081,108.33896081,127.29470576,127.29470576,127.29470575,127.29470575,127.29470576,140.33683,140.33683001,140.33683001,140.31896408,140.31896409,140.33682999,140.35469592,142.9809867,161.31142434,161.31142433,161.31142433,177.40862152,177.40862152,177.40862151,177.40862151,177.40862153,177.42648746,177.42648746,177.40862152,177.40862152,177.40862152,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,108.3210949,108.32109489,108.30322896,108.32109488,108.30322895,108.30322896,108.30322896,108.32109488,108.3389608,108.3389608,108.32109488,108.32109488,0,91.58072445,91.61645629,91.58072447,91.59859038,91.58072447,98.20898213,98.20898213,98.20898213,127.27683984,127.27683984,127.27683983,127.27683983,127.27683984,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,108.32109489,108.32109488,108.30322895,108.32109487,108.30322894,108.30322895,108.30322895,108.32109487,108.33896079,108.33896079,108.32109487,108.32109487,91.58072445,0,57.45681034,71.99967218,72.01753809,71.99967218,98.20898212,98.20898212,98.20898212,127.27683983,127.27683983,127.27683982,127.27683982,127.27683983,140.31896407,140.31896408,140.31896408,140.30109815,140.30109816,140.31896406,140.33682999,142.96312077,161.29355841,161.2935584,161.2935584,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.99708803,361.99708803,361.99708803,361.99999998,361.99999998,361.99999999,362,361.99999999,361.99999998,361.99999998,361.99999996,361.99999997,361.99999996,361.99999997,361.99999997,361.99999997,361.99999997,361.99979398,361.99989697,361.99989698,361.999794,361.999794,361.99969095,361.99979396,361.99979398,361.999794,361.99979399,361.99979399,361.99989695,361.99979399,361.99979399,361.99989698,361.99989698,361.99979399,361.99989695,361.99979395,361.99989698,361.99989699,361.99989704,361.99979398,361.99979398,361.99979402,361.99989699,361.99989704,361.99989698,361.99989701,361.999897,361.999897,361.999897,361.99979399,199.93755119,108.35682673,108.35682672,108.33896079,108.35682671,108.33896078,108.33896079,108.33896079,108.35682671,108.37469263,108.37469263,108.35682671,108.35682671,91.61645629,57.45681034,0,72.03540402,72.05326993,72.03540402,98.24471396,98.24471396,98.24471396,127.31257167,127.31257167,127.31257166,127.31257166,127.31257167,140.35469591,140.35469592,140.35469592,140.33682999,140.33683,140.3546959,140.37256183,142.99885261,161.32929025,161.32929024,161.32929024,177.42648743,177.42648743,177.42648742,177.42648742,177.42648744,177.44435337,177.44435337,177.42648743,177.42648743,177.42648743,177.44435336,177.44435336,177.44435336,177.44435336,177.44435336,177.42648744,177.42648744,177.42648744,177.42648744,177.42648744,217.96426811,217.98213404,217.98213404,217.96426812,217.98213404,217.98213404,217.96426812,217.94640221,217.94640221,217.94640221,217.96426812,217.9464022,217.9464022,217.96426812,217.96426812,217.98213404,217.98213404,217.98213405,217.98213405,217.96426812,217.98213404,217.98213404,217.98213404,217.96426812,217.96426812,217.96426813,217.96426813,217.96426813,217.96426812,217.96426812,217.96426813,217.94640221,217.94640221,217.96426812,217.96426812,217.96426812,217.96426812,217.98213404,217.98213404,217.98213405,217.98213405,217.98213405,217.98213406,217.98213406,217.98213404,217.96426813,217.98213406,217.96426813,217.96426813,217.96426813,217.96426813,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,279.99999998,279.99999998,279.99999998,303.99999999,303.99999999,303.99999998,303.99999998,339.99999998,339.99999997,339.99999998,339.99999998,339.99999997,387.99999998,387.99999998,387.99999998,387.99999997,387.99999999,387.99999998,387.999999959,387.999999959,387.999999962,387.999999964,387.999999963,387.999999964,387.999999965,387.999999965,387.99999996,387.99999998,387.99999996,387.99999996,427.99999998,427.99999998,427.99999998 +361.96135621,361.96135621,361.96135621,361.96426816,361.96426816,361.96426817,361.96426818,361.96426817,361.96426816,361.96426816,361.96426814,361.96426815,361.96426814,361.96426815,361.96426815,361.96426815,361.96426815,361.96406216,361.96416515,361.96416516,361.96406218,361.96406218,361.96395913,361.96406214,361.96406216,361.96406218,361.96406217,361.96406217,361.96416513,361.96406217,361.96406217,361.96416516,361.96416516,361.96406217,361.96416513,361.96406213,361.96416516,361.96416517,361.96416522,361.96406216,361.96406216,361.9640622,361.96416517,361.96416522,361.96416516,361.96416519,361.96416518,361.96416518,361.96416518,361.96406217,199.90181937,108.32109491,108.3210949,108.30322897,108.32109489,108.30322896,108.30322897,108.30322897,108.32109489,108.33896081,108.33896081,108.32109489,108.32109489,91.58072447,71.99967218,72.03540402,0,20.38501885,39.12637274,98.20898214,98.20898214,98.20898214,127.27683985,127.27683985,127.27683984,127.27683984,127.27683985,140.31896409,140.3189641,140.3189641,140.30109817,140.30109818,140.31896408,140.33683001,142.96312079,161.29355843,161.29355842,161.29355842,177.39075561,177.39075561,177.3907556,177.3907556,177.39075562,177.40862155,177.40862155,177.39075561,177.39075561,177.39075561,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,177.39075562,177.39075562,177.39075562,177.39075562,177.39075562,217.92853629,217.94640222,217.94640222,217.9285363,217.94640222,217.94640222,217.9285363,217.91067039,217.91067039,217.91067039,217.9285363,217.91067038,217.91067038,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,217.92853631,217.92853631,217.92853631,217.9285363,217.9285363,217.92853631,217.91067039,217.91067039,217.9285363,217.9285363,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640224,217.94640224,217.94640222,217.92853631,217.94640224,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.91067039,217.91067039,279.96426816,279.96426816,279.96426816,303.96426817,303.96426817,303.96426816,303.96426816,339.96426816,339.96426815,339.96426816,339.96426816,339.96426815,387.96426816,387.96426816,387.96426816,387.96426815,387.96426817,387.96426816,387.964268139,387.964268139,387.964268142,387.964268144,387.964268143,387.964268144,387.964268145,387.964268145,387.96426814,387.96426816,387.96426814,387.96426814,427.96426816,427.96426816,427.96426816 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,108.33896082,108.33896081,108.32109488,108.3389608,108.32109487,108.32109488,108.32109488,108.3389608,108.35682672,108.35682672,108.3389608,108.3389608,91.59859038,72.01753809,72.05326993,20.38501885,0,39.14423865,98.22684805,98.22684805,98.22684805,127.29470576,127.29470576,127.29470575,127.29470575,127.29470576,140.33683,140.33683001,140.33683001,140.31896408,140.31896409,140.33682999,140.35469592,142.9809867,161.31142434,161.31142433,161.31142433,177.40862152,177.40862152,177.40862151,177.40862151,177.40862153,177.42648746,177.42648746,177.40862152,177.40862152,177.40862152,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.96135621,361.96135621,361.96135621,361.96426816,361.96426816,361.96426817,361.96426818,361.96426817,361.96426816,361.96426816,361.96426814,361.96426815,361.96426814,361.96426815,361.96426815,361.96426815,361.96426815,361.96406216,361.96416515,361.96416516,361.96406218,361.96406218,361.96395913,361.96406214,361.96406216,361.96406218,361.96406217,361.96406217,361.96416513,361.96406217,361.96406217,361.96416516,361.96416516,361.96406217,361.96416513,361.96406213,361.96416516,361.96416517,361.96416522,361.96406216,361.96406216,361.9640622,361.96416517,361.96416522,361.96416516,361.96416519,361.96416518,361.96416518,361.96416518,361.96406217,199.90181937,108.32109491,108.3210949,108.30322897,108.32109489,108.30322896,108.30322897,108.30322897,108.32109489,108.33896081,108.33896081,108.32109489,108.32109489,91.58072447,71.99967218,72.03540402,39.12637274,39.14423865,0,98.20898214,98.20898214,98.20898214,127.27683985,127.27683985,127.27683984,127.27683984,127.27683985,140.31896409,140.3189641,140.3189641,140.30109817,140.30109818,140.31896408,140.33683001,142.96312079,161.29355843,161.29355842,161.29355842,177.39075561,177.39075561,177.3907556,177.3907556,177.39075562,177.40862155,177.40862155,177.39075561,177.39075561,177.39075561,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,177.39075562,177.39075562,177.39075562,177.39075562,177.39075562,217.92853629,217.94640222,217.94640222,217.9285363,217.94640222,217.94640222,217.9285363,217.91067039,217.91067039,217.91067039,217.9285363,217.91067038,217.91067038,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,217.92853631,217.92853631,217.92853631,217.9285363,217.9285363,217.92853631,217.91067039,217.91067039,217.9285363,217.9285363,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640224,217.94640224,217.94640222,217.92853631,217.94640224,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.91067039,217.91067039,279.96426816,279.96426816,279.96426816,303.96426817,303.96426817,303.96426816,303.96426816,339.96426816,339.96426815,339.96426816,339.96426816,339.96426815,387.96426816,387.96426816,387.96426816,387.96426815,387.96426817,387.96426816,387.964268139,387.964268139,387.964268142,387.964268144,387.964268143,387.964268144,387.964268145,387.964268145,387.96426814,387.96426816,387.96426814,387.96426814,427.96426816,427.96426816,427.96426816 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,108.33896083,108.33896082,108.32109489,108.33896081,108.32109488,108.32109489,108.32109489,108.33896081,108.35682673,108.35682673,108.33896081,108.33896081,98.20898213,98.20898212,98.24471396,98.20898214,98.22684805,98.20898214,0,78.61006392,78.61006392,127.29470577,127.29470577,127.29470576,127.29470576,127.29470577,140.33683001,140.33683002,140.33683002,140.31896409,140.3189641,140.33683,140.35469593,142.98098671,161.31142435,161.31142434,161.31142434,177.40862153,177.40862153,177.40862152,177.40862152,177.40862154,177.42648747,177.42648747,177.40862153,177.40862153,177.40862153,177.42648746,177.42648746,177.42648746,177.42648746,177.42648746,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,108.33896083,108.33896082,108.32109489,108.33896081,108.32109488,108.32109489,108.32109489,108.33896081,108.35682673,108.35682673,108.33896081,108.33896081,98.20898213,98.20898212,98.24471396,98.20898214,98.22684805,98.20898214,78.61006392,0,46.30847402,127.29470577,127.29470577,127.29470576,127.29470576,127.29470577,140.33683001,140.33683002,140.33683002,140.31896409,140.3189641,140.33683,140.35469593,142.98098671,161.31142435,161.31142434,161.31142434,177.40862153,177.40862153,177.40862152,177.40862152,177.40862154,177.42648747,177.42648747,177.40862153,177.40862153,177.40862153,177.42648746,177.42648746,177.42648746,177.42648746,177.42648746,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,108.33896083,108.33896082,108.32109489,108.33896081,108.32109488,108.32109489,108.32109489,108.33896081,108.35682673,108.35682673,108.33896081,108.33896081,98.20898213,98.20898212,98.24471396,98.20898214,98.22684805,98.20898214,78.61006392,46.30847402,0,127.29470577,127.29470577,127.29470576,127.29470576,127.29470577,140.33683001,140.33683002,140.33683002,140.31896409,140.3189641,140.33683,140.35469593,142.98098671,161.31142435,161.31142434,161.31142434,177.40862153,177.40862153,177.40862152,177.40862152,177.40862154,177.42648747,177.42648747,177.40862153,177.40862153,177.40862153,177.42648746,177.42648746,177.42648746,177.42648746,177.42648746,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,127.29470578,127.29470577,127.27683984,127.29470576,127.27683983,127.27683984,127.27683984,127.29470576,127.31257168,127.31257168,127.29470576,127.29470576,127.27683984,127.27683983,127.31257167,127.27683985,127.29470576,127.27683985,127.29470577,127.29470577,127.29470577,0,26.90608098,38.76905425,51.45386001,59.35059826,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,127.29470578,127.29470577,127.27683984,127.29470576,127.27683983,127.27683984,127.27683984,127.29470576,127.31257168,127.31257168,127.29470576,127.29470576,127.27683984,127.27683983,127.31257167,127.27683985,127.29470576,127.27683985,127.29470577,127.29470577,127.29470577,26.90608098,0,38.76905425,51.45386001,59.35059826,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,127.29470577,127.29470576,127.27683983,127.29470575,127.27683982,127.27683983,127.27683983,127.29470575,127.31257167,127.31257167,127.29470575,127.29470575,127.27683983,127.27683982,127.31257166,127.27683984,127.29470575,127.27683984,127.29470576,127.29470576,127.29470576,38.76905425,38.76905425,0,51.45386,59.35059825,140.31896407,140.31896408,140.31896408,140.30109815,140.30109816,140.31896406,140.33682999,142.96312077,161.29355841,161.2935584,161.2935584,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,127.29470577,127.29470576,127.27683983,127.29470575,127.27683982,127.27683983,127.27683983,127.29470575,127.31257167,127.31257167,127.29470575,127.29470575,127.27683983,127.27683982,127.31257166,127.27683984,127.29470575,127.27683984,127.29470576,127.29470576,127.29470576,51.45386001,51.45386001,51.45386,0,59.35059825,140.31896407,140.31896408,140.31896408,140.30109815,140.30109816,140.31896406,140.33682999,142.96312077,161.29355841,161.2935584,161.2935584,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,127.29470578,127.29470577,127.27683984,127.29470576,127.27683983,127.27683984,127.27683984,127.29470576,127.31257168,127.31257168,127.29470576,127.29470576,127.27683984,127.27683983,127.31257167,127.27683985,127.29470576,127.27683985,127.29470577,127.29470577,127.29470577,59.35059826,59.35059826,59.35059825,59.35059825,0,140.31896408,140.31896409,140.31896409,140.30109816,140.30109817,140.31896407,140.33683,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,140.33683002,140.33683001,140.31896408,140.33683,140.31896407,140.31896408,140.31896408,140.33683,140.35469592,140.35469592,140.33683,140.33683,140.31896408,140.31896407,140.35469591,140.31896409,140.33683,140.31896409,140.33683001,140.33683001,140.33683001,140.31896408,140.31896408,140.31896407,140.31896407,140.31896408,0,93.68890347,93.68890347,93.67103754,93.67103755,110.51860349,127.75921978,142.96312078,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.96135621,361.96135621,361.96135621,361.96426816,361.96426816,361.96426817,361.96426818,361.96426817,361.96426816,361.96426816,361.96426814,361.96426815,361.96426814,361.96426815,361.96426815,361.96426815,361.96426815,361.96406216,361.96416515,361.96416516,361.96406218,361.96406218,361.96395913,361.96406214,361.96406216,361.96406218,361.96406217,361.96406217,361.96416513,361.96406217,361.96406217,361.96416516,361.96416516,361.96406217,361.96416513,361.96406213,361.96416516,361.96416517,361.96416522,361.96406216,361.96406216,361.9640622,361.96416517,361.96416522,361.96416516,361.96416519,361.96416518,361.96416518,361.96416518,361.96406217,199.90181937,140.33683003,140.33683002,140.31896409,140.33683001,140.31896408,140.31896409,140.31896409,140.33683001,140.35469593,140.35469593,140.33683001,140.33683001,140.31896409,140.31896408,140.35469592,140.3189641,140.33683001,140.3189641,140.33683002,140.33683002,140.33683002,140.31896409,140.31896409,140.31896408,140.31896408,140.31896409,93.68890347,0,18.43763318,64.22799541,64.22799542,110.5186035,127.75921979,142.96312079,161.29355843,161.29355842,161.29355842,177.39075561,177.39075561,177.3907556,177.3907556,177.39075562,177.40862155,177.40862155,177.39075561,177.39075561,177.39075561,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,177.39075562,177.39075562,177.39075562,177.39075562,177.39075562,217.92853629,217.94640222,217.94640222,217.9285363,217.94640222,217.94640222,217.9285363,217.91067039,217.91067039,217.91067039,217.9285363,217.91067038,217.91067038,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,217.92853631,217.92853631,217.92853631,217.9285363,217.9285363,217.92853631,217.91067039,217.91067039,217.9285363,217.9285363,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640224,217.94640224,217.94640222,217.92853631,217.94640224,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.91067039,217.91067039,279.96426816,279.96426816,279.96426816,303.96426817,303.96426817,303.96426816,303.96426816,339.96426816,339.96426815,339.96426816,339.96426816,339.96426815,387.96426816,387.96426816,387.96426816,387.96426815,387.96426817,387.96426816,387.964268139,387.964268139,387.964268142,387.964268144,387.964268143,387.964268144,387.964268145,387.964268145,387.96426814,387.96426816,387.96426814,387.96426814,427.96426816,427.96426816,427.96426816 +361.96135621,361.96135621,361.96135621,361.96426816,361.96426816,361.96426817,361.96426818,361.96426817,361.96426816,361.96426816,361.96426814,361.96426815,361.96426814,361.96426815,361.96426815,361.96426815,361.96426815,361.96406216,361.96416515,361.96416516,361.96406218,361.96406218,361.96395913,361.96406214,361.96406216,361.96406218,361.96406217,361.96406217,361.96416513,361.96406217,361.96406217,361.96416516,361.96416516,361.96406217,361.96416513,361.96406213,361.96416516,361.96416517,361.96416522,361.96406216,361.96406216,361.9640622,361.96416517,361.96416522,361.96416516,361.96416519,361.96416518,361.96416518,361.96416518,361.96406217,199.90181937,140.33683003,140.33683002,140.31896409,140.33683001,140.31896408,140.31896409,140.31896409,140.33683001,140.35469593,140.35469593,140.33683001,140.33683001,140.31896409,140.31896408,140.35469592,140.3189641,140.33683001,140.3189641,140.33683002,140.33683002,140.33683002,140.31896409,140.31896409,140.31896408,140.31896408,140.31896409,93.68890347,18.43763318,0,64.22799541,64.22799542,110.5186035,127.75921979,142.96312079,161.29355843,161.29355842,161.29355842,177.39075561,177.39075561,177.3907556,177.3907556,177.39075562,177.40862155,177.40862155,177.39075561,177.39075561,177.39075561,177.40862154,177.40862154,177.40862154,177.40862154,177.40862154,177.39075562,177.39075562,177.39075562,177.39075562,177.39075562,217.92853629,217.94640222,217.94640222,217.9285363,217.94640222,217.94640222,217.9285363,217.91067039,217.91067039,217.91067039,217.9285363,217.91067038,217.91067038,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,217.92853631,217.92853631,217.92853631,217.9285363,217.9285363,217.92853631,217.91067039,217.91067039,217.9285363,217.9285363,217.9285363,217.9285363,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640224,217.94640224,217.94640222,217.92853631,217.94640224,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,217.91067039,217.91067039,279.96426816,279.96426816,279.96426816,303.96426817,303.96426817,303.96426816,303.96426816,339.96426816,339.96426815,339.96426816,339.96426816,339.96426815,387.96426816,387.96426816,387.96426816,387.96426815,387.96426817,387.96426816,387.964268139,387.964268139,387.964268142,387.964268144,387.964268143,387.964268144,387.964268145,387.964268145,387.96426814,387.96426816,387.96426814,387.96426814,427.96426816,427.96426816,427.96426816 +361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,199.88395344,140.3189641,140.31896409,140.30109816,140.31896408,140.30109815,140.30109816,140.30109816,140.31896408,140.33683,140.33683,140.31896408,140.31896408,140.30109816,140.30109815,140.33682999,140.30109817,140.31896408,140.30109817,140.31896409,140.31896409,140.31896409,140.30109816,140.30109816,140.30109815,140.30109815,140.30109816,93.67103754,64.22799541,64.22799541,0,49.13128995,110.50073757,127.74135386,142.94525486,161.2756925,161.27569249,161.27569249,177.37288968,177.37288968,177.37288967,177.37288967,177.37288969,177.39075562,177.39075562,177.37288968,177.37288968,177.37288968,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,177.37288969,177.37288969,177.37288969,177.37288969,177.37288969,217.91067036,217.92853629,217.92853629,217.91067037,217.92853629,217.92853629,217.91067037,217.89280446,217.89280446,217.89280446,217.91067037,217.89280445,217.89280445,217.91067037,217.91067037,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,217.91067038,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.89280446,217.89280446,217.91067037,217.91067037,217.91067037,217.91067037,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853631,217.92853631,217.92853629,217.91067038,217.92853631,217.91067038,217.91067038,217.91067038,217.91067038,217.91067038,217.91067038,217.91067038,217.89280446,217.89280446,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 +361.94349029,361.94349029,361.94349029,361.94640224,361.94640224,361.94640225,361.94640226,361.94640225,361.94640224,361.94640224,361.94640222,361.94640223,361.94640222,361.94640223,361.94640223,361.94640223,361.94640223,361.94619624,361.94629923,361.94629924,361.94619626,361.94619626,361.94609321,361.94619622,361.94619624,361.94619626,361.94619625,361.94619625,361.94629921,361.94619625,361.94619625,361.94629924,361.94629924,361.94619625,361.94629921,361.94619621,361.94629924,361.94629925,361.9462993,361.94619624,361.94619624,361.94619628,361.94629925,361.9462993,361.94629924,361.94629927,361.94629926,361.94629926,361.94629926,361.94619625,199.88395345,140.31896411,140.3189641,140.30109817,140.31896409,140.30109816,140.30109817,140.30109817,140.31896409,140.33683001,140.33683001,140.31896409,140.31896409,140.30109817,140.30109816,140.33683,140.30109818,140.31896409,140.30109818,140.3189641,140.3189641,140.3189641,140.30109817,140.30109817,140.30109816,140.30109816,140.30109817,93.67103755,64.22799542,64.22799542,49.13128995,0,110.50073758,127.74135387,142.94525487,161.27569251,161.2756925,161.2756925,177.37288969,177.37288969,177.37288968,177.37288968,177.3728897,177.39075563,177.39075563,177.37288969,177.37288969,177.37288969,177.39075562,177.39075562,177.39075562,177.39075562,177.39075562,177.3728897,177.3728897,177.3728897,177.3728897,177.3728897,217.91067037,217.9285363,217.9285363,217.91067038,217.9285363,217.9285363,217.91067038,217.89280447,217.89280447,217.89280447,217.91067038,217.89280446,217.89280446,217.91067038,217.91067038,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,217.91067039,217.91067039,217.91067039,217.91067038,217.91067038,217.91067039,217.89280447,217.89280447,217.91067038,217.91067038,217.91067038,217.91067038,217.9285363,217.9285363,217.92853631,217.92853631,217.92853631,217.92853632,217.92853632,217.9285363,217.91067039,217.92853632,217.91067039,217.91067039,217.91067039,217.91067039,217.91067039,217.91067039,217.91067039,217.89280447,217.89280447,279.94640224,279.94640224,279.94640224,303.94640225,303.94640225,303.94640224,303.94640224,339.94640224,339.94640223,339.94640224,339.94640224,339.94640223,387.94640224,387.94640224,387.94640224,387.94640223,387.94640225,387.94640224,387.946402219,387.946402219,387.946402222,387.946402224,387.946402223,387.946402224,387.946402225,387.946402225,387.94640222,387.94640224,387.94640222,387.94640222,427.94640224,427.94640224,427.94640224 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,140.33683001,140.33683,140.31896407,140.33682999,140.31896406,140.31896407,140.31896407,140.33682999,140.35469591,140.35469591,140.33682999,140.33682999,140.31896407,140.31896406,140.3546959,140.31896408,140.33682999,140.31896408,140.33683,140.33683,140.33683,140.31896407,140.31896407,140.31896406,140.31896406,140.31896407,110.51860349,110.5186035,110.5186035,110.50073757,110.50073758,0,127.75921977,142.96312077,161.29355841,161.2935584,161.2935584,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,140.35469594,140.35469593,140.33683,140.35469592,140.33682999,140.33683,140.33683,140.35469592,140.37256184,140.37256184,140.35469592,140.35469592,140.33683,140.33682999,140.37256183,140.33683001,140.35469592,140.33683001,140.35469593,140.35469593,140.35469593,140.33683,140.33683,140.33682999,140.33682999,140.33683,127.75921978,127.75921979,127.75921979,127.74135386,127.74135387,127.75921977,0,142.9809867,161.31142434,161.31142433,161.31142433,177.40862152,177.40862152,177.40862151,177.40862151,177.40862153,177.42648746,177.42648746,177.40862152,177.40862152,177.40862152,177.42648745,177.42648745,177.42648745,177.42648745,177.42648745,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,142.98098672,142.98098671,142.96312078,142.9809867,142.96312077,142.96312078,142.96312078,142.9809867,142.99885262,142.99885262,142.9809867,142.9809867,142.96312078,142.96312077,142.99885261,142.96312079,142.9809867,142.96312079,142.98098671,142.98098671,142.98098671,142.96312078,142.96312078,142.96312077,142.96312077,142.96312078,142.96312078,142.96312079,142.96312079,142.94525486,142.94525487,142.96312077,142.9809867,0,161.29355842,161.29355841,161.29355841,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,199.90181936,161.31142436,161.31142435,161.29355842,161.31142434,161.29355841,161.29355842,161.29355842,161.31142434,161.32929026,161.32929026,161.31142434,161.31142434,161.29355842,161.29355841,161.32929025,161.29355843,161.31142434,161.29355843,161.31142435,161.31142435,161.31142435,161.29355842,161.29355842,161.29355841,161.29355841,161.29355842,161.29355842,161.29355843,161.29355843,161.2756925,161.27569251,161.29355841,161.31142434,161.29355842,0,130.52843795,130.52843795,177.3907556,177.3907556,177.39075559,177.39075559,177.39075561,177.40862154,177.40862154,177.3907556,177.3907556,177.3907556,177.40862153,177.40862153,177.40862153,177.40862153,177.40862153,177.39075561,177.39075561,177.39075561,177.39075561,177.39075561,217.92853628,217.94640221,217.94640221,217.92853629,217.94640221,217.94640221,217.92853629,217.91067038,217.91067038,217.91067038,217.92853629,217.91067037,217.91067037,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,217.9285363,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.91067038,217.91067038,217.92853629,217.92853629,217.92853629,217.92853629,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640223,217.94640223,217.94640221,217.9285363,217.94640223,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,217.91067038,217.91067038,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,161.31142435,161.31142434,161.29355841,161.31142433,161.2935584,161.29355841,161.29355841,161.31142433,161.32929025,161.32929025,161.31142433,161.31142433,161.29355841,161.2935584,161.32929024,161.29355842,161.31142433,161.29355842,161.31142434,161.31142434,161.31142434,161.29355841,161.29355841,161.2935584,161.2935584,161.29355841,161.29355841,161.29355842,161.29355842,161.27569249,161.2756925,161.2935584,161.31142433,161.29355841,130.52843795,0,76.14456646,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,199.90181935,161.31142435,161.31142434,161.29355841,161.31142433,161.2935584,161.29355841,161.29355841,161.31142433,161.32929025,161.32929025,161.31142433,161.31142433,161.29355841,161.2935584,161.32929024,161.29355842,161.31142433,161.29355842,161.31142434,161.31142434,161.31142434,161.29355841,161.29355841,161.2935584,161.2935584,161.29355841,161.29355841,161.29355842,161.29355842,161.27569249,161.2756925,161.2935584,161.31142433,161.29355841,130.52843795,76.14456646,0,177.39075559,177.39075559,177.39075558,177.39075558,177.3907556,177.40862153,177.40862153,177.39075559,177.39075559,177.39075559,177.40862152,177.40862152,177.40862152,177.40862152,177.40862152,177.3907556,177.3907556,177.3907556,177.3907556,177.3907556,217.92853627,217.9464022,217.9464022,217.92853628,217.9464022,217.9464022,217.92853628,217.91067037,217.91067037,217.91067037,217.92853628,217.91067036,217.91067036,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.92853628,217.9464022,217.9464022,217.9464022,217.92853628,217.92853628,217.92853629,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.91067037,217.91067037,217.92853628,217.92853628,217.92853628,217.92853628,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.94640222,217.94640222,217.9464022,217.92853629,217.94640222,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.92853629,217.91067037,217.91067037,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,177.40862154,177.40862153,177.3907556,177.40862152,177.39075559,177.3907556,177.3907556,177.40862152,177.42648744,177.42648744,177.40862152,177.40862152,177.3907556,177.39075559,177.42648743,177.39075561,177.40862152,177.39075561,177.40862153,177.40862153,177.40862153,177.3907556,177.3907556,177.39075559,177.39075559,177.3907556,177.3907556,177.39075561,177.39075561,177.37288968,177.37288969,177.39075559,177.40862152,177.3907556,177.3907556,177.39075559,177.39075559,0,74.00065564,83.32666775,83.32666775,134.24455007,134.262416,134.262416,134.24455006,134.24455006,134.24455006,134.26241599,134.26241599,134.26241599,134.26241599,134.26241599,134.24455007,134.24455007,134.24455007,134.24455007,134.24455007,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,177.40862154,177.40862153,177.3907556,177.40862152,177.39075559,177.3907556,177.3907556,177.40862152,177.42648744,177.42648744,177.40862152,177.40862152,177.3907556,177.39075559,177.42648743,177.39075561,177.40862152,177.39075561,177.40862153,177.40862153,177.40862153,177.3907556,177.3907556,177.39075559,177.39075559,177.3907556,177.3907556,177.39075561,177.39075561,177.37288968,177.37288969,177.39075559,177.40862152,177.3907556,177.3907556,177.39075559,177.39075559,74.00065564,0,83.32666775,83.32666775,134.24455007,134.262416,134.262416,134.24455006,134.24455006,134.24455006,134.26241599,134.26241599,134.26241599,134.26241599,134.26241599,134.24455007,134.24455007,134.24455007,134.24455007,134.24455007,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,199.91968527,177.40862153,177.40862152,177.39075559,177.40862151,177.39075558,177.39075559,177.39075559,177.40862151,177.42648743,177.42648743,177.40862151,177.40862151,177.39075559,177.39075558,177.42648742,177.3907556,177.40862151,177.3907556,177.40862152,177.40862152,177.40862152,177.39075559,177.39075559,177.39075558,177.39075558,177.39075559,177.39075559,177.3907556,177.3907556,177.37288967,177.37288968,177.39075558,177.40862151,177.39075559,177.39075559,177.39075558,177.39075558,83.32666775,83.32666775,0,74.92968364,134.24455006,134.26241599,134.26241599,134.24455005,134.24455005,134.24455005,134.26241598,134.26241598,134.26241598,134.26241598,134.26241598,134.24455006,134.24455006,134.24455006,134.24455006,134.24455006,217.94640219,217.96426812,217.96426812,217.9464022,217.96426812,217.96426812,217.9464022,217.92853629,217.92853629,217.92853629,217.9464022,217.92853628,217.92853628,217.9464022,217.9464022,217.96426812,217.96426812,217.96426813,217.96426813,217.9464022,217.96426812,217.96426812,217.96426812,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.92853629,217.92853629,217.9464022,217.9464022,217.9464022,217.9464022,217.96426812,217.96426812,217.96426813,217.96426813,217.96426813,217.96426814,217.96426814,217.96426812,217.94640221,217.96426814,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,199.91968527,177.40862153,177.40862152,177.39075559,177.40862151,177.39075558,177.39075559,177.39075559,177.40862151,177.42648743,177.42648743,177.40862151,177.40862151,177.39075559,177.39075558,177.42648742,177.3907556,177.40862151,177.3907556,177.40862152,177.40862152,177.40862152,177.39075559,177.39075559,177.39075558,177.39075558,177.39075559,177.39075559,177.3907556,177.3907556,177.37288967,177.37288968,177.39075558,177.40862151,177.39075559,177.39075559,177.39075558,177.39075558,83.32666775,83.32666775,74.92968364,0,134.24455006,134.26241599,134.26241599,134.24455005,134.24455005,134.24455005,134.26241598,134.26241598,134.26241598,134.26241598,134.26241598,134.24455006,134.24455006,134.24455006,134.24455006,134.24455006,217.94640219,217.96426812,217.96426812,217.9464022,217.96426812,217.96426812,217.9464022,217.92853629,217.92853629,217.92853629,217.9464022,217.92853628,217.92853628,217.9464022,217.9464022,217.96426812,217.96426812,217.96426813,217.96426813,217.9464022,217.96426812,217.96426812,217.96426812,217.9464022,217.9464022,217.94640221,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.92853629,217.92853629,217.9464022,217.9464022,217.9464022,217.9464022,217.96426812,217.96426812,217.96426813,217.96426813,217.96426813,217.96426814,217.96426814,217.96426812,217.94640221,217.96426814,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,217.92853629,217.92853629,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,177.40862155,177.40862154,177.39075561,177.40862153,177.3907556,177.39075561,177.39075561,177.40862153,177.42648745,177.42648745,177.40862153,177.40862153,177.39075561,177.3907556,177.42648744,177.39075562,177.40862153,177.39075562,177.40862154,177.40862154,177.40862154,177.39075561,177.39075561,177.3907556,177.3907556,177.39075561,177.39075561,177.39075562,177.39075562,177.37288969,177.3728897,177.3907556,177.40862153,177.39075561,177.39075561,177.3907556,177.3907556,134.24455007,134.24455007,134.24455006,134.24455006,0,73.41108015,73.41108015,80.68251105,80.68251105,80.68251105,80.70037698,80.70037698,80.70037698,80.70037698,80.70037698,80.68251106,80.68251106,80.68251106,80.68251106,80.68251106,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.99708806,361.99708806,361.99708806,362.00000001,362.00000001,362.00000002,362.00000003,362.00000002,362.00000001,362.00000001,361.99999999,362,361.99999999,362,362,362,362,361.99979401,361.999897,361.99989701,361.99979403,361.99979403,361.99969098,361.99979399,361.99979401,361.99979403,361.99979402,361.99979402,361.99989698,361.99979402,361.99979402,361.99989701,361.99989701,361.99979402,361.99989698,361.99979398,361.99989701,361.99989702,361.99989707,361.99979401,361.99979401,361.99979405,361.99989702,361.99989707,361.99989701,361.99989704,361.99989703,361.99989703,361.99989703,361.99979402,199.93755122,177.42648748,177.42648747,177.40862154,177.42648746,177.40862153,177.40862154,177.40862154,177.42648746,177.44435338,177.44435338,177.42648746,177.42648746,177.40862154,177.40862153,177.44435337,177.40862155,177.42648746,177.40862155,177.42648747,177.42648747,177.42648747,177.40862154,177.40862154,177.40862153,177.40862153,177.40862154,177.40862154,177.40862155,177.40862155,177.39075562,177.39075563,177.40862153,177.42648746,177.40862154,177.40862154,177.40862153,177.40862153,134.262416,134.262416,134.26241599,134.26241599,73.41108015,0,51.09654156,80.70037698,80.70037698,80.70037698,80.71824291,80.71824291,80.71824291,80.71824291,80.71824291,80.70037699,80.70037699,80.70037699,80.70037699,80.70037699,217.96426814,217.98213407,217.98213407,217.96426815,217.98213407,217.98213407,217.96426815,217.94640224,217.94640224,217.94640224,217.96426815,217.94640223,217.94640223,217.96426815,217.96426815,217.98213407,217.98213407,217.98213408,217.98213408,217.96426815,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426816,217.96426816,217.96426816,217.96426815,217.96426815,217.96426816,217.94640224,217.94640224,217.96426815,217.96426815,217.96426815,217.96426815,217.98213407,217.98213407,217.98213408,217.98213408,217.98213408,217.98213409,217.98213409,217.98213407,217.96426816,217.98213409,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,217.94640224,217.94640224,280.00000001,280.00000001,280.00000001,304.00000002,304.00000002,304.00000001,304.00000001,340.00000001,340,340.00000001,340.00000001,340,388.00000001,388.00000001,388.00000001,388,388.00000002,388.00000001,387.999999989,387.999999989,387.999999992,387.999999994,387.999999993,387.999999994,387.999999995,387.999999995,387.99999999,388.00000001,387.99999999,387.99999999,428.00000001,428.00000001,428.00000001 +361.99708806,361.99708806,361.99708806,362.00000001,362.00000001,362.00000002,362.00000003,362.00000002,362.00000001,362.00000001,361.99999999,362,361.99999999,362,362,362,362,361.99979401,361.999897,361.99989701,361.99979403,361.99979403,361.99969098,361.99979399,361.99979401,361.99979403,361.99979402,361.99979402,361.99989698,361.99979402,361.99979402,361.99989701,361.99989701,361.99979402,361.99989698,361.99979398,361.99989701,361.99989702,361.99989707,361.99979401,361.99979401,361.99979405,361.99989702,361.99989707,361.99989701,361.99989704,361.99989703,361.99989703,361.99989703,361.99979402,199.93755122,177.42648748,177.42648747,177.40862154,177.42648746,177.40862153,177.40862154,177.40862154,177.42648746,177.44435338,177.44435338,177.42648746,177.42648746,177.40862154,177.40862153,177.44435337,177.40862155,177.42648746,177.40862155,177.42648747,177.42648747,177.42648747,177.40862154,177.40862154,177.40862153,177.40862153,177.40862154,177.40862154,177.40862155,177.40862155,177.39075562,177.39075563,177.40862153,177.42648746,177.40862154,177.40862154,177.40862153,177.40862153,134.262416,134.262416,134.26241599,134.26241599,73.41108015,51.09654156,0,80.70037698,80.70037698,80.70037698,80.71824291,80.71824291,80.71824291,80.71824291,80.71824291,80.70037699,80.70037699,80.70037699,80.70037699,80.70037699,217.96426814,217.98213407,217.98213407,217.96426815,217.98213407,217.98213407,217.96426815,217.94640224,217.94640224,217.94640224,217.96426815,217.94640223,217.94640223,217.96426815,217.96426815,217.98213407,217.98213407,217.98213408,217.98213408,217.96426815,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426816,217.96426816,217.96426816,217.96426815,217.96426815,217.96426816,217.94640224,217.94640224,217.96426815,217.96426815,217.96426815,217.96426815,217.98213407,217.98213407,217.98213408,217.98213408,217.98213408,217.98213409,217.98213409,217.98213407,217.96426816,217.98213409,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,217.94640224,217.94640224,280.00000001,280.00000001,280.00000001,304.00000002,304.00000002,304.00000001,304.00000001,340.00000001,340,340.00000001,340.00000001,340,388.00000001,388.00000001,388.00000001,388,388.00000002,388.00000001,387.999999989,387.999999989,387.999999992,387.999999994,387.999999993,387.999999994,387.999999995,387.999999995,387.99999999,388.00000001,387.99999999,387.99999999,428.00000001,428.00000001,428.00000001 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,177.40862154,177.40862153,177.3907556,177.40862152,177.39075559,177.3907556,177.3907556,177.40862152,177.42648744,177.42648744,177.40862152,177.40862152,177.3907556,177.39075559,177.42648743,177.39075561,177.40862152,177.39075561,177.40862153,177.40862153,177.40862153,177.3907556,177.3907556,177.39075559,177.39075559,177.3907556,177.3907556,177.39075561,177.39075561,177.37288968,177.37288969,177.39075559,177.40862152,177.3907556,177.3907556,177.39075559,177.39075559,134.24455006,134.24455006,134.24455005,134.24455005,80.68251105,80.70037698,80.70037698,0,73.28601866,73.28601866,73.30388459,73.30388459,73.30388459,73.30388459,73.30388459,73.28601867,73.28601867,73.28601867,73.28601867,73.28601867,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,177.40862154,177.40862153,177.3907556,177.40862152,177.39075559,177.3907556,177.3907556,177.40862152,177.42648744,177.42648744,177.40862152,177.40862152,177.3907556,177.39075559,177.42648743,177.39075561,177.40862152,177.39075561,177.40862153,177.40862153,177.40862153,177.3907556,177.3907556,177.39075559,177.39075559,177.3907556,177.3907556,177.39075561,177.39075561,177.37288968,177.37288969,177.39075559,177.40862152,177.3907556,177.3907556,177.39075559,177.39075559,134.24455006,134.24455006,134.24455005,134.24455005,80.68251105,80.70037698,80.70037698,73.28601866,0,33.80232748,64.01360431,64.01360431,64.01360431,64.01360431,64.01360431,70.74905751,70.74905751,70.74905751,70.74905751,70.74905751,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,199.91968528,177.40862154,177.40862153,177.3907556,177.40862152,177.39075559,177.3907556,177.3907556,177.40862152,177.42648744,177.42648744,177.40862152,177.40862152,177.3907556,177.39075559,177.42648743,177.39075561,177.40862152,177.39075561,177.40862153,177.40862153,177.40862153,177.3907556,177.3907556,177.39075559,177.39075559,177.3907556,177.3907556,177.39075561,177.39075561,177.37288968,177.37288969,177.39075559,177.40862152,177.3907556,177.3907556,177.39075559,177.39075559,134.24455006,134.24455006,134.24455005,134.24455005,80.68251105,80.70037698,80.70037698,73.28601866,33.80232748,0,64.01360431,64.01360431,64.01360431,64.01360431,64.01360431,70.74905751,70.74905751,70.74905751,70.74905751,70.74905751,217.9464022,217.96426813,217.96426813,217.94640221,217.96426813,217.96426813,217.94640221,217.9285363,217.9285363,217.9285363,217.94640221,217.92853629,217.92853629,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.94640221,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640222,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.9285363,217.9285363,217.94640221,217.94640221,217.94640221,217.94640221,217.96426813,217.96426813,217.96426814,217.96426814,217.96426814,217.96426815,217.96426815,217.96426813,217.94640222,217.96426815,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,199.93755121,177.42648747,177.42648746,177.40862153,177.42648745,177.40862152,177.40862153,177.40862153,177.42648745,177.44435337,177.44435337,177.42648745,177.42648745,177.40862153,177.40862152,177.44435336,177.40862154,177.42648745,177.40862154,177.42648746,177.42648746,177.42648746,177.40862153,177.40862153,177.40862152,177.40862152,177.40862153,177.40862153,177.40862154,177.40862154,177.39075561,177.39075562,177.40862152,177.42648745,177.40862153,177.40862153,177.40862152,177.40862152,134.26241599,134.26241599,134.26241598,134.26241598,80.70037698,80.71824291,80.71824291,73.30388459,64.01360431,64.01360431,0,37.73283068,45.9154237,45.9154237,45.9154237,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,217.96426813,217.98213406,217.98213406,217.96426814,217.98213406,217.98213406,217.96426814,217.94640223,217.94640223,217.94640223,217.96426814,217.94640222,217.94640222,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.96426814,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426814,217.96426814,217.96426815,217.94640223,217.94640223,217.96426814,217.96426814,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.98213407,217.98213408,217.98213408,217.98213406,217.96426815,217.98213408,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,280,280,280,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,199.93755121,177.42648747,177.42648746,177.40862153,177.42648745,177.40862152,177.40862153,177.40862153,177.42648745,177.44435337,177.44435337,177.42648745,177.42648745,177.40862153,177.40862152,177.44435336,177.40862154,177.42648745,177.40862154,177.42648746,177.42648746,177.42648746,177.40862153,177.40862153,177.40862152,177.40862152,177.40862153,177.40862153,177.40862154,177.40862154,177.39075561,177.39075562,177.40862152,177.42648745,177.40862153,177.40862153,177.40862152,177.40862152,134.26241599,134.26241599,134.26241598,134.26241598,80.70037698,80.71824291,80.71824291,73.30388459,64.01360431,64.01360431,37.73283068,0,45.9154237,45.9154237,45.9154237,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,217.96426813,217.98213406,217.98213406,217.96426814,217.98213406,217.98213406,217.96426814,217.94640223,217.94640223,217.94640223,217.96426814,217.94640222,217.94640222,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.96426814,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426814,217.96426814,217.96426815,217.94640223,217.94640223,217.96426814,217.96426814,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.98213407,217.98213408,217.98213408,217.98213406,217.96426815,217.98213408,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,280,280,280,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,199.93755121,177.42648747,177.42648746,177.40862153,177.42648745,177.40862152,177.40862153,177.40862153,177.42648745,177.44435337,177.44435337,177.42648745,177.42648745,177.40862153,177.40862152,177.44435336,177.40862154,177.42648745,177.40862154,177.42648746,177.42648746,177.42648746,177.40862153,177.40862153,177.40862152,177.40862152,177.40862153,177.40862153,177.40862154,177.40862154,177.39075561,177.39075562,177.40862152,177.42648745,177.40862153,177.40862153,177.40862152,177.40862152,134.26241599,134.26241599,134.26241598,134.26241598,80.70037698,80.71824291,80.71824291,73.30388459,64.01360431,64.01360431,45.9154237,45.9154237,0,20.76020324,27.54925422,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,217.96426813,217.98213406,217.98213406,217.96426814,217.98213406,217.98213406,217.96426814,217.94640223,217.94640223,217.94640223,217.96426814,217.94640222,217.94640222,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.96426814,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426814,217.96426814,217.96426815,217.94640223,217.94640223,217.96426814,217.96426814,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.98213407,217.98213408,217.98213408,217.98213406,217.96426815,217.98213408,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,280,280,280,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,199.93755121,177.42648747,177.42648746,177.40862153,177.42648745,177.40862152,177.40862153,177.40862153,177.42648745,177.44435337,177.44435337,177.42648745,177.42648745,177.40862153,177.40862152,177.44435336,177.40862154,177.42648745,177.40862154,177.42648746,177.42648746,177.42648746,177.40862153,177.40862153,177.40862152,177.40862152,177.40862153,177.40862153,177.40862154,177.40862154,177.39075561,177.39075562,177.40862152,177.42648745,177.40862153,177.40862153,177.40862152,177.40862152,134.26241599,134.26241599,134.26241598,134.26241598,80.70037698,80.71824291,80.71824291,73.30388459,64.01360431,64.01360431,45.9154237,45.9154237,20.76020324,0,27.54925422,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,217.96426813,217.98213406,217.98213406,217.96426814,217.98213406,217.98213406,217.96426814,217.94640223,217.94640223,217.94640223,217.96426814,217.94640222,217.94640222,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.96426814,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426814,217.96426814,217.96426815,217.94640223,217.94640223,217.96426814,217.96426814,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.98213407,217.98213408,217.98213408,217.98213406,217.96426815,217.98213408,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,280,280,280,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,199.93755121,177.42648747,177.42648746,177.40862153,177.42648745,177.40862152,177.40862153,177.40862153,177.42648745,177.44435337,177.44435337,177.42648745,177.42648745,177.40862153,177.40862152,177.44435336,177.40862154,177.42648745,177.40862154,177.42648746,177.42648746,177.42648746,177.40862153,177.40862153,177.40862152,177.40862152,177.40862153,177.40862153,177.40862154,177.40862154,177.39075561,177.39075562,177.40862152,177.42648745,177.40862153,177.40862153,177.40862152,177.40862152,134.26241599,134.26241599,134.26241598,134.26241598,80.70037698,80.71824291,80.71824291,73.30388459,64.01360431,64.01360431,45.9154237,45.9154237,27.54925422,27.54925422,0,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,217.96426813,217.98213406,217.98213406,217.96426814,217.98213406,217.98213406,217.96426814,217.94640223,217.94640223,217.94640223,217.96426814,217.94640222,217.94640222,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.96426814,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426814,217.96426814,217.96426815,217.94640223,217.94640223,217.96426814,217.96426814,217.96426814,217.96426814,217.98213406,217.98213406,217.98213407,217.98213407,217.98213407,217.98213408,217.98213408,217.98213406,217.96426815,217.98213408,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,280,280,280,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,177.40862155,177.40862154,177.39075561,177.40862153,177.3907556,177.39075561,177.39075561,177.40862153,177.42648745,177.42648745,177.40862153,177.40862153,177.39075561,177.3907556,177.42648744,177.39075562,177.40862153,177.39075562,177.40862154,177.40862154,177.40862154,177.39075561,177.39075561,177.3907556,177.3907556,177.39075561,177.39075561,177.39075562,177.39075562,177.37288969,177.3728897,177.3907556,177.40862153,177.39075561,177.39075561,177.3907556,177.3907556,134.24455007,134.24455007,134.24455006,134.24455006,80.68251106,80.70037699,80.70037699,73.28601867,70.74905751,70.74905751,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,0,21.79642682,21.79642682,21.79642682,21.79642682,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,177.40862155,177.40862154,177.39075561,177.40862153,177.3907556,177.39075561,177.39075561,177.40862153,177.42648745,177.42648745,177.40862153,177.40862153,177.39075561,177.3907556,177.42648744,177.39075562,177.40862153,177.39075562,177.40862154,177.40862154,177.40862154,177.39075561,177.39075561,177.3907556,177.3907556,177.39075561,177.39075561,177.39075562,177.39075562,177.37288969,177.3728897,177.3907556,177.40862153,177.39075561,177.39075561,177.3907556,177.3907556,134.24455007,134.24455007,134.24455006,134.24455006,80.68251106,80.70037699,80.70037699,73.28601867,70.74905751,70.74905751,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,21.79642682,0,6.32453696,6.32453696,6.32453696,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,177.40862155,177.40862154,177.39075561,177.40862153,177.3907556,177.39075561,177.39075561,177.40862153,177.42648745,177.42648745,177.40862153,177.40862153,177.39075561,177.3907556,177.42648744,177.39075562,177.40862153,177.39075562,177.40862154,177.40862154,177.40862154,177.39075561,177.39075561,177.3907556,177.3907556,177.39075561,177.39075561,177.39075562,177.39075562,177.37288969,177.3728897,177.3907556,177.40862153,177.39075561,177.39075561,177.3907556,177.3907556,134.24455007,134.24455007,134.24455006,134.24455006,80.68251106,80.70037699,80.70037699,73.28601867,70.74905751,70.74905751,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,21.79642682,6.32453696,0,5.43124078,5.43124078,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,177.40862155,177.40862154,177.39075561,177.40862153,177.3907556,177.39075561,177.39075561,177.40862153,177.42648745,177.42648745,177.40862153,177.40862153,177.39075561,177.3907556,177.42648744,177.39075562,177.40862153,177.39075562,177.40862154,177.40862154,177.40862154,177.39075561,177.39075561,177.3907556,177.3907556,177.39075561,177.39075561,177.39075562,177.39075562,177.37288969,177.3728897,177.3907556,177.40862153,177.39075561,177.39075561,177.3907556,177.3907556,134.24455007,134.24455007,134.24455006,134.24455006,80.68251106,80.70037699,80.70037699,73.28601867,70.74905751,70.74905751,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,21.79642682,6.32453696,5.43124078,0,3.28732994,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,199.91968529,177.40862155,177.40862154,177.39075561,177.40862153,177.3907556,177.39075561,177.39075561,177.40862153,177.42648745,177.42648745,177.40862153,177.40862153,177.39075561,177.3907556,177.42648744,177.39075562,177.40862153,177.39075562,177.40862154,177.40862154,177.40862154,177.39075561,177.39075561,177.3907556,177.3907556,177.39075561,177.39075561,177.39075562,177.39075562,177.37288969,177.3728897,177.3907556,177.40862153,177.39075561,177.39075561,177.3907556,177.3907556,134.24455007,134.24455007,134.24455006,134.24455006,80.68251106,80.70037699,80.70037699,73.28601867,70.74905751,70.74905751,70.76692344,70.76692344,70.76692344,70.76692344,70.76692344,21.79642682,6.32453696,5.43124078,3.28732994,0,217.94640221,217.96426814,217.96426814,217.94640222,217.96426814,217.96426814,217.94640222,217.92853631,217.92853631,217.92853631,217.94640222,217.9285363,217.9285363,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.94640222,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640223,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.92853631,217.92853631,217.94640222,217.94640222,217.94640222,217.94640222,217.96426814,217.96426814,217.96426815,217.96426815,217.96426815,217.96426816,217.96426816,217.96426814,217.94640223,217.96426816,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.96135618,361.96135618,361.96135618,361.96426813,361.96426813,361.96426814,361.96426815,361.96426814,361.96426813,361.96426813,361.96426811,361.96426812,361.96426811,361.96426812,361.96426812,361.96426812,361.96426812,361.96406213,361.96416512,361.96416513,361.96406215,361.96406215,361.9639591,361.96406211,361.96406213,361.96406215,361.96406214,361.96406214,361.9641651,361.96406214,361.96406214,361.96416513,361.96416513,361.96406214,361.9641651,361.9640621,361.96416513,361.96416514,361.96416519,361.96406213,361.96406213,361.96406217,361.96416514,361.96416519,361.96416513,361.96416516,361.96416515,361.96416515,361.96416515,361.96406214,217.9464022,217.94640222,217.94640221,217.92853628,217.9464022,217.92853627,217.92853628,217.92853628,217.9464022,217.96426812,217.96426812,217.9464022,217.9464022,217.92853628,217.92853627,217.96426811,217.92853629,217.9464022,217.92853629,217.94640221,217.94640221,217.94640221,217.92853628,217.92853628,217.92853627,217.92853627,217.92853628,217.92853628,217.92853629,217.92853629,217.91067036,217.91067037,217.92853627,217.9464022,217.92853628,217.92853628,217.92853627,217.92853627,217.9464022,217.9464022,217.94640219,217.94640219,217.94640221,217.96426814,217.96426814,217.9464022,217.9464022,217.9464022,217.96426813,217.96426813,217.96426813,217.96426813,217.96426813,217.94640221,217.94640221,217.94640221,217.94640221,217.94640221,0,86.41747253,86.41747253,108.76774297,108.78560889,108.78560889,149.71643989,149.69857398,149.69857398,149.69857398,149.71643989,149.69857397,149.69857397,149.71643989,149.71643989,149.73430581,149.73430581,149.73430582,149.73430582,149.71643989,149.73430581,149.73430581,149.73430581,149.71643989,149.71643989,149.7164399,149.7164399,149.7164399,149.71643989,149.71643989,149.7164399,149.69857398,149.69857398,149.71643989,149.71643989,149.71643989,149.71643989,171.99524665,171.99524665,171.99524666,171.99524666,171.99524666,171.99524667,171.99524667,171.99524665,171.97738074,171.99524667,171.97738074,171.97738074,171.97738074,171.97738074,171.97738074,171.97738074,171.97738074,171.95951482,171.95951482,279.96426813,279.96426813,279.96426813,303.96426814,303.96426814,303.96426813,303.96426813,339.96426813,339.96426812,339.96426813,339.96426813,339.96426812,387.96426813,387.96426813,387.96426813,387.96426812,387.96426814,387.96426813,387.964268109,387.964268109,387.964268112,387.964268114,387.964268113,387.964268114,387.964268115,387.964268115,387.96426811,387.96426813,387.96426811,387.96426811,427.96426813,427.96426813,427.96426813 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,86.41747253,0,61.67316832,108.7856089,108.80347482,108.80347482,149.73430582,149.71643991,149.71643991,149.71643991,149.73430582,149.7164399,149.7164399,149.73430582,149.73430582,149.75217174,149.75217174,149.75217175,149.75217175,149.73430582,149.75217174,149.75217174,149.75217174,149.73430582,149.73430582,149.73430583,149.73430583,149.73430583,149.73430582,149.73430582,149.73430583,149.71643991,149.71643991,149.73430582,149.73430582,149.73430582,149.73430582,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,86.41747253,61.67316832,0,108.7856089,108.80347482,108.80347482,149.73430582,149.71643991,149.71643991,149.71643991,149.73430582,149.7164399,149.7164399,149.73430582,149.73430582,149.75217174,149.75217174,149.75217175,149.75217175,149.73430582,149.75217174,149.75217174,149.75217174,149.73430582,149.73430582,149.73430583,149.73430583,149.73430583,149.73430582,149.73430582,149.73430583,149.71643991,149.71643991,149.73430582,149.73430582,149.73430582,149.73430582,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,108.76774297,108.7856089,108.7856089,0,106.67742992,106.67742992,149.7164399,149.69857399,149.69857399,149.69857399,149.7164399,149.69857398,149.69857398,149.7164399,149.7164399,149.73430582,149.73430582,149.73430583,149.73430583,149.7164399,149.73430582,149.73430582,149.73430582,149.7164399,149.7164399,149.71643991,149.71643991,149.71643991,149.7164399,149.7164399,149.71643991,149.69857399,149.69857399,149.7164399,149.7164399,149.7164399,149.7164399,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,108.78560889,108.80347482,108.80347482,106.67742992,0,22.90411408,149.73430582,149.71643991,149.71643991,149.71643991,149.73430582,149.7164399,149.7164399,149.73430582,149.73430582,149.75217174,149.75217174,149.75217175,149.75217175,149.73430582,149.75217174,149.75217174,149.75217174,149.73430582,149.73430582,149.73430583,149.73430583,149.73430583,149.73430582,149.73430582,149.73430583,149.71643991,149.71643991,149.73430582,149.73430582,149.73430582,149.73430582,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,108.78560889,108.80347482,108.80347482,106.67742992,22.90411408,0,149.73430582,149.71643991,149.71643991,149.71643991,149.73430582,149.7164399,149.7164399,149.73430582,149.73430582,149.75217174,149.75217174,149.75217175,149.75217175,149.73430582,149.75217174,149.75217174,149.75217174,149.73430582,149.73430582,149.73430583,149.73430583,149.73430583,149.73430582,149.73430582,149.73430583,149.71643991,149.71643991,149.73430582,149.73430582,149.73430582,149.73430582,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,0,64.33519095,64.33519095,64.33519095,64.35305686,64.33519094,64.33519094,96.79757416,96.79757416,96.81544008,96.81544008,96.81544009,96.81544009,96.79757416,96.81544008,96.81544008,96.81544008,96.79757416,96.79757416,96.79757417,96.79757417,96.79757417,96.79757416,96.79757416,96.79757417,96.77970825,96.77970825,96.79757416,96.79757416,96.79757416,96.79757416,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,149.69857398,149.71643991,149.71643991,149.69857399,149.71643991,149.71643991,64.33519095,0,42.44943452,42.44943452,42.46730043,42.44943451,42.44943451,96.77970825,96.77970825,96.79757417,96.79757417,96.79757418,96.79757418,96.77970825,96.79757417,96.79757417,96.79757417,96.77970825,96.77970825,96.77970826,96.77970826,96.77970826,96.77970825,96.77970825,96.77970826,96.76184234,96.76184234,96.77970825,96.77970825,96.77970825,96.77970825,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738077,171.97738077,171.97738075,171.95951484,171.97738077,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.94164892,171.94164892,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 +361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,149.69857398,149.71643991,149.71643991,149.69857399,149.71643991,149.71643991,64.33519095,42.44943452,0,25.47680708,39.39436157,39.37649565,39.37649565,96.77970825,96.77970825,96.79757417,96.79757417,96.79757418,96.79757418,96.77970825,96.79757417,96.79757417,96.79757417,96.77970825,96.77970825,96.77970826,96.77970826,96.77970826,96.77970825,96.77970825,96.77970826,96.76184234,96.76184234,96.77970825,96.77970825,96.77970825,96.77970825,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738077,171.97738077,171.97738075,171.95951484,171.97738077,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.94164892,171.94164892,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 +361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,149.69857398,149.71643991,149.71643991,149.69857399,149.71643991,149.71643991,64.33519095,42.44943452,25.47680708,0,39.39436157,39.37649565,39.37649565,96.77970825,96.77970825,96.79757417,96.79757417,96.79757418,96.79757418,96.77970825,96.79757417,96.79757417,96.79757417,96.77970825,96.77970825,96.77970826,96.77970826,96.77970826,96.77970825,96.77970825,96.77970826,96.76184234,96.76184234,96.77970825,96.77970825,96.77970825,96.77970825,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738077,171.97738077,171.97738075,171.95951484,171.97738077,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.94164892,171.94164892,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,64.35305686,42.46730043,39.39436157,39.39436157,0,26.74528764,26.74528764,96.79757416,96.79757416,96.81544008,96.81544008,96.81544009,96.81544009,96.79757416,96.81544008,96.81544008,96.81544008,96.79757416,96.79757416,96.79757417,96.79757417,96.79757417,96.79757416,96.79757416,96.79757417,96.77970825,96.77970825,96.79757416,96.79757416,96.79757416,96.79757416,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.94349027,361.94349027,361.94349027,361.94640222,361.94640222,361.94640223,361.94640224,361.94640223,361.94640222,361.94640222,361.9464022,361.94640221,361.9464022,361.94640221,361.94640221,361.94640221,361.94640221,361.94619622,361.94629921,361.94629922,361.94619624,361.94619624,361.94609319,361.9461962,361.94619622,361.94619624,361.94619623,361.94619623,361.94629919,361.94619623,361.94619623,361.94629922,361.94629922,361.94619623,361.94629919,361.94619619,361.94629922,361.94629923,361.94629928,361.94619622,361.94619622,361.94619626,361.94629923,361.94629928,361.94629922,361.94629925,361.94629924,361.94629924,361.94629924,361.94619623,217.92853629,217.92853631,217.9285363,217.91067037,217.92853629,217.91067036,217.91067037,217.91067037,217.92853629,217.94640221,217.94640221,217.92853629,217.92853629,217.91067037,217.91067036,217.9464022,217.91067038,217.92853629,217.91067038,217.9285363,217.9285363,217.9285363,217.91067037,217.91067037,217.91067036,217.91067036,217.91067037,217.91067037,217.91067038,217.91067038,217.89280445,217.89280446,217.91067036,217.92853629,217.91067037,217.91067037,217.91067036,217.91067036,217.92853629,217.92853629,217.92853628,217.92853628,217.9285363,217.94640223,217.94640223,217.92853629,217.92853629,217.92853629,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,149.69857397,149.7164399,149.7164399,149.69857398,149.7164399,149.7164399,64.33519094,42.44943451,39.37649565,39.37649565,26.74528764,0,23.26143254,96.77970824,96.77970824,96.79757416,96.79757416,96.79757417,96.79757417,96.77970824,96.79757416,96.79757416,96.79757416,96.77970824,96.77970824,96.77970825,96.77970825,96.77970825,96.77970824,96.77970824,96.77970825,96.76184233,96.76184233,96.77970824,96.77970824,96.77970824,96.77970824,171.97738074,171.97738074,171.97738075,171.97738075,171.97738075,171.97738076,171.97738076,171.97738074,171.95951483,171.97738076,171.95951483,171.95951483,171.95951483,171.95951483,171.95951483,171.95951483,171.95951483,171.94164891,171.94164891,279.94640222,279.94640222,279.94640222,303.94640223,303.94640223,303.94640222,303.94640222,339.94640222,339.94640221,339.94640222,339.94640222,339.94640221,387.94640222,387.94640222,387.94640222,387.94640221,387.94640223,387.94640222,387.946402199,387.946402199,387.946402202,387.946402204,387.946402203,387.946402204,387.946402205,387.946402205,387.9464022,387.94640222,387.9464022,387.9464022,427.94640222,427.94640222,427.94640222 +361.94349027,361.94349027,361.94349027,361.94640222,361.94640222,361.94640223,361.94640224,361.94640223,361.94640222,361.94640222,361.9464022,361.94640221,361.9464022,361.94640221,361.94640221,361.94640221,361.94640221,361.94619622,361.94629921,361.94629922,361.94619624,361.94619624,361.94609319,361.9461962,361.94619622,361.94619624,361.94619623,361.94619623,361.94629919,361.94619623,361.94619623,361.94629922,361.94629922,361.94619623,361.94629919,361.94619619,361.94629922,361.94629923,361.94629928,361.94619622,361.94619622,361.94619626,361.94629923,361.94629928,361.94629922,361.94629925,361.94629924,361.94629924,361.94629924,361.94619623,217.92853629,217.92853631,217.9285363,217.91067037,217.92853629,217.91067036,217.91067037,217.91067037,217.92853629,217.94640221,217.94640221,217.92853629,217.92853629,217.91067037,217.91067036,217.9464022,217.91067038,217.92853629,217.91067038,217.9285363,217.9285363,217.9285363,217.91067037,217.91067037,217.91067036,217.91067036,217.91067037,217.91067037,217.91067038,217.91067038,217.89280445,217.89280446,217.91067036,217.92853629,217.91067037,217.91067037,217.91067036,217.91067036,217.92853629,217.92853629,217.92853628,217.92853628,217.9285363,217.94640223,217.94640223,217.92853629,217.92853629,217.92853629,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,217.9285363,217.9285363,217.9285363,217.9285363,217.9285363,149.69857397,149.7164399,149.7164399,149.69857398,149.7164399,149.7164399,64.33519094,42.44943451,39.37649565,39.37649565,26.74528764,23.26143254,0,96.77970824,96.77970824,96.79757416,96.79757416,96.79757417,96.79757417,96.77970824,96.79757416,96.79757416,96.79757416,96.77970824,96.77970824,96.77970825,96.77970825,96.77970825,96.77970824,96.77970824,96.77970825,96.76184233,96.76184233,96.77970824,96.77970824,96.77970824,96.77970824,171.97738074,171.97738074,171.97738075,171.97738075,171.97738075,171.97738076,171.97738076,171.97738074,171.95951483,171.97738076,171.95951483,171.95951483,171.95951483,171.95951483,171.95951483,171.95951483,171.95951483,171.94164891,171.94164891,279.94640222,279.94640222,279.94640222,303.94640223,303.94640223,303.94640222,303.94640222,339.94640222,339.94640221,339.94640222,339.94640222,339.94640221,387.94640222,387.94640222,387.94640222,387.94640221,387.94640223,387.94640222,387.946402199,387.946402199,387.946402202,387.946402204,387.946402203,387.946402204,387.946402205,387.946402205,387.9464022,387.94640222,387.9464022,387.9464022,427.94640222,427.94640222,427.94640222 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,0,17.50860514,71.05277822,71.05277822,71.05277823,71.05277823,82.71922634,82.73709226,82.73709226,82.73709226,82.71922634,82.71922634,82.71922635,82.71922635,82.71922635,82.71922634,82.71922634,82.71922635,82.70136043,82.70136043,82.71922634,82.71922634,82.71922634,82.71922634,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,17.50860514,0,71.05277822,71.05277822,71.05277823,71.05277823,82.71922634,82.73709226,82.73709226,82.73709226,82.71922634,82.71922634,82.71922635,82.71922635,82.71922635,82.71922634,82.71922634,82.71922635,82.70136043,82.70136043,82.71922634,82.71922634,82.71922634,82.71922634,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,149.73430581,149.75217174,149.75217174,149.73430582,149.75217174,149.75217174,96.81544008,96.79757417,96.79757417,96.79757417,96.81544008,96.79757416,96.79757416,71.05277822,71.05277822,0,56.52778232,56.52778233,56.52778233,82.73709226,82.75495818,82.75495818,82.75495818,82.73709226,82.73709226,82.73709227,82.73709227,82.73709227,82.73709226,82.73709226,82.73709227,82.71922635,82.71922635,82.73709226,82.73709226,82.73709226,82.73709226,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,149.73430581,149.75217174,149.75217174,149.73430582,149.75217174,149.75217174,96.81544008,96.79757417,96.79757417,96.79757417,96.81544008,96.79757416,96.79757416,71.05277822,71.05277822,56.52778232,0,37.51843959,37.51843959,82.73709226,82.75495818,82.75495818,82.75495818,82.73709226,82.73709226,82.73709227,82.73709227,82.73709227,82.73709226,82.73709226,82.73709227,82.71922635,82.71922635,82.73709226,82.73709226,82.73709226,82.73709226,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,217.96426814,217.96426816,217.96426815,217.94640222,217.96426814,217.94640221,217.94640222,217.94640222,217.96426814,217.98213406,217.98213406,217.96426814,217.96426814,217.94640222,217.94640221,217.98213405,217.94640223,217.96426814,217.94640223,217.96426815,217.96426815,217.96426815,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.92853631,217.94640221,217.96426814,217.94640222,217.94640222,217.94640221,217.94640221,217.96426814,217.96426814,217.96426813,217.96426813,217.96426815,217.98213408,217.98213408,217.96426814,217.96426814,217.96426814,217.98213407,217.98213407,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,149.73430582,149.75217175,149.75217175,149.73430583,149.75217175,149.75217175,96.81544009,96.79757418,96.79757418,96.79757418,96.81544009,96.79757417,96.79757417,71.05277823,71.05277823,56.52778233,37.51843959,0,30.83658416,82.73709227,82.75495819,82.75495819,82.75495819,82.73709227,82.73709227,82.73709228,82.73709228,82.73709228,82.73709227,82.73709227,82.73709228,82.71922636,82.71922636,82.73709227,82.73709227,82.73709227,82.73709227,172.01311259,172.01311259,172.0131126,172.0131126,172.0131126,172.01311261,172.01311261,172.01311259,171.99524668,172.01311261,171.99524668,171.99524668,171.99524668,171.99524668,171.99524668,171.99524668,171.99524668,171.97738076,171.97738076,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,217.96426814,217.96426816,217.96426815,217.94640222,217.96426814,217.94640221,217.94640222,217.94640222,217.96426814,217.98213406,217.98213406,217.96426814,217.96426814,217.94640222,217.94640221,217.98213405,217.94640223,217.96426814,217.94640223,217.96426815,217.96426815,217.96426815,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.92853631,217.94640221,217.96426814,217.94640222,217.94640222,217.94640221,217.94640221,217.96426814,217.96426814,217.96426813,217.96426813,217.96426815,217.98213408,217.98213408,217.96426814,217.96426814,217.96426814,217.98213407,217.98213407,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,149.73430582,149.75217175,149.75217175,149.73430583,149.75217175,149.75217175,96.81544009,96.79757418,96.79757418,96.79757418,96.81544009,96.79757417,96.79757417,71.05277823,71.05277823,56.52778233,37.51843959,30.83658416,0,82.73709227,82.75495819,82.75495819,82.75495819,82.73709227,82.73709227,82.73709228,82.73709228,82.73709228,82.73709227,82.73709227,82.73709228,82.71922636,82.71922636,82.73709227,82.73709227,82.73709227,82.73709227,172.01311259,172.01311259,172.0131126,172.0131126,172.0131126,172.01311261,172.01311261,172.01311259,171.99524668,172.01311261,171.99524668,171.99524668,171.99524668,171.99524668,171.99524668,171.99524668,171.99524668,171.97738076,171.97738076,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,0,55.72381576,55.72381576,55.72381576,55.70594984,55.70594984,55.70594985,55.70594985,55.70594985,55.70594984,55.70594984,55.70594985,55.68808393,55.68808393,55.70594984,55.70594984,55.70594984,55.70594984,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,149.73430581,149.75217174,149.75217174,149.73430582,149.75217174,149.75217174,96.81544008,96.79757417,96.79757417,96.79757417,96.81544008,96.79757416,96.79757416,82.73709226,82.73709226,82.75495818,82.75495818,82.75495819,82.75495819,55.72381576,0,51.84691034,51.84691034,51.82904442,51.82904442,51.82904443,51.82904443,51.82904443,51.82904442,51.82904442,51.82904443,51.81117851,51.81117851,51.82904442,51.82904442,51.82904442,51.82904442,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,149.73430581,149.75217174,149.75217174,149.73430582,149.75217174,149.75217174,96.81544008,96.79757417,96.79757417,96.79757417,96.81544008,96.79757416,96.79757416,82.73709226,82.73709226,82.75495818,82.75495818,82.75495819,82.75495819,55.72381576,51.84691034,0,33.30208162,49.57793804,49.57793804,49.57793805,49.57793805,49.57793805,49.57793804,49.57793804,49.57793805,49.56007213,49.56007213,49.57793804,49.57793804,49.57793804,49.57793804,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,149.73430581,149.75217174,149.75217174,149.73430582,149.75217174,149.75217174,96.81544008,96.79757417,96.79757417,96.79757417,96.81544008,96.79757416,96.79757416,82.73709226,82.73709226,82.75495818,82.75495818,82.75495819,82.75495819,55.72381576,51.84691034,33.30208162,0,49.57793804,49.57793804,49.57793805,49.57793805,49.57793805,49.57793804,49.57793804,49.57793805,49.56007213,49.56007213,49.57793804,49.57793804,49.57793804,49.57793804,172.01311258,172.01311258,172.01311259,172.01311259,172.01311259,172.0131126,172.0131126,172.01311258,171.99524667,172.0131126,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,0,37.3755122,48.09506639,48.09506639,48.09506639,48.09506638,48.09506638,48.09506639,48.07720047,48.07720047,48.09506638,48.09506638,48.09506638,48.09506638,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,37.3755122,0,48.09506639,48.09506639,48.09506639,48.09506638,48.09506638,48.09506639,48.07720047,48.07720047,48.09506638,48.09506638,48.09506638,48.09506638,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,149.7164399,149.73430583,149.73430583,149.71643991,149.73430583,149.73430583,96.79757417,96.77970826,96.77970826,96.77970826,96.79757417,96.77970825,96.77970825,82.71922635,82.71922635,82.73709227,82.73709227,82.73709228,82.73709228,55.70594985,51.82904443,49.57793805,49.57793805,48.09506639,48.09506639,0,18.54482872,18.54482872,34.01671857,34.01671857,34.01671858,33.99885266,33.99885266,45.16505491,45.16505491,45.16505491,45.16505491,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524669,171.99524669,171.99524667,171.97738076,171.99524669,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.95951484,171.95951484,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,149.7164399,149.73430583,149.73430583,149.71643991,149.73430583,149.73430583,96.79757417,96.77970826,96.77970826,96.77970826,96.79757417,96.77970825,96.77970825,82.71922635,82.71922635,82.73709227,82.73709227,82.73709228,82.73709228,55.70594985,51.82904443,49.57793805,49.57793805,48.09506639,48.09506639,18.54482872,0,8.79003442,34.01671857,34.01671857,34.01671858,33.99885266,33.99885266,45.16505491,45.16505491,45.16505491,45.16505491,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524669,171.99524669,171.99524667,171.97738076,171.99524669,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.95951484,171.95951484,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,149.7164399,149.73430583,149.73430583,149.71643991,149.73430583,149.73430583,96.79757417,96.77970826,96.77970826,96.77970826,96.79757417,96.77970825,96.77970825,82.71922635,82.71922635,82.73709227,82.73709227,82.73709228,82.73709228,55.70594985,51.82904443,49.57793805,49.57793805,48.09506639,48.09506639,18.54482872,8.79003442,0,34.01671857,34.01671857,34.01671858,33.99885266,33.99885266,45.16505491,45.16505491,45.16505491,45.16505491,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524669,171.99524669,171.99524667,171.97738076,171.99524669,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.95951484,171.95951484,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,48.09506638,48.09506638,34.01671857,34.01671857,34.01671857,0,17.83019176,19.54532043,19.52745451,19.52745451,45.1650549,45.1650549,45.1650549,45.1650549,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,48.09506638,48.09506638,34.01671857,34.01671857,34.01671857,17.83019176,0,19.54532043,19.52745451,19.52745451,45.1650549,45.1650549,45.1650549,45.1650549,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,149.7164399,149.73430583,149.73430583,149.71643991,149.73430583,149.73430583,96.79757417,96.77970826,96.77970826,96.77970826,96.79757417,96.77970825,96.77970825,82.71922635,82.71922635,82.73709227,82.73709227,82.73709228,82.73709228,55.70594985,51.82904443,49.57793805,49.57793805,48.09506639,48.09506639,34.01671858,34.01671858,34.01671858,19.54532043,19.54532043,0,16.27585642,16.27585642,45.16505491,45.16505491,45.16505491,45.16505491,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524669,171.99524669,171.99524667,171.97738076,171.99524669,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.97738076,171.95951484,171.95951484,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,149.69857398,149.71643991,149.71643991,149.69857399,149.71643991,149.71643991,96.77970825,96.76184234,96.76184234,96.76184234,96.77970825,96.76184233,96.76184233,82.70136043,82.70136043,82.71922635,82.71922635,82.71922636,82.71922636,55.68808393,51.81117851,49.56007213,49.56007213,48.07720047,48.07720047,33.99885266,33.99885266,33.99885266,19.52745451,19.52745451,16.27585642,0,7.68234716,45.14718899,45.14718899,45.14718899,45.14718899,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738077,171.97738077,171.97738075,171.95951484,171.97738077,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.94164892,171.94164892,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 +361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,149.69857398,149.71643991,149.71643991,149.69857399,149.71643991,149.71643991,96.77970825,96.76184234,96.76184234,96.76184234,96.77970825,96.76184233,96.76184233,82.70136043,82.70136043,82.71922635,82.71922635,82.71922636,82.71922636,55.68808393,51.81117851,49.56007213,49.56007213,48.07720047,48.07720047,33.99885266,33.99885266,33.99885266,19.52745451,19.52745451,16.27585642,7.68234716,0,45.14718899,45.14718899,45.14718899,45.14718899,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738077,171.97738077,171.97738075,171.95951484,171.97738077,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.95951484,171.94164892,171.94164892,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,48.09506638,48.09506638,45.16505491,45.16505491,45.16505491,45.1650549,45.1650549,45.16505491,45.14718899,45.14718899,0,32.80183576,32.80183576,32.80183576,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,48.09506638,48.09506638,45.16505491,45.16505491,45.16505491,45.1650549,45.1650549,45.16505491,45.14718899,45.14718899,32.80183576,0,21.51057204,21.51057204,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,48.09506638,48.09506638,45.16505491,45.16505491,45.16505491,45.1650549,45.1650549,45.16505491,45.14718899,45.14718899,32.80183576,21.51057204,0,16.40091788,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.96135619,361.96135619,361.96135619,361.96426814,361.96426814,361.96426815,361.96426816,361.96426815,361.96426814,361.96426814,361.96426812,361.96426813,361.96426812,361.96426813,361.96426813,361.96426813,361.96426813,361.96406214,361.96416513,361.96416514,361.96406216,361.96406216,361.96395911,361.96406212,361.96406214,361.96406216,361.96406215,361.96406215,361.96416511,361.96406215,361.96406215,361.96416514,361.96416514,361.96406215,361.96416511,361.96406211,361.96416514,361.96416515,361.9641652,361.96406214,361.96406214,361.96406218,361.96416515,361.9641652,361.96416514,361.96416517,361.96416516,361.96416516,361.96416516,361.96406215,217.94640221,217.94640223,217.94640222,217.92853629,217.94640221,217.92853628,217.92853629,217.92853629,217.94640221,217.96426813,217.96426813,217.94640221,217.94640221,217.92853629,217.92853628,217.96426812,217.9285363,217.94640221,217.9285363,217.94640222,217.94640222,217.94640222,217.92853629,217.92853629,217.92853628,217.92853628,217.92853629,217.92853629,217.9285363,217.9285363,217.91067037,217.91067038,217.92853628,217.94640221,217.92853629,217.92853629,217.92853628,217.92853628,217.94640221,217.94640221,217.9464022,217.9464022,217.94640222,217.96426815,217.96426815,217.94640221,217.94640221,217.94640221,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,217.94640222,217.94640222,217.94640222,217.94640222,217.94640222,149.71643989,149.73430582,149.73430582,149.7164399,149.73430582,149.73430582,96.79757416,96.77970825,96.77970825,96.77970825,96.79757416,96.77970824,96.77970824,82.71922634,82.71922634,82.73709226,82.73709226,82.73709227,82.73709227,55.70594984,51.82904442,49.57793804,49.57793804,48.09506638,48.09506638,45.16505491,45.16505491,45.16505491,45.1650549,45.1650549,45.16505491,45.14718899,45.14718899,32.80183576,21.51057204,16.40091788,0,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524668,171.99524668,171.99524666,171.97738075,171.99524668,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,279.96426814,279.96426814,279.96426814,303.96426815,303.96426815,303.96426814,303.96426814,339.96426814,339.96426813,339.96426814,339.96426814,339.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426815,387.96426814,387.964268119,387.964268119,387.964268122,387.964268124,387.964268123,387.964268124,387.964268125,387.964268125,387.96426812,387.96426814,387.96426812,387.96426812,427.96426814,427.96426814,427.96426814 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,171.99524665,172.01311258,172.01311258,171.99524666,172.01311258,172.01311258,171.99524666,171.97738075,171.97738075,171.97738075,171.99524666,171.97738074,171.97738074,171.99524666,171.99524666,172.01311258,172.01311258,172.01311259,172.01311259,171.99524666,172.01311258,172.01311258,172.01311258,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524666,171.99524666,171.99524667,171.97738075,171.97738075,171.99524666,171.99524666,171.99524666,171.99524666,0,76.3232257,159.86428453,159.86428453,159.86428453,159.86428454,159.86428454,159.86428452,159.84641861,159.86428454,159.84641861,159.84641861,159.84641861,159.84641861,159.84641861,159.84641861,159.84641861,159.82855269,159.82855269,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,171.99524665,172.01311258,172.01311258,171.99524666,172.01311258,172.01311258,171.99524666,171.97738075,171.97738075,171.97738075,171.99524666,171.97738074,171.97738074,171.99524666,171.99524666,172.01311258,172.01311258,172.01311259,172.01311259,171.99524666,172.01311258,172.01311258,172.01311258,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524666,171.99524666,171.99524667,171.97738075,171.97738075,171.99524666,171.99524666,171.99524666,171.99524666,76.3232257,0,159.86428453,159.86428453,159.86428453,159.86428454,159.86428454,159.86428452,159.84641861,159.86428454,159.84641861,159.84641861,159.84641861,159.84641861,159.84641861,159.84641861,159.84641861,159.82855269,159.82855269,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,217.96426814,217.96426816,217.96426815,217.94640222,217.96426814,217.94640221,217.94640222,217.94640222,217.96426814,217.98213406,217.98213406,217.96426814,217.96426814,217.94640222,217.94640221,217.98213405,217.94640223,217.96426814,217.94640223,217.96426815,217.96426815,217.96426815,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.92853631,217.94640221,217.96426814,217.94640222,217.94640222,217.94640221,217.94640221,217.96426814,217.96426814,217.96426813,217.96426813,217.96426815,217.98213408,217.98213408,217.96426814,217.96426814,217.96426814,217.98213407,217.98213407,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,171.99524666,172.01311259,172.01311259,171.99524667,172.01311259,172.01311259,171.99524667,171.97738076,171.97738076,171.97738076,171.99524667,171.97738075,171.97738075,171.99524667,171.99524667,172.01311259,172.01311259,172.0131126,172.0131126,171.99524667,172.01311259,172.01311259,172.01311259,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524667,171.99524667,171.99524668,171.97738076,171.97738076,171.99524667,171.99524667,171.99524667,171.99524667,159.86428453,159.86428453,0,155.2191444,155.2191444,155.21914441,155.21914441,155.21914439,155.20127848,155.21914441,155.20127848,155.20127848,155.20127848,155.20127848,155.20127848,155.20127848,155.20127848,155.18341256,155.18341256,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,217.96426814,217.96426816,217.96426815,217.94640222,217.96426814,217.94640221,217.94640222,217.94640222,217.96426814,217.98213406,217.98213406,217.96426814,217.96426814,217.94640222,217.94640221,217.98213405,217.94640223,217.96426814,217.94640223,217.96426815,217.96426815,217.96426815,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.92853631,217.94640221,217.96426814,217.94640222,217.94640222,217.94640221,217.94640221,217.96426814,217.96426814,217.96426813,217.96426813,217.96426815,217.98213408,217.98213408,217.96426814,217.96426814,217.96426814,217.98213407,217.98213407,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,171.99524666,172.01311259,172.01311259,171.99524667,172.01311259,172.01311259,171.99524667,171.97738076,171.97738076,171.97738076,171.99524667,171.97738075,171.97738075,171.99524667,171.99524667,172.01311259,172.01311259,172.0131126,172.0131126,171.99524667,172.01311259,172.01311259,172.01311259,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524667,171.99524667,171.99524668,171.97738076,171.97738076,171.99524667,171.99524667,171.99524667,171.99524667,159.86428453,159.86428453,155.2191444,0,108.44615636,108.44615637,108.44615637,149.50204883,149.48418292,149.50204885,149.48418292,149.48418292,149.48418292,149.48418292,149.48418292,149.48418292,149.48418292,149.466317,149.466317,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.97922212,361.97922212,361.97922212,361.98213407,361.98213407,361.98213408,361.98213409,361.98213408,361.98213407,361.98213407,361.98213405,361.98213406,361.98213405,361.98213406,361.98213406,361.98213406,361.98213406,361.98192807,361.98203106,361.98203107,361.98192809,361.98192809,361.98182504,361.98192805,361.98192807,361.98192809,361.98192808,361.98192808,361.98203104,361.98192808,361.98192808,361.98203107,361.98203107,361.98192808,361.98203104,361.98192804,361.98203107,361.98203108,361.98203113,361.98192807,361.98192807,361.98192811,361.98203108,361.98203113,361.98203107,361.9820311,361.98203109,361.98203109,361.98203109,361.98192808,217.96426814,217.96426816,217.96426815,217.94640222,217.96426814,217.94640221,217.94640222,217.94640222,217.96426814,217.98213406,217.98213406,217.96426814,217.96426814,217.94640222,217.94640221,217.98213405,217.94640223,217.96426814,217.94640223,217.96426815,217.96426815,217.96426815,217.94640222,217.94640222,217.94640221,217.94640221,217.94640222,217.94640222,217.94640223,217.94640223,217.9285363,217.92853631,217.94640221,217.96426814,217.94640222,217.94640222,217.94640221,217.94640221,217.96426814,217.96426814,217.96426813,217.96426813,217.96426815,217.98213408,217.98213408,217.96426814,217.96426814,217.96426814,217.98213407,217.98213407,217.98213407,217.98213407,217.98213407,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,171.99524666,172.01311259,172.01311259,171.99524667,172.01311259,172.01311259,171.99524667,171.97738076,171.97738076,171.97738076,171.99524667,171.97738075,171.97738075,171.99524667,171.99524667,172.01311259,172.01311259,172.0131126,172.0131126,171.99524667,172.01311259,172.01311259,172.01311259,171.99524667,171.99524667,171.99524668,171.99524668,171.99524668,171.99524667,171.99524667,171.99524668,171.97738076,171.97738076,171.99524667,171.99524667,171.99524667,171.99524667,159.86428453,159.86428453,155.2191444,108.44615636,0,76.71627601,76.71627601,149.50204883,149.48418292,149.50204885,149.48418292,149.48418292,149.48418292,149.48418292,149.48418292,149.48418292,149.48418292,149.466317,149.466317,279.98213407,279.98213407,279.98213407,303.98213408,303.98213408,303.98213407,303.98213407,339.98213407,339.98213406,339.98213407,339.98213407,339.98213406,387.98213407,387.98213407,387.98213407,387.98213406,387.98213408,387.98213407,387.982134049,387.982134049,387.982134052,387.982134054,387.982134053,387.982134054,387.982134055,387.982134055,387.98213405,387.98213407,387.98213405,387.98213405,427.98213407,427.98213407,427.98213407 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,217.96426815,217.96426817,217.96426816,217.94640223,217.96426815,217.94640222,217.94640223,217.94640223,217.96426815,217.98213407,217.98213407,217.96426815,217.96426815,217.94640223,217.94640222,217.98213406,217.94640224,217.96426815,217.94640224,217.96426816,217.96426816,217.96426816,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.94640223,217.94640224,217.94640224,217.92853631,217.92853632,217.94640222,217.96426815,217.94640223,217.94640223,217.94640222,217.94640222,217.96426815,217.96426815,217.96426814,217.96426814,217.96426816,217.98213409,217.98213409,217.96426815,217.96426815,217.96426815,217.98213408,217.98213408,217.98213408,217.98213408,217.98213408,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,171.99524667,172.0131126,172.0131126,171.99524668,172.0131126,172.0131126,171.99524668,171.97738077,171.97738077,171.97738077,171.99524668,171.97738076,171.97738076,171.99524668,171.99524668,172.0131126,172.0131126,172.01311261,172.01311261,171.99524668,172.0131126,172.0131126,172.0131126,171.99524668,171.99524668,171.99524669,171.99524669,171.99524669,171.99524668,171.99524668,171.99524669,171.97738077,171.97738077,171.99524668,171.99524668,171.99524668,171.99524668,159.86428454,159.86428454,155.21914441,108.44615637,76.71627601,0,59.74364858,149.50204884,149.48418293,149.50204886,149.48418293,149.48418293,149.48418293,149.48418293,149.48418293,149.48418293,149.48418293,149.46631701,149.46631701,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,217.96426815,217.96426817,217.96426816,217.94640223,217.96426815,217.94640222,217.94640223,217.94640223,217.96426815,217.98213407,217.98213407,217.96426815,217.96426815,217.94640223,217.94640222,217.98213406,217.94640224,217.96426815,217.94640224,217.96426816,217.96426816,217.96426816,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.94640223,217.94640224,217.94640224,217.92853631,217.92853632,217.94640222,217.96426815,217.94640223,217.94640223,217.94640222,217.94640222,217.96426815,217.96426815,217.96426814,217.96426814,217.96426816,217.98213409,217.98213409,217.96426815,217.96426815,217.96426815,217.98213408,217.98213408,217.98213408,217.98213408,217.98213408,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,171.99524667,172.0131126,172.0131126,171.99524668,172.0131126,172.0131126,171.99524668,171.97738077,171.97738077,171.97738077,171.99524668,171.97738076,171.97738076,171.99524668,171.99524668,172.0131126,172.0131126,172.01311261,172.01311261,171.99524668,172.0131126,172.0131126,172.0131126,171.99524668,171.99524668,171.99524669,171.99524669,171.99524669,171.99524668,171.99524668,171.99524669,171.97738077,171.97738077,171.99524668,171.99524668,171.99524668,171.99524668,159.86428454,159.86428454,155.21914441,108.44615637,76.71627601,59.74364858,0,149.50204884,149.48418293,149.50204886,149.48418293,149.48418293,149.48418293,149.48418293,149.48418293,149.48418293,149.48418293,149.46631701,149.46631701,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.97922211,361.97922211,361.97922211,361.98213406,361.98213406,361.98213407,361.98213408,361.98213407,361.98213406,361.98213406,361.98213404,361.98213405,361.98213404,361.98213405,361.98213405,361.98213405,361.98213405,361.98192806,361.98203105,361.98203106,361.98192808,361.98192808,361.98182503,361.98192804,361.98192806,361.98192808,361.98192807,361.98192807,361.98203103,361.98192807,361.98192807,361.98203106,361.98203106,361.98192807,361.98203103,361.98192803,361.98203106,361.98203107,361.98203112,361.98192806,361.98192806,361.9819281,361.98203107,361.98203112,361.98203106,361.98203109,361.98203108,361.98203108,361.98203108,361.98192807,217.96426813,217.96426815,217.96426814,217.94640221,217.96426813,217.9464022,217.94640221,217.94640221,217.96426813,217.98213405,217.98213405,217.96426813,217.96426813,217.94640221,217.9464022,217.98213404,217.94640222,217.96426813,217.94640222,217.96426814,217.96426814,217.96426814,217.94640221,217.94640221,217.9464022,217.9464022,217.94640221,217.94640221,217.94640222,217.94640222,217.92853629,217.9285363,217.9464022,217.96426813,217.94640221,217.94640221,217.9464022,217.9464022,217.96426813,217.96426813,217.96426812,217.96426812,217.96426814,217.98213407,217.98213407,217.96426813,217.96426813,217.96426813,217.98213406,217.98213406,217.98213406,217.98213406,217.98213406,217.96426814,217.96426814,217.96426814,217.96426814,217.96426814,171.99524665,172.01311258,172.01311258,171.99524666,172.01311258,172.01311258,171.99524666,171.97738075,171.97738075,171.97738075,171.99524666,171.97738074,171.97738074,171.99524666,171.99524666,172.01311258,172.01311258,172.01311259,172.01311259,171.99524666,172.01311258,172.01311258,172.01311258,171.99524666,171.99524666,171.99524667,171.99524667,171.99524667,171.99524666,171.99524666,171.99524667,171.97738075,171.97738075,171.99524666,171.99524666,171.99524666,171.99524666,159.86428452,159.86428452,155.21914439,149.50204883,149.50204883,149.50204884,149.50204884,0,131.86838223,131.88624816,131.86838223,131.86838223,131.86838223,131.86838223,131.86838223,131.86838223,131.86838223,131.85051631,131.85051631,279.98213406,279.98213406,279.98213406,303.98213407,303.98213407,303.98213406,303.98213406,339.98213406,339.98213405,339.98213406,339.98213406,339.98213405,387.98213406,387.98213406,387.98213406,387.98213405,387.98213407,387.98213406,387.982134039,387.982134039,387.982134042,387.982134044,387.982134043,387.982134044,387.982134045,387.982134045,387.98213404,387.98213406,387.98213404,387.98213404,427.98213406,427.98213406,427.98213406 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,0,99.92411081,99.90624488,99.90624488,99.90624488,99.90624488,99.90624488,99.90624488,99.90624488,99.88837896,99.88837896,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.97922213,361.97922213,361.97922213,361.98213408,361.98213408,361.98213409,361.9821341,361.98213409,361.98213408,361.98213408,361.98213406,361.98213407,361.98213406,361.98213407,361.98213407,361.98213407,361.98213407,361.98192808,361.98203107,361.98203108,361.9819281,361.9819281,361.98182505,361.98192806,361.98192808,361.9819281,361.98192809,361.98192809,361.98203105,361.98192809,361.98192809,361.98203108,361.98203108,361.98192809,361.98203105,361.98192805,361.98203108,361.98203109,361.98203114,361.98192808,361.98192808,361.98192812,361.98203109,361.98203114,361.98203108,361.98203111,361.9820311,361.9820311,361.9820311,361.98192809,217.96426815,217.96426817,217.96426816,217.94640223,217.96426815,217.94640222,217.94640223,217.94640223,217.96426815,217.98213407,217.98213407,217.96426815,217.96426815,217.94640223,217.94640222,217.98213406,217.94640224,217.96426815,217.94640224,217.96426816,217.96426816,217.96426816,217.94640223,217.94640223,217.94640222,217.94640222,217.94640223,217.94640223,217.94640224,217.94640224,217.92853631,217.92853632,217.94640222,217.96426815,217.94640223,217.94640223,217.94640222,217.94640222,217.96426815,217.96426815,217.96426814,217.96426814,217.96426816,217.98213409,217.98213409,217.96426815,217.96426815,217.96426815,217.98213408,217.98213408,217.98213408,217.98213408,217.98213408,217.96426816,217.96426816,217.96426816,217.96426816,217.96426816,171.99524667,172.0131126,172.0131126,171.99524668,172.0131126,172.0131126,171.99524668,171.97738077,171.97738077,171.97738077,171.99524668,171.97738076,171.97738076,171.99524668,171.99524668,172.0131126,172.0131126,172.01311261,172.01311261,171.99524668,172.0131126,172.0131126,172.0131126,171.99524668,171.99524668,171.99524669,171.99524669,171.99524669,171.99524668,171.99524668,171.99524669,171.97738077,171.97738077,171.99524668,171.99524668,171.99524668,171.99524668,159.86428454,159.86428454,155.21914441,149.50204885,149.50204885,149.50204886,149.50204886,131.88624816,99.92411081,0,71.05277823,71.05277823,71.05277823,71.05277823,71.05277823,71.05277823,71.05277823,71.03491231,71.03491231,279.98213408,279.98213408,279.98213408,303.98213409,303.98213409,303.98213408,303.98213408,339.98213408,339.98213407,339.98213408,339.98213408,339.98213407,387.98213408,387.98213408,387.98213408,387.98213407,387.98213409,387.98213408,387.982134059,387.982134059,387.982134062,387.982134064,387.982134063,387.982134064,387.982134065,387.982134065,387.98213406,387.98213408,387.98213406,387.98213406,427.98213408,427.98213408,427.98213408 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,0,57.88559252,65.06769382,65.06769382,65.06769382,65.06769382,65.06769382,65.0498279,65.0498279,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,57.88559252,0,65.06769382,65.06769382,65.06769382,65.06769382,65.06769382,65.0498279,65.0498279,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,65.06769382,65.06769382,0,55.70594984,55.70594984,55.70594984,55.70594984,55.68808392,55.68808392,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,65.06769382,65.06769382,55.70594984,0,36.8395345,36.8395345,46.34420586,46.32633994,46.32633994,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,65.06769382,65.06769382,55.70594984,36.8395345,0,31.33683002,46.34420586,46.32633994,46.32633994,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,65.06769382,65.06769382,55.70594984,36.8395345,31.33683002,0,46.34420586,46.32633994,46.32633994,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.9613562,361.9613562,361.9613562,361.96426815,361.96426815,361.96426816,361.96426817,361.96426816,361.96426815,361.96426815,361.96426813,361.96426814,361.96426813,361.96426814,361.96426814,361.96426814,361.96426814,361.96406215,361.96416514,361.96416515,361.96406217,361.96406217,361.96395912,361.96406213,361.96406215,361.96406217,361.96406216,361.96406216,361.96416512,361.96406216,361.96406216,361.96416515,361.96416515,361.96406216,361.96416512,361.96406212,361.96416515,361.96416516,361.96416521,361.96406215,361.96406215,361.96406219,361.96416516,361.96416521,361.96416515,361.96416518,361.96416517,361.96416517,361.96416517,361.96406216,217.94640222,217.94640224,217.94640223,217.9285363,217.94640222,217.92853629,217.9285363,217.9285363,217.94640222,217.96426814,217.96426814,217.94640222,217.94640222,217.9285363,217.92853629,217.96426813,217.92853631,217.94640222,217.92853631,217.94640223,217.94640223,217.94640223,217.9285363,217.9285363,217.92853629,217.92853629,217.9285363,217.9285363,217.92853631,217.92853631,217.91067038,217.91067039,217.92853629,217.94640222,217.9285363,217.9285363,217.92853629,217.92853629,217.94640222,217.94640222,217.94640221,217.94640221,217.94640223,217.96426816,217.96426816,217.94640222,217.94640222,217.94640222,217.96426815,217.96426815,217.96426815,217.96426815,217.96426815,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,171.97738074,171.99524667,171.99524667,171.97738075,171.99524667,171.99524667,171.97738075,171.95951484,171.95951484,171.95951484,171.97738075,171.95951483,171.95951483,171.97738075,171.97738075,171.99524667,171.99524667,171.99524668,171.99524668,171.97738075,171.99524667,171.99524667,171.99524667,171.97738075,171.97738075,171.97738076,171.97738076,171.97738076,171.97738075,171.97738075,171.97738076,171.95951484,171.95951484,171.97738075,171.97738075,171.97738075,171.97738075,159.84641861,159.84641861,155.20127848,149.48418292,149.48418292,149.48418293,149.48418293,131.86838223,99.90624488,71.05277823,65.06769382,65.06769382,55.70594984,46.34420586,46.34420586,46.34420586,0,40.28765776,40.28765776,279.96426815,279.96426815,279.96426815,303.96426816,303.96426816,303.96426815,303.96426815,339.96426815,339.96426814,339.96426815,339.96426815,339.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426816,387.96426815,387.964268129,387.964268129,387.964268132,387.964268134,387.964268133,387.964268134,387.964268135,387.964268135,387.96426813,387.96426815,387.96426813,387.96426813,427.96426815,427.96426815,427.96426815 +361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,171.95951482,171.97738075,171.97738075,171.95951483,171.97738075,171.97738075,171.95951483,171.94164892,171.94164892,171.94164892,171.95951483,171.94164891,171.94164891,171.95951483,171.95951483,171.97738075,171.97738075,171.97738076,171.97738076,171.95951483,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,171.95951484,171.95951484,171.95951484,171.95951483,171.95951483,171.95951484,171.94164892,171.94164892,171.95951483,171.95951483,171.95951483,171.95951483,159.82855269,159.82855269,155.18341256,149.466317,149.466317,149.46631701,149.46631701,131.85051631,99.88837896,71.03491231,65.0498279,65.0498279,55.68808392,46.32633994,46.32633994,46.32633994,40.28765776,0,35.44599246,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 +361.94349028,361.94349028,361.94349028,361.94640223,361.94640223,361.94640224,361.94640225,361.94640224,361.94640223,361.94640223,361.94640221,361.94640222,361.94640221,361.94640222,361.94640222,361.94640222,361.94640222,361.94619623,361.94629922,361.94629923,361.94619625,361.94619625,361.9460932,361.94619621,361.94619623,361.94619625,361.94619624,361.94619624,361.9462992,361.94619624,361.94619624,361.94629923,361.94629923,361.94619624,361.9462992,361.9461962,361.94629923,361.94629924,361.94629929,361.94619623,361.94619623,361.94619627,361.94629924,361.94629929,361.94629923,361.94629926,361.94629925,361.94629925,361.94629925,361.94619624,217.9285363,217.92853632,217.92853631,217.91067038,217.9285363,217.91067037,217.91067038,217.91067038,217.9285363,217.94640222,217.94640222,217.9285363,217.9285363,217.91067038,217.91067037,217.94640221,217.91067039,217.9285363,217.91067039,217.92853631,217.92853631,217.92853631,217.91067038,217.91067038,217.91067037,217.91067037,217.91067038,217.91067038,217.91067039,217.91067039,217.89280446,217.89280447,217.91067037,217.9285363,217.91067038,217.91067038,217.91067037,217.91067037,217.9285363,217.9285363,217.92853629,217.92853629,217.92853631,217.94640224,217.94640224,217.9285363,217.9285363,217.9285363,217.94640223,217.94640223,217.94640223,217.94640223,217.94640223,217.92853631,217.92853631,217.92853631,217.92853631,217.92853631,171.95951482,171.97738075,171.97738075,171.95951483,171.97738075,171.97738075,171.95951483,171.94164892,171.94164892,171.94164892,171.95951483,171.94164891,171.94164891,171.95951483,171.95951483,171.97738075,171.97738075,171.97738076,171.97738076,171.95951483,171.97738075,171.97738075,171.97738075,171.95951483,171.95951483,171.95951484,171.95951484,171.95951484,171.95951483,171.95951483,171.95951484,171.94164892,171.94164892,171.95951483,171.95951483,171.95951483,171.95951483,159.82855269,159.82855269,155.18341256,149.466317,149.466317,149.46631701,149.46631701,131.85051631,99.88837896,71.03491231,65.0498279,65.0498279,55.68808392,46.32633994,46.32633994,46.32633994,40.28765776,35.44599246,0,279.94640223,279.94640223,279.94640223,303.94640224,303.94640224,303.94640223,303.94640223,339.94640223,339.94640222,339.94640223,339.94640223,339.94640222,387.94640223,387.94640223,387.94640223,387.94640222,387.94640224,387.94640223,387.946402209,387.946402209,387.946402212,387.946402214,387.946402213,387.946402214,387.946402215,387.946402215,387.94640221,387.94640223,387.94640221,387.94640221,427.94640223,427.94640223,427.94640223 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,279.98213407,279.98213409,279.98213408,279.96426815,279.98213407,279.96426814,279.96426815,279.96426815,279.98213407,279.99999999,279.99999999,279.98213407,279.98213407,279.96426815,279.96426814,279.99999998,279.96426816,279.98213407,279.96426816,279.98213408,279.98213408,279.98213408,279.96426815,279.96426815,279.96426814,279.96426814,279.96426815,279.96426815,279.96426816,279.96426816,279.94640223,279.94640224,279.96426814,279.98213407,279.96426815,279.96426815,279.96426814,279.96426814,279.98213407,279.98213407,279.98213406,279.98213406,279.98213408,280.00000001,280.00000001,279.98213407,279.98213407,279.98213407,280,280,280,280,280,279.98213408,279.98213408,279.98213408,279.98213408,279.98213408,279.96426813,279.98213406,279.98213406,279.96426814,279.98213406,279.98213406,279.96426814,279.94640223,279.94640223,279.94640223,279.96426814,279.94640222,279.94640222,279.96426814,279.96426814,279.98213406,279.98213406,279.98213407,279.98213407,279.96426814,279.98213406,279.98213406,279.98213406,279.96426814,279.96426814,279.96426815,279.96426815,279.96426815,279.96426814,279.96426814,279.96426815,279.94640223,279.94640223,279.96426814,279.96426814,279.96426814,279.96426814,279.98213406,279.98213406,279.98213407,279.98213407,279.98213407,279.98213408,279.98213408,279.98213406,279.96426815,279.98213408,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.94640223,279.94640223,0,5.48102564,13.36,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,279.98213407,279.98213409,279.98213408,279.96426815,279.98213407,279.96426814,279.96426815,279.96426815,279.98213407,279.99999999,279.99999999,279.98213407,279.98213407,279.96426815,279.96426814,279.99999998,279.96426816,279.98213407,279.96426816,279.98213408,279.98213408,279.98213408,279.96426815,279.96426815,279.96426814,279.96426814,279.96426815,279.96426815,279.96426816,279.96426816,279.94640223,279.94640224,279.96426814,279.98213407,279.96426815,279.96426815,279.96426814,279.96426814,279.98213407,279.98213407,279.98213406,279.98213406,279.98213408,280.00000001,280.00000001,279.98213407,279.98213407,279.98213407,280,280,280,280,280,279.98213408,279.98213408,279.98213408,279.98213408,279.98213408,279.96426813,279.98213406,279.98213406,279.96426814,279.98213406,279.98213406,279.96426814,279.94640223,279.94640223,279.94640223,279.96426814,279.94640222,279.94640222,279.96426814,279.96426814,279.98213406,279.98213406,279.98213407,279.98213407,279.96426814,279.98213406,279.98213406,279.98213406,279.96426814,279.96426814,279.96426815,279.96426815,279.96426815,279.96426814,279.96426814,279.96426815,279.94640223,279.94640223,279.96426814,279.96426814,279.96426814,279.96426814,279.98213406,279.98213406,279.98213407,279.98213407,279.98213407,279.98213408,279.98213408,279.98213406,279.96426815,279.98213408,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.94640223,279.94640223,5.48102564,0,13.36,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,279.98213407,279.98213409,279.98213408,279.96426815,279.98213407,279.96426814,279.96426815,279.96426815,279.98213407,279.99999999,279.99999999,279.98213407,279.98213407,279.96426815,279.96426814,279.99999998,279.96426816,279.98213407,279.96426816,279.98213408,279.98213408,279.98213408,279.96426815,279.96426815,279.96426814,279.96426814,279.96426815,279.96426815,279.96426816,279.96426816,279.94640223,279.94640224,279.96426814,279.98213407,279.96426815,279.96426815,279.96426814,279.96426814,279.98213407,279.98213407,279.98213406,279.98213406,279.98213408,280.00000001,280.00000001,279.98213407,279.98213407,279.98213407,280,280,280,280,280,279.98213408,279.98213408,279.98213408,279.98213408,279.98213408,279.96426813,279.98213406,279.98213406,279.96426814,279.98213406,279.98213406,279.96426814,279.94640223,279.94640223,279.94640223,279.96426814,279.94640222,279.94640222,279.96426814,279.96426814,279.98213406,279.98213406,279.98213407,279.98213407,279.96426814,279.98213406,279.98213406,279.98213406,279.96426814,279.96426814,279.96426815,279.96426815,279.96426815,279.96426814,279.96426814,279.96426815,279.94640223,279.94640223,279.96426814,279.96426814,279.96426814,279.96426814,279.98213406,279.98213406,279.98213407,279.98213407,279.98213407,279.98213408,279.98213408,279.98213406,279.96426815,279.98213408,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.96426815,279.94640223,279.94640223,13.36,13.36,0,304.00000001,304.00000001,304,304,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.99708806,361.99708806,361.99708806,362.00000001,362.00000001,362.00000002,362.00000003,362.00000002,362.00000001,362.00000001,361.99999999,362,361.99999999,362,362,362,362,361.99979401,361.999897,361.99989701,361.99979403,361.99979403,361.99969098,361.99979399,361.99979401,361.99979403,361.99979402,361.99979402,361.99989698,361.99979402,361.99979402,361.99989701,361.99989701,361.99979402,361.99989698,361.99979398,361.99989701,361.99989702,361.99989707,361.99979401,361.99979401,361.99979405,361.99989702,361.99989707,361.99989701,361.99989704,361.99989703,361.99989703,361.99989703,361.99979402,303.98213408,303.9821341,303.98213409,303.96426816,303.98213408,303.96426815,303.96426816,303.96426816,303.98213408,304,304,303.98213408,303.98213408,303.96426816,303.96426815,303.99999999,303.96426817,303.98213408,303.96426817,303.98213409,303.98213409,303.98213409,303.96426816,303.96426816,303.96426815,303.96426815,303.96426816,303.96426816,303.96426817,303.96426817,303.94640224,303.94640225,303.96426815,303.98213408,303.96426816,303.96426816,303.96426815,303.96426815,303.98213408,303.98213408,303.98213407,303.98213407,303.98213409,304.00000002,304.00000002,303.98213408,303.98213408,303.98213408,304.00000001,304.00000001,304.00000001,304.00000001,304.00000001,303.98213409,303.98213409,303.98213409,303.98213409,303.98213409,303.96426814,303.98213407,303.98213407,303.96426815,303.98213407,303.98213407,303.96426815,303.94640224,303.94640224,303.94640224,303.96426815,303.94640223,303.94640223,303.96426815,303.96426815,303.98213407,303.98213407,303.98213408,303.98213408,303.96426815,303.98213407,303.98213407,303.98213407,303.96426815,303.96426815,303.96426816,303.96426816,303.96426816,303.96426815,303.96426815,303.96426816,303.94640224,303.94640224,303.96426815,303.96426815,303.96426815,303.96426815,303.98213407,303.98213407,303.98213408,303.98213408,303.98213408,303.98213409,303.98213409,303.98213407,303.96426816,303.98213409,303.96426816,303.96426816,303.96426816,303.96426816,303.96426816,303.96426816,303.96426816,303.94640224,303.94640224,304.00000001,304.00000001,304.00000001,0,3.52412122,15.03807123,17.32000001,340.00000001,340,340.00000001,340.00000001,340,388.00000001,388.00000001,388.00000001,388,388.00000002,388.00000001,387.999999989,387.999999989,387.999999992,387.999999994,387.999999993,387.999999994,387.999999995,387.999999995,387.99999999,388.00000001,387.99999999,387.99999999,428.00000001,428.00000001,428.00000001 +361.99708806,361.99708806,361.99708806,362.00000001,362.00000001,362.00000002,362.00000003,362.00000002,362.00000001,362.00000001,361.99999999,362,361.99999999,362,362,362,362,361.99979401,361.999897,361.99989701,361.99979403,361.99979403,361.99969098,361.99979399,361.99979401,361.99979403,361.99979402,361.99979402,361.99989698,361.99979402,361.99979402,361.99989701,361.99989701,361.99979402,361.99989698,361.99979398,361.99989701,361.99989702,361.99989707,361.99979401,361.99979401,361.99979405,361.99989702,361.99989707,361.99989701,361.99989704,361.99989703,361.99989703,361.99989703,361.99979402,303.98213408,303.9821341,303.98213409,303.96426816,303.98213408,303.96426815,303.96426816,303.96426816,303.98213408,304,304,303.98213408,303.98213408,303.96426816,303.96426815,303.99999999,303.96426817,303.98213408,303.96426817,303.98213409,303.98213409,303.98213409,303.96426816,303.96426816,303.96426815,303.96426815,303.96426816,303.96426816,303.96426817,303.96426817,303.94640224,303.94640225,303.96426815,303.98213408,303.96426816,303.96426816,303.96426815,303.96426815,303.98213408,303.98213408,303.98213407,303.98213407,303.98213409,304.00000002,304.00000002,303.98213408,303.98213408,303.98213408,304.00000001,304.00000001,304.00000001,304.00000001,304.00000001,303.98213409,303.98213409,303.98213409,303.98213409,303.98213409,303.96426814,303.98213407,303.98213407,303.96426815,303.98213407,303.98213407,303.96426815,303.94640224,303.94640224,303.94640224,303.96426815,303.94640223,303.94640223,303.96426815,303.96426815,303.98213407,303.98213407,303.98213408,303.98213408,303.96426815,303.98213407,303.98213407,303.98213407,303.96426815,303.96426815,303.96426816,303.96426816,303.96426816,303.96426815,303.96426815,303.96426816,303.94640224,303.94640224,303.96426815,303.96426815,303.96426815,303.96426815,303.98213407,303.98213407,303.98213408,303.98213408,303.98213408,303.98213409,303.98213409,303.98213407,303.96426816,303.98213409,303.96426816,303.96426816,303.96426816,303.96426816,303.96426816,303.96426816,303.96426816,303.94640224,303.94640224,304.00000001,304.00000001,304.00000001,3.52412122,0,15.03807123,17.32000001,340.00000001,340,340.00000001,340.00000001,340,388.00000001,388.00000001,388.00000001,388,388.00000002,388.00000001,387.999999989,387.999999989,387.999999992,387.999999994,387.999999993,387.999999994,387.999999995,387.999999995,387.99999999,388.00000001,387.99999999,387.99999999,428.00000001,428.00000001,428.00000001 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,303.98213407,303.98213409,303.98213408,303.96426815,303.98213407,303.96426814,303.96426815,303.96426815,303.98213407,303.99999999,303.99999999,303.98213407,303.98213407,303.96426815,303.96426814,303.99999998,303.96426816,303.98213407,303.96426816,303.98213408,303.98213408,303.98213408,303.96426815,303.96426815,303.96426814,303.96426814,303.96426815,303.96426815,303.96426816,303.96426816,303.94640223,303.94640224,303.96426814,303.98213407,303.96426815,303.96426815,303.96426814,303.96426814,303.98213407,303.98213407,303.98213406,303.98213406,303.98213408,304.00000001,304.00000001,303.98213407,303.98213407,303.98213407,304,304,304,304,304,303.98213408,303.98213408,303.98213408,303.98213408,303.98213408,303.96426813,303.98213406,303.98213406,303.96426814,303.98213406,303.98213406,303.96426814,303.94640223,303.94640223,303.94640223,303.96426814,303.94640222,303.94640222,303.96426814,303.96426814,303.98213406,303.98213406,303.98213407,303.98213407,303.96426814,303.98213406,303.98213406,303.98213406,303.96426814,303.96426814,303.96426815,303.96426815,303.96426815,303.96426814,303.96426814,303.96426815,303.94640223,303.94640223,303.96426814,303.96426814,303.96426814,303.96426814,303.98213406,303.98213406,303.98213407,303.98213407,303.98213407,303.98213408,303.98213408,303.98213406,303.96426815,303.98213408,303.96426815,303.96426815,303.96426815,303.96426815,303.96426815,303.96426815,303.96426815,303.94640223,303.94640223,304,304,304,15.03807123,15.03807123,0,17.32,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,303.98213407,303.98213409,303.98213408,303.96426815,303.98213407,303.96426814,303.96426815,303.96426815,303.98213407,303.99999999,303.99999999,303.98213407,303.98213407,303.96426815,303.96426814,303.99999998,303.96426816,303.98213407,303.96426816,303.98213408,303.98213408,303.98213408,303.96426815,303.96426815,303.96426814,303.96426814,303.96426815,303.96426815,303.96426816,303.96426816,303.94640223,303.94640224,303.96426814,303.98213407,303.96426815,303.96426815,303.96426814,303.96426814,303.98213407,303.98213407,303.98213406,303.98213406,303.98213408,304.00000001,304.00000001,303.98213407,303.98213407,303.98213407,304,304,304,304,304,303.98213408,303.98213408,303.98213408,303.98213408,303.98213408,303.96426813,303.98213406,303.98213406,303.96426814,303.98213406,303.98213406,303.96426814,303.94640223,303.94640223,303.94640223,303.96426814,303.94640222,303.94640222,303.96426814,303.96426814,303.98213406,303.98213406,303.98213407,303.98213407,303.96426814,303.98213406,303.98213406,303.98213406,303.96426814,303.96426814,303.96426815,303.96426815,303.96426815,303.96426814,303.96426814,303.96426815,303.94640223,303.94640223,303.96426814,303.96426814,303.96426814,303.96426814,303.98213406,303.98213406,303.98213407,303.98213407,303.98213407,303.98213408,303.98213408,303.98213406,303.96426815,303.98213408,303.96426815,303.96426815,303.96426815,303.96426815,303.96426815,303.96426815,303.96426815,303.94640223,303.94640223,304,304,304,17.32000001,17.32000001,17.32,0,340,339.99999999,340,340,339.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,339.98213407,339.98213409,339.98213408,339.96426815,339.98213407,339.96426814,339.96426815,339.96426815,339.98213407,339.99999999,339.99999999,339.98213407,339.98213407,339.96426815,339.96426814,339.99999998,339.96426816,339.98213407,339.96426816,339.98213408,339.98213408,339.98213408,339.96426815,339.96426815,339.96426814,339.96426814,339.96426815,339.96426815,339.96426816,339.96426816,339.94640223,339.94640224,339.96426814,339.98213407,339.96426815,339.96426815,339.96426814,339.96426814,339.98213407,339.98213407,339.98213406,339.98213406,339.98213408,340.00000001,340.00000001,339.98213407,339.98213407,339.98213407,340,340,340,340,340,339.98213408,339.98213408,339.98213408,339.98213408,339.98213408,339.96426813,339.98213406,339.98213406,339.96426814,339.98213406,339.98213406,339.96426814,339.94640223,339.94640223,339.94640223,339.96426814,339.94640222,339.94640222,339.96426814,339.96426814,339.98213406,339.98213406,339.98213407,339.98213407,339.96426814,339.98213406,339.98213406,339.98213406,339.96426814,339.96426814,339.96426815,339.96426815,339.96426815,339.96426814,339.96426814,339.96426815,339.94640223,339.94640223,339.96426814,339.96426814,339.96426814,339.96426814,339.98213406,339.98213406,339.98213407,339.98213407,339.98213407,339.98213408,339.98213408,339.98213406,339.96426815,339.98213408,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.94640223,339.94640223,340,340,340,340.00000001,340.00000001,340,340,0,291.99999999,292,292,291.99999999,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.99708804,361.99708804,361.99708804,361.99999999,361.99999999,362,362.00000001,362,361.99999999,361.99999999,361.99999997,361.99999998,361.99999997,361.99999998,361.99999998,361.99999998,361.99999998,361.99979399,361.99989698,361.99989699,361.99979401,361.99979401,361.99969096,361.99979397,361.99979399,361.99979401,361.999794,361.999794,361.99989696,361.999794,361.999794,361.99989699,361.99989699,361.999794,361.99989696,361.99979396,361.99989699,361.999897,361.99989705,361.99979399,361.99979399,361.99979403,361.999897,361.99989705,361.99989699,361.99989702,361.99989701,361.99989701,361.99989701,361.999794,339.98213406,339.98213408,339.98213407,339.96426814,339.98213406,339.96426813,339.96426814,339.96426814,339.98213406,339.99999998,339.99999998,339.98213406,339.98213406,339.96426814,339.96426813,339.99999997,339.96426815,339.98213406,339.96426815,339.98213407,339.98213407,339.98213407,339.96426814,339.96426814,339.96426813,339.96426813,339.96426814,339.96426814,339.96426815,339.96426815,339.94640222,339.94640223,339.96426813,339.98213406,339.96426814,339.96426814,339.96426813,339.96426813,339.98213406,339.98213406,339.98213405,339.98213405,339.98213407,340,340,339.98213406,339.98213406,339.98213406,339.99999999,339.99999999,339.99999999,339.99999999,339.99999999,339.98213407,339.98213407,339.98213407,339.98213407,339.98213407,339.96426812,339.98213405,339.98213405,339.96426813,339.98213405,339.98213405,339.96426813,339.94640222,339.94640222,339.94640222,339.96426813,339.94640221,339.94640221,339.96426813,339.96426813,339.98213405,339.98213405,339.98213406,339.98213406,339.96426813,339.98213405,339.98213405,339.98213405,339.96426813,339.96426813,339.96426814,339.96426814,339.96426814,339.96426813,339.96426813,339.96426814,339.94640222,339.94640222,339.96426813,339.96426813,339.96426813,339.96426813,339.98213405,339.98213405,339.98213406,339.98213406,339.98213406,339.98213407,339.98213407,339.98213405,339.96426814,339.98213407,339.96426814,339.96426814,339.96426814,339.96426814,339.96426814,339.96426814,339.96426814,339.94640222,339.94640222,339.99999999,339.99999999,339.99999999,340,340,339.99999999,339.99999999,291.99999999,0,141.98414961,150.30016873,169.00799226,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,339.98213407,339.98213409,339.98213408,339.96426815,339.98213407,339.96426814,339.96426815,339.96426815,339.98213407,339.99999999,339.99999999,339.98213407,339.98213407,339.96426815,339.96426814,339.99999998,339.96426816,339.98213407,339.96426816,339.98213408,339.98213408,339.98213408,339.96426815,339.96426815,339.96426814,339.96426814,339.96426815,339.96426815,339.96426816,339.96426816,339.94640223,339.94640224,339.96426814,339.98213407,339.96426815,339.96426815,339.96426814,339.96426814,339.98213407,339.98213407,339.98213406,339.98213406,339.98213408,340.00000001,340.00000001,339.98213407,339.98213407,339.98213407,340,340,340,340,340,339.98213408,339.98213408,339.98213408,339.98213408,339.98213408,339.96426813,339.98213406,339.98213406,339.96426814,339.98213406,339.98213406,339.96426814,339.94640223,339.94640223,339.94640223,339.96426814,339.94640222,339.94640222,339.96426814,339.96426814,339.98213406,339.98213406,339.98213407,339.98213407,339.96426814,339.98213406,339.98213406,339.98213406,339.96426814,339.96426814,339.96426815,339.96426815,339.96426815,339.96426814,339.96426814,339.96426815,339.94640223,339.94640223,339.96426814,339.96426814,339.96426814,339.96426814,339.98213406,339.98213406,339.98213407,339.98213407,339.98213407,339.98213408,339.98213408,339.98213406,339.96426815,339.98213408,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.94640223,339.94640223,340,340,340,340.00000001,340.00000001,340,340,292,141.98414961,0,150.30016874,169.00799227,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.99708805,361.99708805,361.99708805,362,362,362.00000001,362.00000002,362.00000001,362,362,361.99999998,361.99999999,361.99999998,361.99999999,361.99999999,361.99999999,361.99999999,361.999794,361.99989699,361.999897,361.99979402,361.99979402,361.99969097,361.99979398,361.999794,361.99979402,361.99979401,361.99979401,361.99989697,361.99979401,361.99979401,361.999897,361.999897,361.99979401,361.99989697,361.99979397,361.999897,361.99989701,361.99989706,361.999794,361.999794,361.99979404,361.99989701,361.99989706,361.999897,361.99989703,361.99989702,361.99989702,361.99989702,361.99979401,339.98213407,339.98213409,339.98213408,339.96426815,339.98213407,339.96426814,339.96426815,339.96426815,339.98213407,339.99999999,339.99999999,339.98213407,339.98213407,339.96426815,339.96426814,339.99999998,339.96426816,339.98213407,339.96426816,339.98213408,339.98213408,339.98213408,339.96426815,339.96426815,339.96426814,339.96426814,339.96426815,339.96426815,339.96426816,339.96426816,339.94640223,339.94640224,339.96426814,339.98213407,339.96426815,339.96426815,339.96426814,339.96426814,339.98213407,339.98213407,339.98213406,339.98213406,339.98213408,340.00000001,340.00000001,339.98213407,339.98213407,339.98213407,340,340,340,340,340,339.98213408,339.98213408,339.98213408,339.98213408,339.98213408,339.96426813,339.98213406,339.98213406,339.96426814,339.98213406,339.98213406,339.96426814,339.94640223,339.94640223,339.94640223,339.96426814,339.94640222,339.94640222,339.96426814,339.96426814,339.98213406,339.98213406,339.98213407,339.98213407,339.96426814,339.98213406,339.98213406,339.98213406,339.96426814,339.96426814,339.96426815,339.96426815,339.96426815,339.96426814,339.96426814,339.96426815,339.94640223,339.94640223,339.96426814,339.96426814,339.96426814,339.96426814,339.98213406,339.98213406,339.98213407,339.98213407,339.98213407,339.98213408,339.98213408,339.98213406,339.96426815,339.98213408,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.96426815,339.94640223,339.94640223,340,340,340,340.00000001,340.00000001,340,340,292,150.30016873,150.30016874,0,169.00799227,388,388,388,387.99999999,388.00000001,388,387.999999979,387.999999979,387.999999982,387.999999984,387.999999983,387.999999984,387.999999985,387.999999985,387.99999998,388,387.99999998,387.99999998,428,428,428 +361.99708804,361.99708804,361.99708804,361.99999999,361.99999999,362,362.00000001,362,361.99999999,361.99999999,361.99999997,361.99999998,361.99999997,361.99999998,361.99999998,361.99999998,361.99999998,361.99979399,361.99989698,361.99989699,361.99979401,361.99979401,361.99969096,361.99979397,361.99979399,361.99979401,361.999794,361.999794,361.99989696,361.999794,361.999794,361.99989699,361.99989699,361.999794,361.99989696,361.99979396,361.99989699,361.999897,361.99989705,361.99979399,361.99979399,361.99979403,361.999897,361.99989705,361.99989699,361.99989702,361.99989701,361.99989701,361.99989701,361.999794,339.98213406,339.98213408,339.98213407,339.96426814,339.98213406,339.96426813,339.96426814,339.96426814,339.98213406,339.99999998,339.99999998,339.98213406,339.98213406,339.96426814,339.96426813,339.99999997,339.96426815,339.98213406,339.96426815,339.98213407,339.98213407,339.98213407,339.96426814,339.96426814,339.96426813,339.96426813,339.96426814,339.96426814,339.96426815,339.96426815,339.94640222,339.94640223,339.96426813,339.98213406,339.96426814,339.96426814,339.96426813,339.96426813,339.98213406,339.98213406,339.98213405,339.98213405,339.98213407,340,340,339.98213406,339.98213406,339.98213406,339.99999999,339.99999999,339.99999999,339.99999999,339.99999999,339.98213407,339.98213407,339.98213407,339.98213407,339.98213407,339.96426812,339.98213405,339.98213405,339.96426813,339.98213405,339.98213405,339.96426813,339.94640222,339.94640222,339.94640222,339.96426813,339.94640221,339.94640221,339.96426813,339.96426813,339.98213405,339.98213405,339.98213406,339.98213406,339.96426813,339.98213405,339.98213405,339.98213405,339.96426813,339.96426813,339.96426814,339.96426814,339.96426814,339.96426813,339.96426813,339.96426814,339.94640222,339.94640222,339.96426813,339.96426813,339.96426813,339.96426813,339.98213405,339.98213405,339.98213406,339.98213406,339.98213406,339.98213407,339.98213407,339.98213405,339.96426814,339.98213407,339.96426814,339.96426814,339.96426814,339.96426814,339.96426814,339.96426814,339.96426814,339.94640222,339.94640222,339.99999999,339.99999999,339.99999999,340,340,339.99999999,339.99999999,291.99999999,169.00799226,169.00799227,169.00799227,0,387.99999999,387.99999999,387.99999999,387.99999998,388,387.99999999,387.999999969,387.999999969,387.999999972,387.999999974,387.999999973,387.999999974,387.999999975,387.999999975,387.99999997,387.99999999,387.99999997,387.99999997,427.99999999,427.99999999,427.99999999 +387.99708805,387.99708805,387.99708805,388,388,388.00000001,388.00000002,388.00000001,388,388,387.99999998,387.99999999,387.99999998,387.99999999,387.99999999,387.99999999,387.99999999,387.999794,387.99989699,387.999897,387.99979402,387.99979402,387.99969097,387.99979398,387.999794,387.99979402,387.99979401,387.99979401,387.99989697,387.99979401,387.99979401,387.999897,387.999897,387.99979401,387.99989697,387.99979397,387.999897,387.99989701,387.99989706,387.999794,387.999794,387.99979404,387.99989701,387.99989706,387.999897,387.99989703,387.99989702,387.99989702,387.99989702,387.99979401,387.98213407,387.98213409,387.98213408,387.96426815,387.98213407,387.96426814,387.96426815,387.96426815,387.98213407,387.99999999,387.99999999,387.98213407,387.98213407,387.96426815,387.96426814,387.99999998,387.96426816,387.98213407,387.96426816,387.98213408,387.98213408,387.98213408,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.96426815,387.96426816,387.96426816,387.94640223,387.94640224,387.96426814,387.98213407,387.96426815,387.96426815,387.96426814,387.96426814,387.98213407,387.98213407,387.98213406,387.98213406,387.98213408,388.00000001,388.00000001,387.98213407,387.98213407,387.98213407,388,388,388,388,388,387.98213408,387.98213408,387.98213408,387.98213408,387.98213408,387.96426813,387.98213406,387.98213406,387.96426814,387.98213406,387.98213406,387.96426814,387.94640223,387.94640223,387.94640223,387.96426814,387.94640222,387.94640222,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.96426814,387.98213406,387.98213406,387.98213406,387.96426814,387.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.94640223,387.94640223,387.96426814,387.96426814,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.98213407,387.98213408,387.98213408,387.98213406,387.96426815,387.98213408,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.94640223,387.94640223,388,388,388,388.00000001,388.00000001,388,388,388,387.99999999,388,388,387.99999999,0,132,322,321.99999999,322.00000001,322,321.999999979,321.999999979,321.999999982,321.999999984,321.999999983,321.999999984,321.999999985,321.999999985,321.99999998,322,321.99999998,321.99999998,428,428,428 +387.99708805,387.99708805,387.99708805,388,388,388.00000001,388.00000002,388.00000001,388,388,387.99999998,387.99999999,387.99999998,387.99999999,387.99999999,387.99999999,387.99999999,387.999794,387.99989699,387.999897,387.99979402,387.99979402,387.99969097,387.99979398,387.999794,387.99979402,387.99979401,387.99979401,387.99989697,387.99979401,387.99979401,387.999897,387.999897,387.99979401,387.99989697,387.99979397,387.999897,387.99989701,387.99989706,387.999794,387.999794,387.99979404,387.99989701,387.99989706,387.999897,387.99989703,387.99989702,387.99989702,387.99989702,387.99979401,387.98213407,387.98213409,387.98213408,387.96426815,387.98213407,387.96426814,387.96426815,387.96426815,387.98213407,387.99999999,387.99999999,387.98213407,387.98213407,387.96426815,387.96426814,387.99999998,387.96426816,387.98213407,387.96426816,387.98213408,387.98213408,387.98213408,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.96426815,387.96426816,387.96426816,387.94640223,387.94640224,387.96426814,387.98213407,387.96426815,387.96426815,387.96426814,387.96426814,387.98213407,387.98213407,387.98213406,387.98213406,387.98213408,388.00000001,388.00000001,387.98213407,387.98213407,387.98213407,388,388,388,388,388,387.98213408,387.98213408,387.98213408,387.98213408,387.98213408,387.96426813,387.98213406,387.98213406,387.96426814,387.98213406,387.98213406,387.96426814,387.94640223,387.94640223,387.94640223,387.96426814,387.94640222,387.94640222,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.96426814,387.98213406,387.98213406,387.98213406,387.96426814,387.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.94640223,387.94640223,387.96426814,387.96426814,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.98213407,387.98213408,387.98213408,387.98213406,387.96426815,387.98213408,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.94640223,387.94640223,388,388,388,388.00000001,388.00000001,388,388,388,387.99999999,388,388,387.99999999,132,0,322,321.99999999,322.00000001,322,321.999999979,321.999999979,321.999999982,321.999999984,321.999999983,321.999999984,321.999999985,321.999999985,321.99999998,322,321.99999998,321.99999998,428,428,428 +387.99708805,387.99708805,387.99708805,388,388,388.00000001,388.00000002,388.00000001,388,388,387.99999998,387.99999999,387.99999998,387.99999999,387.99999999,387.99999999,387.99999999,387.999794,387.99989699,387.999897,387.99979402,387.99979402,387.99969097,387.99979398,387.999794,387.99979402,387.99979401,387.99979401,387.99989697,387.99979401,387.99979401,387.999897,387.999897,387.99979401,387.99989697,387.99979397,387.999897,387.99989701,387.99989706,387.999794,387.999794,387.99979404,387.99989701,387.99989706,387.999897,387.99989703,387.99989702,387.99989702,387.99989702,387.99979401,387.98213407,387.98213409,387.98213408,387.96426815,387.98213407,387.96426814,387.96426815,387.96426815,387.98213407,387.99999999,387.99999999,387.98213407,387.98213407,387.96426815,387.96426814,387.99999998,387.96426816,387.98213407,387.96426816,387.98213408,387.98213408,387.98213408,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.96426815,387.96426816,387.96426816,387.94640223,387.94640224,387.96426814,387.98213407,387.96426815,387.96426815,387.96426814,387.96426814,387.98213407,387.98213407,387.98213406,387.98213406,387.98213408,388.00000001,388.00000001,387.98213407,387.98213407,387.98213407,388,388,388,388,388,387.98213408,387.98213408,387.98213408,387.98213408,387.98213408,387.96426813,387.98213406,387.98213406,387.96426814,387.98213406,387.98213406,387.96426814,387.94640223,387.94640223,387.94640223,387.96426814,387.94640222,387.94640222,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.96426814,387.98213406,387.98213406,387.98213406,387.96426814,387.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.94640223,387.94640223,387.96426814,387.96426814,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.98213407,387.98213408,387.98213408,387.98213406,387.96426815,387.98213408,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.94640223,387.94640223,388,388,388,388.00000001,388.00000001,388,388,388,387.99999999,388,388,387.99999999,322,322,0,47.85365853,84.48238483,95.51038844,103.387533859,103.387533859,103.387533862,103.387533864,103.387533863,103.387533864,103.387533865,103.387533865,103.38753386,113.82475158,123.08039746,123.08039746,428,428,428 +387.99708804,387.99708804,387.99708804,387.99999999,387.99999999,388,388.00000001,388,387.99999999,387.99999999,387.99999997,387.99999998,387.99999997,387.99999998,387.99999998,387.99999998,387.99999998,387.99979399,387.99989698,387.99989699,387.99979401,387.99979401,387.99969096,387.99979397,387.99979399,387.99979401,387.999794,387.999794,387.99989696,387.999794,387.999794,387.99989699,387.99989699,387.999794,387.99989696,387.99979396,387.99989699,387.999897,387.99989705,387.99979399,387.99979399,387.99979403,387.999897,387.99989705,387.99989699,387.99989702,387.99989701,387.99989701,387.99989701,387.999794,387.98213406,387.98213408,387.98213407,387.96426814,387.98213406,387.96426813,387.96426814,387.96426814,387.98213406,387.99999998,387.99999998,387.98213406,387.98213406,387.96426814,387.96426813,387.99999997,387.96426815,387.98213406,387.96426815,387.98213407,387.98213407,387.98213407,387.96426814,387.96426814,387.96426813,387.96426813,387.96426814,387.96426814,387.96426815,387.96426815,387.94640222,387.94640223,387.96426813,387.98213406,387.96426814,387.96426814,387.96426813,387.96426813,387.98213406,387.98213406,387.98213405,387.98213405,387.98213407,388,388,387.98213406,387.98213406,387.98213406,387.99999999,387.99999999,387.99999999,387.99999999,387.99999999,387.98213407,387.98213407,387.98213407,387.98213407,387.98213407,387.96426812,387.98213405,387.98213405,387.96426813,387.98213405,387.98213405,387.96426813,387.94640222,387.94640222,387.94640222,387.96426813,387.94640221,387.94640221,387.96426813,387.96426813,387.98213405,387.98213405,387.98213406,387.98213406,387.96426813,387.98213405,387.98213405,387.98213405,387.96426813,387.96426813,387.96426814,387.96426814,387.96426814,387.96426813,387.96426813,387.96426814,387.94640222,387.94640222,387.96426813,387.96426813,387.96426813,387.96426813,387.98213405,387.98213405,387.98213406,387.98213406,387.98213406,387.98213407,387.98213407,387.98213405,387.96426814,387.98213407,387.96426814,387.96426814,387.96426814,387.96426814,387.96426814,387.96426814,387.96426814,387.94640222,387.94640222,387.99999999,387.99999999,387.99999999,388,388,387.99999999,387.99999999,387.99999999,387.99999998,387.99999999,387.99999999,387.99999998,321.99999999,321.99999999,47.85365853,0,84.48238482,95.51038843,103.387533849,103.387533849,103.387533852,103.387533854,103.387533853,103.387533854,103.387533855,103.387533855,103.38753385,113.82475157,123.08039745,123.08039745,427.99999999,427.99999999,427.99999999 +387.99708806,387.99708806,387.99708806,388.00000001,388.00000001,388.00000002,388.00000003,388.00000002,388.00000001,388.00000001,387.99999999,388,387.99999999,388,388,388,388,387.99979401,387.999897,387.99989701,387.99979403,387.99979403,387.99969098,387.99979399,387.99979401,387.99979403,387.99979402,387.99979402,387.99989698,387.99979402,387.99979402,387.99989701,387.99989701,387.99979402,387.99989698,387.99979398,387.99989701,387.99989702,387.99989707,387.99979401,387.99979401,387.99979405,387.99989702,387.99989707,387.99989701,387.99989704,387.99989703,387.99989703,387.99989703,387.99979402,387.98213408,387.9821341,387.98213409,387.96426816,387.98213408,387.96426815,387.96426816,387.96426816,387.98213408,388,388,387.98213408,387.98213408,387.96426816,387.96426815,387.99999999,387.96426817,387.98213408,387.96426817,387.98213409,387.98213409,387.98213409,387.96426816,387.96426816,387.96426815,387.96426815,387.96426816,387.96426816,387.96426817,387.96426817,387.94640224,387.94640225,387.96426815,387.98213408,387.96426816,387.96426816,387.96426815,387.96426815,387.98213408,387.98213408,387.98213407,387.98213407,387.98213409,388.00000002,388.00000002,387.98213408,387.98213408,387.98213408,388.00000001,388.00000001,388.00000001,388.00000001,388.00000001,387.98213409,387.98213409,387.98213409,387.98213409,387.98213409,387.96426814,387.98213407,387.98213407,387.96426815,387.98213407,387.98213407,387.96426815,387.94640224,387.94640224,387.94640224,387.96426815,387.94640223,387.94640223,387.96426815,387.96426815,387.98213407,387.98213407,387.98213408,387.98213408,387.96426815,387.98213407,387.98213407,387.98213407,387.96426815,387.96426815,387.96426816,387.96426816,387.96426816,387.96426815,387.96426815,387.96426816,387.94640224,387.94640224,387.96426815,387.96426815,387.96426815,387.96426815,387.98213407,387.98213407,387.98213408,387.98213408,387.98213408,387.98213409,387.98213409,387.98213407,387.96426816,387.98213409,387.96426816,387.96426816,387.96426816,387.96426816,387.96426816,387.96426816,387.96426816,387.94640224,387.94640224,388.00000001,388.00000001,388.00000001,388.00000002,388.00000002,388.00000001,388.00000001,388.00000001,388,388.00000001,388.00000001,388,322.00000001,322.00000001,84.48238483,84.48238482,0,95.51038845,103.387533869,103.387533869,103.387533872,103.387533874,103.387533873,103.387533874,103.387533875,103.387533875,103.38753387,113.82475159,123.08039747,123.08039747,428.00000001,428.00000001,428.00000001 +387.99708805,387.99708805,387.99708805,388,388,388.00000001,388.00000002,388.00000001,388,388,387.99999998,387.99999999,387.99999998,387.99999999,387.99999999,387.99999999,387.99999999,387.999794,387.99989699,387.999897,387.99979402,387.99979402,387.99969097,387.99979398,387.999794,387.99979402,387.99979401,387.99979401,387.99989697,387.99979401,387.99979401,387.999897,387.999897,387.99979401,387.99989697,387.99979397,387.999897,387.99989701,387.99989706,387.999794,387.999794,387.99979404,387.99989701,387.99989706,387.999897,387.99989703,387.99989702,387.99989702,387.99989702,387.99979401,387.98213407,387.98213409,387.98213408,387.96426815,387.98213407,387.96426814,387.96426815,387.96426815,387.98213407,387.99999999,387.99999999,387.98213407,387.98213407,387.96426815,387.96426814,387.99999998,387.96426816,387.98213407,387.96426816,387.98213408,387.98213408,387.98213408,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.96426815,387.96426816,387.96426816,387.94640223,387.94640224,387.96426814,387.98213407,387.96426815,387.96426815,387.96426814,387.96426814,387.98213407,387.98213407,387.98213406,387.98213406,387.98213408,388.00000001,388.00000001,387.98213407,387.98213407,387.98213407,388,388,388,388,388,387.98213408,387.98213408,387.98213408,387.98213408,387.98213408,387.96426813,387.98213406,387.98213406,387.96426814,387.98213406,387.98213406,387.96426814,387.94640223,387.94640223,387.94640223,387.96426814,387.94640222,387.94640222,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.96426814,387.98213406,387.98213406,387.98213406,387.96426814,387.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.94640223,387.94640223,387.96426814,387.96426814,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.98213407,387.98213408,387.98213408,387.98213406,387.96426815,387.98213408,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.94640223,387.94640223,388,388,388,388.00000001,388.00000001,388,388,388,387.99999999,388,388,387.99999999,322,322,95.51038844,95.51038843,95.51038845,0,103.387533859,103.387533859,103.387533862,103.387533864,103.387533863,103.387533864,103.387533865,103.387533865,103.38753386,113.82475158,123.08039746,123.08039746,428,428,428 +387.997088029,387.997088029,387.997088029,387.999999979,387.999999979,387.999999989,387.999999999,387.999999989,387.999999979,387.999999979,387.999999959,387.999999969,387.999999959,387.999999969,387.999999969,387.999999969,387.999999969,387.999793979,387.999896969,387.999896979,387.999793999,387.999793999,387.999690949,387.999793959,387.999793979,387.999793999,387.999793989,387.999793989,387.999896949,387.999793989,387.999793989,387.999896979,387.999896979,387.999793989,387.999896949,387.999793949,387.999896979,387.999896989,387.999897039,387.999793979,387.999793979,387.999794019,387.999896989,387.999897039,387.999896979,387.999897009,387.999896999,387.999896999,387.999896999,387.999793989,387.982134049,387.982134069,387.982134059,387.964268129,387.982134049,387.964268119,387.964268129,387.964268129,387.982134049,387.999999969,387.999999969,387.982134049,387.982134049,387.964268129,387.964268119,387.999999959,387.964268139,387.982134049,387.964268139,387.982134059,387.982134059,387.982134059,387.964268129,387.964268129,387.964268119,387.964268119,387.964268129,387.964268129,387.964268139,387.964268139,387.946402209,387.946402219,387.964268119,387.982134049,387.964268129,387.964268129,387.964268119,387.964268119,387.982134049,387.982134049,387.982134039,387.982134039,387.982134059,387.999999989,387.999999989,387.982134049,387.982134049,387.982134049,387.999999979,387.999999979,387.999999979,387.999999979,387.999999979,387.982134059,387.982134059,387.982134059,387.982134059,387.982134059,387.964268109,387.982134039,387.982134039,387.964268119,387.982134039,387.982134039,387.964268119,387.946402209,387.946402209,387.946402209,387.964268119,387.946402199,387.946402199,387.964268119,387.964268119,387.982134039,387.982134039,387.982134049,387.982134049,387.964268119,387.982134039,387.982134039,387.982134039,387.964268119,387.964268119,387.964268129,387.964268129,387.964268129,387.964268119,387.964268119,387.964268129,387.946402209,387.946402209,387.964268119,387.964268119,387.964268119,387.964268119,387.982134039,387.982134039,387.982134049,387.982134049,387.982134049,387.982134059,387.982134059,387.982134039,387.964268129,387.982134059,387.964268129,387.964268129,387.964268129,387.964268129,387.964268129,387.964268129,387.964268129,387.946402209,387.946402209,387.999999979,387.999999979,387.999999979,387.999999989,387.999999989,387.999999979,387.999999979,387.999999979,387.999999969,387.999999979,387.999999979,387.999999969,321.999999979,321.999999979,103.387533859,103.387533849,103.387533869,103.387533859,0,20.52272038,29.883730637,47.526262375,51.360058256,55.833893535,58.697539084,58.697539084,58.697539079,113.824751559,123.080397439,123.080397439,427.999999979,427.999999979,427.999999979 +387.997088029,387.997088029,387.997088029,387.999999979,387.999999979,387.999999989,387.999999999,387.999999989,387.999999979,387.999999979,387.999999959,387.999999969,387.999999959,387.999999969,387.999999969,387.999999969,387.999999969,387.999793979,387.999896969,387.999896979,387.999793999,387.999793999,387.999690949,387.999793959,387.999793979,387.999793999,387.999793989,387.999793989,387.999896949,387.999793989,387.999793989,387.999896979,387.999896979,387.999793989,387.999896949,387.999793949,387.999896979,387.999896989,387.999897039,387.999793979,387.999793979,387.999794019,387.999896989,387.999897039,387.999896979,387.999897009,387.999896999,387.999896999,387.999896999,387.999793989,387.982134049,387.982134069,387.982134059,387.964268129,387.982134049,387.964268119,387.964268129,387.964268129,387.982134049,387.999999969,387.999999969,387.982134049,387.982134049,387.964268129,387.964268119,387.999999959,387.964268139,387.982134049,387.964268139,387.982134059,387.982134059,387.982134059,387.964268129,387.964268129,387.964268119,387.964268119,387.964268129,387.964268129,387.964268139,387.964268139,387.946402209,387.946402219,387.964268119,387.982134049,387.964268129,387.964268129,387.964268119,387.964268119,387.982134049,387.982134049,387.982134039,387.982134039,387.982134059,387.999999989,387.999999989,387.982134049,387.982134049,387.982134049,387.999999979,387.999999979,387.999999979,387.999999979,387.999999979,387.982134059,387.982134059,387.982134059,387.982134059,387.982134059,387.964268109,387.982134039,387.982134039,387.964268119,387.982134039,387.982134039,387.964268119,387.946402209,387.946402209,387.946402209,387.964268119,387.946402199,387.946402199,387.964268119,387.964268119,387.982134039,387.982134039,387.982134049,387.982134049,387.964268119,387.982134039,387.982134039,387.982134039,387.964268119,387.964268119,387.964268129,387.964268129,387.964268129,387.964268119,387.964268119,387.964268129,387.946402209,387.946402209,387.964268119,387.964268119,387.964268119,387.964268119,387.982134039,387.982134039,387.982134049,387.982134049,387.982134049,387.982134059,387.982134059,387.982134039,387.964268129,387.982134059,387.964268129,387.964268129,387.964268129,387.964268129,387.964268129,387.964268129,387.964268129,387.946402209,387.946402209,387.999999979,387.999999979,387.999999979,387.999999989,387.999999989,387.999999979,387.999999979,387.999999979,387.999999969,387.999999979,387.999999979,387.999999969,321.999999979,321.999999979,103.387533859,103.387533849,103.387533869,103.387533859,20.52272038,0,29.883730637,47.526262375,51.360058256,55.833893535,58.697539084,58.697539084,58.697539079,113.824751559,123.080397439,123.080397439,427.999999979,427.999999979,427.999999979 +387.997088032,387.997088032,387.997088032,387.999999982,387.999999982,387.999999992,388.000000002,387.999999992,387.999999982,387.999999982,387.999999962,387.999999972,387.999999962,387.999999972,387.999999972,387.999999972,387.999999972,387.999793982,387.999896972,387.999896982,387.999794002,387.999794002,387.999690952,387.999793962,387.999793982,387.999794002,387.999793992,387.999793992,387.999896952,387.999793992,387.999793992,387.999896982,387.999896982,387.999793992,387.999896952,387.999793952,387.999896982,387.999896992,387.999897042,387.999793982,387.999793982,387.999794022,387.999896992,387.999897042,387.999896982,387.999897012,387.999897002,387.999897002,387.999897002,387.999793992,387.982134052,387.982134072,387.982134062,387.964268132,387.982134052,387.964268122,387.964268132,387.964268132,387.982134052,387.999999972,387.999999972,387.982134052,387.982134052,387.964268132,387.964268122,387.999999962,387.964268142,387.982134052,387.964268142,387.982134062,387.982134062,387.982134062,387.964268132,387.964268132,387.964268122,387.964268122,387.964268132,387.964268132,387.964268142,387.964268142,387.946402212,387.946402222,387.964268122,387.982134052,387.964268132,387.964268132,387.964268122,387.964268122,387.982134052,387.982134052,387.982134042,387.982134042,387.982134062,387.999999992,387.999999992,387.982134052,387.982134052,387.982134052,387.999999982,387.999999982,387.999999982,387.999999982,387.999999982,387.982134062,387.982134062,387.982134062,387.982134062,387.982134062,387.964268112,387.982134042,387.982134042,387.964268122,387.982134042,387.982134042,387.964268122,387.946402212,387.946402212,387.946402212,387.964268122,387.946402202,387.946402202,387.964268122,387.964268122,387.982134042,387.982134042,387.982134052,387.982134052,387.964268122,387.982134042,387.982134042,387.982134042,387.964268122,387.964268122,387.964268132,387.964268132,387.964268132,387.964268122,387.964268122,387.964268132,387.946402212,387.946402212,387.964268122,387.964268122,387.964268122,387.964268122,387.982134042,387.982134042,387.982134052,387.982134052,387.982134052,387.982134062,387.982134062,387.982134042,387.964268132,387.982134062,387.964268132,387.964268132,387.964268132,387.964268132,387.964268132,387.964268132,387.964268132,387.946402212,387.946402212,387.999999982,387.999999982,387.999999982,387.999999992,387.999999992,387.999999982,387.999999982,387.999999982,387.999999972,387.999999982,387.999999982,387.999999972,321.999999982,321.999999982,103.387533862,103.387533852,103.387533872,103.387533862,29.883730637,29.883730637,0,47.526262378,51.360058259,55.833893538,58.697539087,58.697539087,58.697539082,113.824751562,123.080397442,123.080397442,427.999999982,427.999999982,427.999999982 +387.997088034,387.997088034,387.997088034,387.999999984,387.999999984,387.999999994,388.000000004,387.999999994,387.999999984,387.999999984,387.999999964,387.999999974,387.999999964,387.999999974,387.999999974,387.999999974,387.999999974,387.999793984,387.999896974,387.999896984,387.999794004,387.999794004,387.999690954,387.999793964,387.999793984,387.999794004,387.999793994,387.999793994,387.999896954,387.999793994,387.999793994,387.999896984,387.999896984,387.999793994,387.999896954,387.999793954,387.999896984,387.999896994,387.999897044,387.999793984,387.999793984,387.999794024,387.999896994,387.999897044,387.999896984,387.999897014,387.999897004,387.999897004,387.999897004,387.999793994,387.982134054,387.982134074,387.982134064,387.964268134,387.982134054,387.964268124,387.964268134,387.964268134,387.982134054,387.999999974,387.999999974,387.982134054,387.982134054,387.964268134,387.964268124,387.999999964,387.964268144,387.982134054,387.964268144,387.982134064,387.982134064,387.982134064,387.964268134,387.964268134,387.964268124,387.964268124,387.964268134,387.964268134,387.964268144,387.964268144,387.946402214,387.946402224,387.964268124,387.982134054,387.964268134,387.964268134,387.964268124,387.964268124,387.982134054,387.982134054,387.982134044,387.982134044,387.982134064,387.999999994,387.999999994,387.982134054,387.982134054,387.982134054,387.999999984,387.999999984,387.999999984,387.999999984,387.999999984,387.982134064,387.982134064,387.982134064,387.982134064,387.982134064,387.964268114,387.982134044,387.982134044,387.964268124,387.982134044,387.982134044,387.964268124,387.946402214,387.946402214,387.946402214,387.964268124,387.946402204,387.946402204,387.964268124,387.964268124,387.982134044,387.982134044,387.982134054,387.982134054,387.964268124,387.982134044,387.982134044,387.982134044,387.964268124,387.964268124,387.964268134,387.964268134,387.964268134,387.964268124,387.964268124,387.964268134,387.946402214,387.946402214,387.964268124,387.964268124,387.964268124,387.964268124,387.982134044,387.982134044,387.982134054,387.982134054,387.982134054,387.982134064,387.982134064,387.982134044,387.964268134,387.982134064,387.964268134,387.964268134,387.964268134,387.964268134,387.964268134,387.964268134,387.964268134,387.946402214,387.946402214,387.999999984,387.999999984,387.999999984,387.999999994,387.999999994,387.999999984,387.999999984,387.999999984,387.999999974,387.999999984,387.999999984,387.999999974,321.999999984,321.999999984,103.387533864,103.387533854,103.387533874,103.387533864,47.526262375,47.526262375,47.526262378,0,51.360058261,55.83389354,58.697539089,58.697539089,58.697539084,113.824751564,123.080397444,123.080397444,427.999999984,427.999999984,427.999999984 +387.997088033,387.997088033,387.997088033,387.999999983,387.999999983,387.999999993,388.000000003,387.999999993,387.999999983,387.999999983,387.999999963,387.999999973,387.999999963,387.999999973,387.999999973,387.999999973,387.999999973,387.999793983,387.999896973,387.999896983,387.999794003,387.999794003,387.999690953,387.999793963,387.999793983,387.999794003,387.999793993,387.999793993,387.999896953,387.999793993,387.999793993,387.999896983,387.999896983,387.999793993,387.999896953,387.999793953,387.999896983,387.999896993,387.999897043,387.999793983,387.999793983,387.999794023,387.999896993,387.999897043,387.999896983,387.999897013,387.999897003,387.999897003,387.999897003,387.999793993,387.982134053,387.982134073,387.982134063,387.964268133,387.982134053,387.964268123,387.964268133,387.964268133,387.982134053,387.999999973,387.999999973,387.982134053,387.982134053,387.964268133,387.964268123,387.999999963,387.964268143,387.982134053,387.964268143,387.982134063,387.982134063,387.982134063,387.964268133,387.964268133,387.964268123,387.964268123,387.964268133,387.964268133,387.964268143,387.964268143,387.946402213,387.946402223,387.964268123,387.982134053,387.964268133,387.964268133,387.964268123,387.964268123,387.982134053,387.982134053,387.982134043,387.982134043,387.982134063,387.999999993,387.999999993,387.982134053,387.982134053,387.982134053,387.999999983,387.999999983,387.999999983,387.999999983,387.999999983,387.982134063,387.982134063,387.982134063,387.982134063,387.982134063,387.964268113,387.982134043,387.982134043,387.964268123,387.982134043,387.982134043,387.964268123,387.946402213,387.946402213,387.946402213,387.964268123,387.946402203,387.946402203,387.964268123,387.964268123,387.982134043,387.982134043,387.982134053,387.982134053,387.964268123,387.982134043,387.982134043,387.982134043,387.964268123,387.964268123,387.964268133,387.964268133,387.964268133,387.964268123,387.964268123,387.964268133,387.946402213,387.946402213,387.964268123,387.964268123,387.964268123,387.964268123,387.982134043,387.982134043,387.982134053,387.982134053,387.982134053,387.982134063,387.982134063,387.982134043,387.964268133,387.982134063,387.964268133,387.964268133,387.964268133,387.964268133,387.964268133,387.964268133,387.964268133,387.946402213,387.946402213,387.999999983,387.999999983,387.999999983,387.999999993,387.999999993,387.999999983,387.999999983,387.999999983,387.999999973,387.999999983,387.999999983,387.999999973,321.999999983,321.999999983,103.387533863,103.387533853,103.387533873,103.387533863,51.360058256,51.360058256,51.360058259,51.360058261,0,55.833893539,58.697539088,58.697539088,58.697539083,113.824751563,123.080397443,123.080397443,427.999999983,427.999999983,427.999999983 +387.997088034,387.997088034,387.997088034,387.999999984,387.999999984,387.999999994,388.000000004,387.999999994,387.999999984,387.999999984,387.999999964,387.999999974,387.999999964,387.999999974,387.999999974,387.999999974,387.999999974,387.999793984,387.999896974,387.999896984,387.999794004,387.999794004,387.999690954,387.999793964,387.999793984,387.999794004,387.999793994,387.999793994,387.999896954,387.999793994,387.999793994,387.999896984,387.999896984,387.999793994,387.999896954,387.999793954,387.999896984,387.999896994,387.999897044,387.999793984,387.999793984,387.999794024,387.999896994,387.999897044,387.999896984,387.999897014,387.999897004,387.999897004,387.999897004,387.999793994,387.982134054,387.982134074,387.982134064,387.964268134,387.982134054,387.964268124,387.964268134,387.964268134,387.982134054,387.999999974,387.999999974,387.982134054,387.982134054,387.964268134,387.964268124,387.999999964,387.964268144,387.982134054,387.964268144,387.982134064,387.982134064,387.982134064,387.964268134,387.964268134,387.964268124,387.964268124,387.964268134,387.964268134,387.964268144,387.964268144,387.946402214,387.946402224,387.964268124,387.982134054,387.964268134,387.964268134,387.964268124,387.964268124,387.982134054,387.982134054,387.982134044,387.982134044,387.982134064,387.999999994,387.999999994,387.982134054,387.982134054,387.982134054,387.999999984,387.999999984,387.999999984,387.999999984,387.999999984,387.982134064,387.982134064,387.982134064,387.982134064,387.982134064,387.964268114,387.982134044,387.982134044,387.964268124,387.982134044,387.982134044,387.964268124,387.946402214,387.946402214,387.946402214,387.964268124,387.946402204,387.946402204,387.964268124,387.964268124,387.982134044,387.982134044,387.982134054,387.982134054,387.964268124,387.982134044,387.982134044,387.982134044,387.964268124,387.964268124,387.964268134,387.964268134,387.964268134,387.964268124,387.964268124,387.964268134,387.946402214,387.946402214,387.964268124,387.964268124,387.964268124,387.964268124,387.982134044,387.982134044,387.982134054,387.982134054,387.982134054,387.982134064,387.982134064,387.982134044,387.964268134,387.982134064,387.964268134,387.964268134,387.964268134,387.964268134,387.964268134,387.964268134,387.964268134,387.946402214,387.946402214,387.999999984,387.999999984,387.999999984,387.999999994,387.999999994,387.999999984,387.999999984,387.999999984,387.999999974,387.999999984,387.999999984,387.999999974,321.999999984,321.999999984,103.387533864,103.387533854,103.387533874,103.387533864,55.833893535,55.833893535,55.833893538,55.83389354,55.833893539,0,58.697539089,58.697539089,58.697539084,113.824751564,123.080397444,123.080397444,427.999999984,427.999999984,427.999999984 +387.997088035,387.997088035,387.997088035,387.999999985,387.999999985,387.999999995,388.000000005,387.999999995,387.999999985,387.999999985,387.999999965,387.999999975,387.999999965,387.999999975,387.999999975,387.999999975,387.999999975,387.999793985,387.999896975,387.999896985,387.999794005,387.999794005,387.999690955,387.999793965,387.999793985,387.999794005,387.999793995,387.999793995,387.999896955,387.999793995,387.999793995,387.999896985,387.999896985,387.999793995,387.999896955,387.999793955,387.999896985,387.999896995,387.999897045,387.999793985,387.999793985,387.999794025,387.999896995,387.999897045,387.999896985,387.999897015,387.999897005,387.999897005,387.999897005,387.999793995,387.982134055,387.982134075,387.982134065,387.964268135,387.982134055,387.964268125,387.964268135,387.964268135,387.982134055,387.999999975,387.999999975,387.982134055,387.982134055,387.964268135,387.964268125,387.999999965,387.964268145,387.982134055,387.964268145,387.982134065,387.982134065,387.982134065,387.964268135,387.964268135,387.964268125,387.964268125,387.964268135,387.964268135,387.964268145,387.964268145,387.946402215,387.946402225,387.964268125,387.982134055,387.964268135,387.964268135,387.964268125,387.964268125,387.982134055,387.982134055,387.982134045,387.982134045,387.982134065,387.999999995,387.999999995,387.982134055,387.982134055,387.982134055,387.999999985,387.999999985,387.999999985,387.999999985,387.999999985,387.982134065,387.982134065,387.982134065,387.982134065,387.982134065,387.964268115,387.982134045,387.982134045,387.964268125,387.982134045,387.982134045,387.964268125,387.946402215,387.946402215,387.946402215,387.964268125,387.946402205,387.946402205,387.964268125,387.964268125,387.982134045,387.982134045,387.982134055,387.982134055,387.964268125,387.982134045,387.982134045,387.982134045,387.964268125,387.964268125,387.964268135,387.964268135,387.964268135,387.964268125,387.964268125,387.964268135,387.946402215,387.946402215,387.964268125,387.964268125,387.964268125,387.964268125,387.982134045,387.982134045,387.982134055,387.982134055,387.982134055,387.982134065,387.982134065,387.982134045,387.964268135,387.982134065,387.964268135,387.964268135,387.964268135,387.964268135,387.964268135,387.964268135,387.964268135,387.946402215,387.946402215,387.999999985,387.999999985,387.999999985,387.999999995,387.999999995,387.999999985,387.999999985,387.999999985,387.999999975,387.999999985,387.999999985,387.999999975,321.999999985,321.999999985,103.387533865,103.387533855,103.387533875,103.387533865,58.697539084,58.697539084,58.697539087,58.697539089,58.697539088,58.697539089,0,38.4904195,45.471444565,113.824751565,123.080397445,123.080397445,427.999999985,427.999999985,427.999999985 +387.997088035,387.997088035,387.997088035,387.999999985,387.999999985,387.999999995,388.000000005,387.999999995,387.999999985,387.999999985,387.999999965,387.999999975,387.999999965,387.999999975,387.999999975,387.999999975,387.999999975,387.999793985,387.999896975,387.999896985,387.999794005,387.999794005,387.999690955,387.999793965,387.999793985,387.999794005,387.999793995,387.999793995,387.999896955,387.999793995,387.999793995,387.999896985,387.999896985,387.999793995,387.999896955,387.999793955,387.999896985,387.999896995,387.999897045,387.999793985,387.999793985,387.999794025,387.999896995,387.999897045,387.999896985,387.999897015,387.999897005,387.999897005,387.999897005,387.999793995,387.982134055,387.982134075,387.982134065,387.964268135,387.982134055,387.964268125,387.964268135,387.964268135,387.982134055,387.999999975,387.999999975,387.982134055,387.982134055,387.964268135,387.964268125,387.999999965,387.964268145,387.982134055,387.964268145,387.982134065,387.982134065,387.982134065,387.964268135,387.964268135,387.964268125,387.964268125,387.964268135,387.964268135,387.964268145,387.964268145,387.946402215,387.946402225,387.964268125,387.982134055,387.964268135,387.964268135,387.964268125,387.964268125,387.982134055,387.982134055,387.982134045,387.982134045,387.982134065,387.999999995,387.999999995,387.982134055,387.982134055,387.982134055,387.999999985,387.999999985,387.999999985,387.999999985,387.999999985,387.982134065,387.982134065,387.982134065,387.982134065,387.982134065,387.964268115,387.982134045,387.982134045,387.964268125,387.982134045,387.982134045,387.964268125,387.946402215,387.946402215,387.946402215,387.964268125,387.946402205,387.946402205,387.964268125,387.964268125,387.982134045,387.982134045,387.982134055,387.982134055,387.964268125,387.982134045,387.982134045,387.982134045,387.964268125,387.964268125,387.964268135,387.964268135,387.964268135,387.964268125,387.964268125,387.964268135,387.946402215,387.946402215,387.964268125,387.964268125,387.964268125,387.964268125,387.982134045,387.982134045,387.982134055,387.982134055,387.982134055,387.982134065,387.982134065,387.982134045,387.964268135,387.982134065,387.964268135,387.964268135,387.964268135,387.964268135,387.964268135,387.964268135,387.964268135,387.946402215,387.946402215,387.999999985,387.999999985,387.999999985,387.999999995,387.999999995,387.999999985,387.999999985,387.999999985,387.999999975,387.999999985,387.999999985,387.999999975,321.999999985,321.999999985,103.387533865,103.387533855,103.387533875,103.387533865,58.697539084,58.697539084,58.697539087,58.697539089,58.697539088,58.697539089,38.4904195,0,45.471444565,113.824751565,123.080397445,123.080397445,427.999999985,427.999999985,427.999999985 +387.99708803,387.99708803,387.99708803,387.99999998,387.99999998,387.99999999,388,387.99999999,387.99999998,387.99999998,387.99999996,387.99999997,387.99999996,387.99999997,387.99999997,387.99999997,387.99999997,387.99979398,387.99989697,387.99989698,387.999794,387.999794,387.99969095,387.99979396,387.99979398,387.999794,387.99979399,387.99979399,387.99989695,387.99979399,387.99979399,387.99989698,387.99989698,387.99979399,387.99989695,387.99979395,387.99989698,387.99989699,387.99989704,387.99979398,387.99979398,387.99979402,387.99989699,387.99989704,387.99989698,387.99989701,387.999897,387.999897,387.999897,387.99979399,387.98213405,387.98213407,387.98213406,387.96426813,387.98213405,387.96426812,387.96426813,387.96426813,387.98213405,387.99999997,387.99999997,387.98213405,387.98213405,387.96426813,387.96426812,387.99999996,387.96426814,387.98213405,387.96426814,387.98213406,387.98213406,387.98213406,387.96426813,387.96426813,387.96426812,387.96426812,387.96426813,387.96426813,387.96426814,387.96426814,387.94640221,387.94640222,387.96426812,387.98213405,387.96426813,387.96426813,387.96426812,387.96426812,387.98213405,387.98213405,387.98213404,387.98213404,387.98213406,387.99999999,387.99999999,387.98213405,387.98213405,387.98213405,387.99999998,387.99999998,387.99999998,387.99999998,387.99999998,387.98213406,387.98213406,387.98213406,387.98213406,387.98213406,387.96426811,387.98213404,387.98213404,387.96426812,387.98213404,387.98213404,387.96426812,387.94640221,387.94640221,387.94640221,387.96426812,387.9464022,387.9464022,387.96426812,387.96426812,387.98213404,387.98213404,387.98213405,387.98213405,387.96426812,387.98213404,387.98213404,387.98213404,387.96426812,387.96426812,387.96426813,387.96426813,387.96426813,387.96426812,387.96426812,387.96426813,387.94640221,387.94640221,387.96426812,387.96426812,387.96426812,387.96426812,387.98213404,387.98213404,387.98213405,387.98213405,387.98213405,387.98213406,387.98213406,387.98213404,387.96426813,387.98213406,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.94640221,387.94640221,387.99999998,387.99999998,387.99999998,387.99999999,387.99999999,387.99999998,387.99999998,387.99999998,387.99999997,387.99999998,387.99999998,387.99999997,321.99999998,321.99999998,103.38753386,103.38753385,103.38753387,103.38753386,58.697539079,58.697539079,58.697539082,58.697539084,58.697539083,58.697539084,45.471444565,45.471444565,0,113.82475156,123.08039744,123.08039744,427.99999998,427.99999998,427.99999998 +387.99708805,387.99708805,387.99708805,388,388,388.00000001,388.00000002,388.00000001,388,388,387.99999998,387.99999999,387.99999998,387.99999999,387.99999999,387.99999999,387.99999999,387.999794,387.99989699,387.999897,387.99979402,387.99979402,387.99969097,387.99979398,387.999794,387.99979402,387.99979401,387.99979401,387.99989697,387.99979401,387.99979401,387.999897,387.999897,387.99979401,387.99989697,387.99979397,387.999897,387.99989701,387.99989706,387.999794,387.999794,387.99979404,387.99989701,387.99989706,387.999897,387.99989703,387.99989702,387.99989702,387.99989702,387.99979401,387.98213407,387.98213409,387.98213408,387.96426815,387.98213407,387.96426814,387.96426815,387.96426815,387.98213407,387.99999999,387.99999999,387.98213407,387.98213407,387.96426815,387.96426814,387.99999998,387.96426816,387.98213407,387.96426816,387.98213408,387.98213408,387.98213408,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.96426815,387.96426816,387.96426816,387.94640223,387.94640224,387.96426814,387.98213407,387.96426815,387.96426815,387.96426814,387.96426814,387.98213407,387.98213407,387.98213406,387.98213406,387.98213408,388.00000001,388.00000001,387.98213407,387.98213407,387.98213407,388,388,388,388,388,387.98213408,387.98213408,387.98213408,387.98213408,387.98213408,387.96426813,387.98213406,387.98213406,387.96426814,387.98213406,387.98213406,387.96426814,387.94640223,387.94640223,387.94640223,387.96426814,387.94640222,387.94640222,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.96426814,387.98213406,387.98213406,387.98213406,387.96426814,387.96426814,387.96426815,387.96426815,387.96426815,387.96426814,387.96426814,387.96426815,387.94640223,387.94640223,387.96426814,387.96426814,387.96426814,387.96426814,387.98213406,387.98213406,387.98213407,387.98213407,387.98213407,387.98213408,387.98213408,387.98213406,387.96426815,387.98213408,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.96426815,387.94640223,387.94640223,388,388,388,388.00000001,388.00000001,388,388,388,387.99999999,388,388,387.99999999,322,322,113.82475158,113.82475157,113.82475159,113.82475158,113.824751559,113.824751559,113.824751562,113.824751564,113.824751563,113.824751564,113.824751565,113.824751565,113.82475156,0,123.08039746,123.08039746,428,428,428 +387.99708803,387.99708803,387.99708803,387.99999998,387.99999998,387.99999999,388,387.99999999,387.99999998,387.99999998,387.99999996,387.99999997,387.99999996,387.99999997,387.99999997,387.99999997,387.99999997,387.99979398,387.99989697,387.99989698,387.999794,387.999794,387.99969095,387.99979396,387.99979398,387.999794,387.99979399,387.99979399,387.99989695,387.99979399,387.99979399,387.99989698,387.99989698,387.99979399,387.99989695,387.99979395,387.99989698,387.99989699,387.99989704,387.99979398,387.99979398,387.99979402,387.99989699,387.99989704,387.99989698,387.99989701,387.999897,387.999897,387.999897,387.99979399,387.98213405,387.98213407,387.98213406,387.96426813,387.98213405,387.96426812,387.96426813,387.96426813,387.98213405,387.99999997,387.99999997,387.98213405,387.98213405,387.96426813,387.96426812,387.99999996,387.96426814,387.98213405,387.96426814,387.98213406,387.98213406,387.98213406,387.96426813,387.96426813,387.96426812,387.96426812,387.96426813,387.96426813,387.96426814,387.96426814,387.94640221,387.94640222,387.96426812,387.98213405,387.96426813,387.96426813,387.96426812,387.96426812,387.98213405,387.98213405,387.98213404,387.98213404,387.98213406,387.99999999,387.99999999,387.98213405,387.98213405,387.98213405,387.99999998,387.99999998,387.99999998,387.99999998,387.99999998,387.98213406,387.98213406,387.98213406,387.98213406,387.98213406,387.96426811,387.98213404,387.98213404,387.96426812,387.98213404,387.98213404,387.96426812,387.94640221,387.94640221,387.94640221,387.96426812,387.9464022,387.9464022,387.96426812,387.96426812,387.98213404,387.98213404,387.98213405,387.98213405,387.96426812,387.98213404,387.98213404,387.98213404,387.96426812,387.96426812,387.96426813,387.96426813,387.96426813,387.96426812,387.96426812,387.96426813,387.94640221,387.94640221,387.96426812,387.96426812,387.96426812,387.96426812,387.98213404,387.98213404,387.98213405,387.98213405,387.98213405,387.98213406,387.98213406,387.98213404,387.96426813,387.98213406,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.94640221,387.94640221,387.99999998,387.99999998,387.99999998,387.99999999,387.99999999,387.99999998,387.99999998,387.99999998,387.99999997,387.99999998,387.99999998,387.99999997,321.99999998,321.99999998,123.08039746,123.08039745,123.08039747,123.08039746,123.080397439,123.080397439,123.080397442,123.080397444,123.080397443,123.080397444,123.080397445,123.080397445,123.08039744,123.08039746,0,95.11653114,427.99999998,427.99999998,427.99999998 +387.99708803,387.99708803,387.99708803,387.99999998,387.99999998,387.99999999,388,387.99999999,387.99999998,387.99999998,387.99999996,387.99999997,387.99999996,387.99999997,387.99999997,387.99999997,387.99999997,387.99979398,387.99989697,387.99989698,387.999794,387.999794,387.99969095,387.99979396,387.99979398,387.999794,387.99979399,387.99979399,387.99989695,387.99979399,387.99979399,387.99989698,387.99989698,387.99979399,387.99989695,387.99979395,387.99989698,387.99989699,387.99989704,387.99979398,387.99979398,387.99979402,387.99989699,387.99989704,387.99989698,387.99989701,387.999897,387.999897,387.999897,387.99979399,387.98213405,387.98213407,387.98213406,387.96426813,387.98213405,387.96426812,387.96426813,387.96426813,387.98213405,387.99999997,387.99999997,387.98213405,387.98213405,387.96426813,387.96426812,387.99999996,387.96426814,387.98213405,387.96426814,387.98213406,387.98213406,387.98213406,387.96426813,387.96426813,387.96426812,387.96426812,387.96426813,387.96426813,387.96426814,387.96426814,387.94640221,387.94640222,387.96426812,387.98213405,387.96426813,387.96426813,387.96426812,387.96426812,387.98213405,387.98213405,387.98213404,387.98213404,387.98213406,387.99999999,387.99999999,387.98213405,387.98213405,387.98213405,387.99999998,387.99999998,387.99999998,387.99999998,387.99999998,387.98213406,387.98213406,387.98213406,387.98213406,387.98213406,387.96426811,387.98213404,387.98213404,387.96426812,387.98213404,387.98213404,387.96426812,387.94640221,387.94640221,387.94640221,387.96426812,387.9464022,387.9464022,387.96426812,387.96426812,387.98213404,387.98213404,387.98213405,387.98213405,387.96426812,387.98213404,387.98213404,387.98213404,387.96426812,387.96426812,387.96426813,387.96426813,387.96426813,387.96426812,387.96426812,387.96426813,387.94640221,387.94640221,387.96426812,387.96426812,387.96426812,387.96426812,387.98213404,387.98213404,387.98213405,387.98213405,387.98213405,387.98213406,387.98213406,387.98213404,387.96426813,387.98213406,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.96426813,387.94640221,387.94640221,387.99999998,387.99999998,387.99999998,387.99999999,387.99999999,387.99999998,387.99999998,387.99999998,387.99999997,387.99999998,387.99999998,387.99999997,321.99999998,321.99999998,123.08039746,123.08039745,123.08039747,123.08039746,123.080397439,123.080397439,123.080397442,123.080397444,123.080397443,123.080397444,123.080397445,123.080397445,123.08039744,123.08039746,95.11653114,0,427.99999998,427.99999998,427.99999998 +427.99708805,427.99708805,427.99708805,428,428,428.00000001,428.00000002,428.00000001,428,428,427.99999998,427.99999999,427.99999998,427.99999999,427.99999999,427.99999999,427.99999999,427.999794,427.99989699,427.999897,427.99979402,427.99979402,427.99969097,427.99979398,427.999794,427.99979402,427.99979401,427.99979401,427.99989697,427.99979401,427.99979401,427.999897,427.999897,427.99979401,427.99989697,427.99979397,427.999897,427.99989701,427.99989706,427.999794,427.999794,427.99979404,427.99989701,427.99989706,427.999897,427.99989703,427.99989702,427.99989702,427.99989702,427.99979401,427.98213407,427.98213409,427.98213408,427.96426815,427.98213407,427.96426814,427.96426815,427.96426815,427.98213407,427.99999999,427.99999999,427.98213407,427.98213407,427.96426815,427.96426814,427.99999998,427.96426816,427.98213407,427.96426816,427.98213408,427.98213408,427.98213408,427.96426815,427.96426815,427.96426814,427.96426814,427.96426815,427.96426815,427.96426816,427.96426816,427.94640223,427.94640224,427.96426814,427.98213407,427.96426815,427.96426815,427.96426814,427.96426814,427.98213407,427.98213407,427.98213406,427.98213406,427.98213408,428.00000001,428.00000001,427.98213407,427.98213407,427.98213407,428,428,428,428,428,427.98213408,427.98213408,427.98213408,427.98213408,427.98213408,427.96426813,427.98213406,427.98213406,427.96426814,427.98213406,427.98213406,427.96426814,427.94640223,427.94640223,427.94640223,427.96426814,427.94640222,427.94640222,427.96426814,427.96426814,427.98213406,427.98213406,427.98213407,427.98213407,427.96426814,427.98213406,427.98213406,427.98213406,427.96426814,427.96426814,427.96426815,427.96426815,427.96426815,427.96426814,427.96426814,427.96426815,427.94640223,427.94640223,427.96426814,427.96426814,427.96426814,427.96426814,427.98213406,427.98213406,427.98213407,427.98213407,427.98213407,427.98213408,427.98213408,427.98213406,427.96426815,427.98213408,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.94640223,427.94640223,428,428,428,428.00000001,428.00000001,428,428,428,427.99999999,428,428,427.99999999,428,428,428,427.99999999,428.00000001,428,427.999999979,427.999999979,427.999999982,427.999999984,427.999999983,427.999999984,427.999999985,427.999999985,427.99999998,428,427.99999998,427.99999998,0,148,148 +427.99708805,427.99708805,427.99708805,428,428,428.00000001,428.00000002,428.00000001,428,428,427.99999998,427.99999999,427.99999998,427.99999999,427.99999999,427.99999999,427.99999999,427.999794,427.99989699,427.999897,427.99979402,427.99979402,427.99969097,427.99979398,427.999794,427.99979402,427.99979401,427.99979401,427.99989697,427.99979401,427.99979401,427.999897,427.999897,427.99979401,427.99989697,427.99979397,427.999897,427.99989701,427.99989706,427.999794,427.999794,427.99979404,427.99989701,427.99989706,427.999897,427.99989703,427.99989702,427.99989702,427.99989702,427.99979401,427.98213407,427.98213409,427.98213408,427.96426815,427.98213407,427.96426814,427.96426815,427.96426815,427.98213407,427.99999999,427.99999999,427.98213407,427.98213407,427.96426815,427.96426814,427.99999998,427.96426816,427.98213407,427.96426816,427.98213408,427.98213408,427.98213408,427.96426815,427.96426815,427.96426814,427.96426814,427.96426815,427.96426815,427.96426816,427.96426816,427.94640223,427.94640224,427.96426814,427.98213407,427.96426815,427.96426815,427.96426814,427.96426814,427.98213407,427.98213407,427.98213406,427.98213406,427.98213408,428.00000001,428.00000001,427.98213407,427.98213407,427.98213407,428,428,428,428,428,427.98213408,427.98213408,427.98213408,427.98213408,427.98213408,427.96426813,427.98213406,427.98213406,427.96426814,427.98213406,427.98213406,427.96426814,427.94640223,427.94640223,427.94640223,427.96426814,427.94640222,427.94640222,427.96426814,427.96426814,427.98213406,427.98213406,427.98213407,427.98213407,427.96426814,427.98213406,427.98213406,427.98213406,427.96426814,427.96426814,427.96426815,427.96426815,427.96426815,427.96426814,427.96426814,427.96426815,427.94640223,427.94640223,427.96426814,427.96426814,427.96426814,427.96426814,427.98213406,427.98213406,427.98213407,427.98213407,427.98213407,427.98213408,427.98213408,427.98213406,427.96426815,427.98213408,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.94640223,427.94640223,428,428,428,428.00000001,428.00000001,428,428,428,427.99999999,428,428,427.99999999,428,428,428,427.99999999,428.00000001,428,427.999999979,427.999999979,427.999999982,427.999999984,427.999999983,427.999999984,427.999999985,427.999999985,427.99999998,428,427.99999998,427.99999998,148,0,38.80040742 +427.99708805,427.99708805,427.99708805,428,428,428.00000001,428.00000002,428.00000001,428,428,427.99999998,427.99999999,427.99999998,427.99999999,427.99999999,427.99999999,427.99999999,427.999794,427.99989699,427.999897,427.99979402,427.99979402,427.99969097,427.99979398,427.999794,427.99979402,427.99979401,427.99979401,427.99989697,427.99979401,427.99979401,427.999897,427.999897,427.99979401,427.99989697,427.99979397,427.999897,427.99989701,427.99989706,427.999794,427.999794,427.99979404,427.99989701,427.99989706,427.999897,427.99989703,427.99989702,427.99989702,427.99989702,427.99979401,427.98213407,427.98213409,427.98213408,427.96426815,427.98213407,427.96426814,427.96426815,427.96426815,427.98213407,427.99999999,427.99999999,427.98213407,427.98213407,427.96426815,427.96426814,427.99999998,427.96426816,427.98213407,427.96426816,427.98213408,427.98213408,427.98213408,427.96426815,427.96426815,427.96426814,427.96426814,427.96426815,427.96426815,427.96426816,427.96426816,427.94640223,427.94640224,427.96426814,427.98213407,427.96426815,427.96426815,427.96426814,427.96426814,427.98213407,427.98213407,427.98213406,427.98213406,427.98213408,428.00000001,428.00000001,427.98213407,427.98213407,427.98213407,428,428,428,428,428,427.98213408,427.98213408,427.98213408,427.98213408,427.98213408,427.96426813,427.98213406,427.98213406,427.96426814,427.98213406,427.98213406,427.96426814,427.94640223,427.94640223,427.94640223,427.96426814,427.94640222,427.94640222,427.96426814,427.96426814,427.98213406,427.98213406,427.98213407,427.98213407,427.96426814,427.98213406,427.98213406,427.98213406,427.96426814,427.96426814,427.96426815,427.96426815,427.96426815,427.96426814,427.96426814,427.96426815,427.94640223,427.94640223,427.96426814,427.96426814,427.96426814,427.96426814,427.98213406,427.98213406,427.98213407,427.98213407,427.98213407,427.98213408,427.98213408,427.98213406,427.96426815,427.98213408,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.96426815,427.94640223,427.94640223,428,428,428,428.00000001,428.00000001,428,428,428,427.99999999,428,428,427.99999999,428,428,428,427.99999999,428.00000001,428,427.999999979,427.999999979,427.999999982,427.999999984,427.999999983,427.999999984,427.999999985,427.999999985,427.99999998,428,427.99999998,427.99999998,148,38.80040742,0 diff --git a/examples/caudata_dist_nj.txt b/examples/caudata_dist_nj.txt index 3950b4e56..fda46a608 100644 --- a/examples/caudata_dist_nj.txt +++ b/examples/caudata_dist_nj.txt @@ -1 +1 @@ -((Plethodon_caddoensis:18.6877561,Plethodon_ouachitae:18.6877561):5.35977709,((((Plethodon_shermani:8.91509588,Plethodon_cheoah:8.91509588):0.85756433,((Plethodon_teyahalee:3.84117358,Plethodon_cylindraceus:3.84117358):4.28782167,Plethodon_chlorobryonis:8.14686117):1.62579905):7.23569907,((Plethodon_amplus:4.39501721,Plethodon_meridianus:4.39501721):4.87739715,Plethodon_montanus:9.27241436):7.73594493):5.57416817,(((Plethodon_albagula:8.20045894,Plethodon_grobmani:8.20045894):2.55482708,Plethodon_mississippi:10.75528602):5.64563186,Plethodon_glutinosus:16.40091788):6.18160957):1.46500574,((((((((Plethodon_ventralis:15.41829208,Plethodon_dorsalis:15.41829208):3.34092772,Plethodon_angusticlavius:18.75921979):9.50467137,Plethodon_welleri:28.26389116):7.27143091,(Plethodon_wehrlei:8.75430257,Plethodon_punctatus:8.75430257):26.76315358):5.84215702,((((((Plethodon_nettingi:11.63071627,Plethodon_hubrichti:11.63071627):1.73299459,Plethodon_richmondi:13.38157678):6.32453696,(Plethodon_cinereus:12.73840354,Plethodon_shenandoah:12.73840354):6.94984429):1.53646943,Plethodon_hoffmani:21.22471726):10.93394526,Plethodon_serratus:32.17652843):16.22225865,((((((((((Desmognathus_quadramaculatus:28.94279626,Desmognathus_marmoratus:28.94279626):3.59105065,((((Desmognathus_brimleyorum:17.72299623,Desmognathus_auriculatus:17.72299623):2.41189969,Desmognathus_monticola:20.15276184):3.01934109,((Desmognathus_welteri:15.66841501,Desmognathus_fuscus:15.66841501):2.75135224,Desmognathus_ochrophaeus:18.41976725):4.75233568):4.68087199,Desmognathus_imitator:27.85297492):4.68087199):2.98360924,Desmognathus_aeneus:35.53532208):14.43566629,Desmognathus_wrighti:49.95312244):15.97213572,Phaeognathus_hubrichti:65.94312407):8.80790034,(((Aneides_lugubris:29.87182429,Aneides_flavipunctatus:29.87182429):8.48631372,Aneides_hardii:38.358138):15.86494018,Aneides_aeneus:54.22307818):20.52794624):2.85854778,Ensatina_eschscholtzii:77.6095722):2.32257007,(Hydromantes_italicus:38.16161285,Hydromantes_platycephalus:38.16161285):41.77052941):6.07441403,(((((((((((Oedipina_cyclocauda:24.56564497,Oedipina_uniformis:24.56564498):7.53941977,(Oedipina_complex:9.21881659,Oedipina_parvipes:9.21881659):22.90411408):14.72152107,Bradytriton_silus:46.84445173):8.41485002,Nototriton_picadoi:55.25930174):8.61137518,Nyctanolis_pernix:63.88854285):6.28880511,((((((Pseudoeurycea_leprosa:28.71053925,Pseudoeurycea_werleri:28.74627109):7.28929683,((Pseudoeurycea_robertsi:10.18357647,Pseudoeurycea_gadovii:10.20144238):9.3796099,Pseudoeurycea_rex:19.56318637):16.43664973):9.79052614,Parvimolge_townsendi:45.79036223):3.30519587,((Pseudoeurycea_cephalica:23.15423701,Pseudoeurycea_galeanae:23.15423701):16.15079495,Pseudoeurycea_bellii:39.30503196):9.80839207):5.05605638,((((Bolitoglossa_dofleini:30.53286346,Bolitoglossa_morio:30.51499753):2.1975086,(Bolitoglossa_engelhardti:14.57859367,Bolitoglossa_rostrata:14.57859367):18.13391247):6.30667104,(((Bolitoglossa_mexicana:9.95131946,Bolitoglossa_yucatana:9.95131946):11.36272741,Bolitoglossa_platydactyla:21.29618095):10.43369939,(Bolitoglossa_occidentalis:18.40190132,Bolitoglossa_rufescens:18.40190132):13.32797902):7.30716276):2.93001147,((Bolitoglossa_adspersa:13.22078348,Bolitoglossa_palmata:13.22078347):15.82920833,Bolitoglossa_subpalmata:29.03212587):12.91706278):12.20242583):9.48680544,((((Chiropterotriton_dimidiatus:13.45304049,Chiropterotriton_lavae:13.45304049):5.93148664,Chiropterotriton_priscus:19.38452712):6.34240288,Chiropterotriton_multidentatus:25.72693):3.94836912,Chiropterotriton_chondrostega:29.67529913):33.96312079):6.52106212):1.32207835,Cryptotriton_nasalis:71.48156039):9.16521882,((Batrachoseps_attenuatus:38.07228323,Batrachoseps_major:38.07228323):27.19193574,Batrachoseps_wrighti:65.26421898):15.38256023):8.03966563,(((Pseudotriton_montanus:37.46484182,Pseudotriton_ruber:37.46484182):4.19849205,(Stereochilus_marginatus:37.00032782,Gyrinophilus_porphyriticus:37.00032782):4.66300606):25.45894115,(((Eurycea_tynerensis:25.54827078,Eurycea_spelaea:25.54827078):11.16620226,Eurycea_multiplicata:36.69660711):3.64464842,(((((Eurycea_cirrigera:18.86641534,Eurycea_bislineata:18.86641534):4.09129651,((Eurycea_aquatica:10.38010162,Eurycea_junaluska:10.38010162):3.39452549,Eurycea_wilderae:13.77462711):9.18308474):9.05802327,(Eurycea_lucifuga:16.90116374,Eurycea_longicauda:16.90116374):15.09670545):3.37665956,((((Eurycea_neotenes:1.64366497,Eurycea_tridentifera:1.64366497):1.07195542,Eurycea_sosorum:2.71562039):0.44664809,Eurycea_nana:3.16226848):7.73594493,Eurycea_rathbuni:10.89821341):24.47631535):1.26848058,Eurycea_quadridigitata:36.64300933):3.69824619):26.78101951):21.58203573):11.25553188,Hemidactylium_scutatum:99.95984264):9.02229143,(((((((Andrias_davidianus:66,Cryptobranchus_alleganiensis:66):95,((((((Batrachuperus_pinchonii:23.92682927,Batrachuperus_yenyuanensis:23.92682926):18.31436314,Liua_shihi:42.24119242):5.51400181,Salamandrella_keyserlingii:47.75519422):3.93857272,((((((Hynobius_nebulosus:10.26136019,Hynobius_dunni:10.26136019):4.680505127,Hynobius_tsuensis:14.94186532):8.821265868,Hynobius_leechii:23.76313119):1.916897941,Hynobius_naevius:25.68002913):2.236917639,Hynobius_stejnegeri:27.91694677):1.431822774,((Hynobius_nigrescens:19.24520975,Hynobius_lichenatus:19.24520975):3.490512535,Hynobius_abei:22.73572228):6.61304726):22.34499738):5.21860885,Pachyhynobius_shangchengensis:56.91237579):4.62782295,(Paradactylodon_mustersi:47.55826557,Ranodon_sibiricus:47.55826557):13.98193315):99.45980126):33,((Siren_lacertina:19.40020371,Siren_intermedia:19.40020371):54.59979629,Pseudobranchus_axanthus:74):160):13,((((((((Ambystoma_cingulatum:42.90378798,Ambystoma_annulatum:42.90378797):3.02515995,((Ambystoma_texanum:9.55326679,Ambystoma_barbouri:9.55326679):30.72836597,Ambystoma_opacum:40.28163277):5.64731515):5.32684515,(Ambystoma_laterale:36.15570323,Ambystoma_jeffersonianum:36.15570323):15.10008983):0.91882006,(((Ambystoma_ordinarium:15.86272809,Ambystoma_mavortium:15.8627281):12.35612986,Ambystoma_velasci:28.21885795):14.55108641,Ambystoma_californiense:42.76994437):9.40466874):5.77149223,Ambystoma_macrodactylum:57.94610534):1.47389465,(Ambystoma_maculatum:51.41116389,Ambystoma_gracile:51.41116389):8.0088361):58.58,((Dicamptodon_copei:15.88406289,Dicamptodon_tenebrosus:15.88406289):8.23254925,Dicamptodon_ensatus:24.11661214):93.88047591):45,((((((Notophthalmus_perstriatus:42.31406638,Notophthalmus_viridescens:42.31406638):17.64499771,Notophthalmus_meridionalis:59.9590641):13.16162268,((Taricha_granulosa:31.04321088,Taricha_torosa:31.04331389):4.42641615,Taricha_rivularis:35.46973006):37.6509567):9.0501799,((((Lissotriton_helveticus:28.87844877,Lissotriton_boscai:28.87844877):10.67357513,(Lissotriton_vulgaris:10.67357513,Lissotriton_montandoni:10.67357513):28.87834578):27.3994902,Ichthyosaura_alpestris:66.95151407):0.30869038,((((Neurergus_crocatus:25.96295208,Neurergus_strauchii:25.96295213):25.09466382,Ommatotriton_vittatus:51.05761589):0.14193371,((Triturus_pygmaeus:23.15548669,Triturus_cristatus:23.15558965):17.38272342,Calotriton_asper:40.53821007):10.6612365):1.00465999,((((Paramesotriton_chinensis:12.88723123,Paramesotriton_hongkongensis:12.88723128):6.08100485,Paramesotriton_caudopunctatus:18.96813311):8.32454635,Pachytriton_brevipes:27.29278242):6.8455723,(Cynops_pyrrhogaster:9.60586379,Cynops_ensicauda:9.60586379):24.53238793):18.06585487):15.05599489):14.91076518):6.66202668,((((Tylototriton_verrucosus:19.64350272,Tylototriton_kweichowensis:19.64350272):19.50558599,Tylototriton_asperrimus:39.14908871):14.98791203,Echinotriton_andersoni:54.13700075):23.93591614,Pleurodeles_waltl:78.07281387):10.76007948):14.16690066,(((Chioglossa_lusitanica:53.57235588,Mertensiella_caucasica:53.57235588):5.00887998,(Salamandra_atra:24.8437563,Salamandra_salamandra:24.84375631):33.73758253):5.68177763,Salamandrina_terdigitata:64.26301347):38.73678053):60):18):11,((((Necturus_alabamensis:70.9920748,Necturus_beyeri:70.99207481):4.15800956,Necturus_maculosus:75.15008437):9.35391177,Necturus_punctatus:84.50399613):61.49600386,Proteus_anguinus:146):24):18,(((Rhyacotriton_olympicus:1.76206061,Rhyacotriton_kezeri:1.76206061):5.75697501,Rhyacotriton_cascadae:7.51903561):1.14096439,Rhyacotriton_variegatus:8.66):143.34):12,((Amphiuma_pholeter:2.74051282,Amphiuma_means:2.74051282):3.93948718,Amphiuma_tridactylum:6.68):133.32):31):22.97557777):11.13047042,(((Plethodon_vandykei:11.45205704,Plethodon_idahoensis:11.45205704):41.89559088,Plethodon_neomexicanus:53.329782):1.05408949,((Plethodon_vehiculum:30.83658416,Plethodon_dunni:30.83658416):12.38108507,Plethodon_elongatus:43.1998033):11.18406818):20.47434846):26.45943287):7.03917391):13.50663825,Plethodon_yonahlossee:27.85297492):1.94738567,Plethodon_kentucki:25.92345517):1.12555319,(Plethodon_metcalfi:16.65104081,Plethodon_jordani:16.65104081):8.14686117):0.73250287); +((Plethodon_caddoensis:18.6877561,Plethodon_ouachitae:18.6877561):5.35977709,((((Plethodon_shermani:8.91509588,Plethodon_cheoah:8.91509588):0.85756433,((Plethodon_teyahalee:3.84117358,Plethodon_cylindraceus:3.84117358):4.28782167,Plethodon_chlorobryonis:8.14686117):1.62579905):7.23569907,((Plethodon_amplus:4.39501721,Plethodon_meridianus:4.39501721):4.87739715,Plethodon_montanus:9.27241436):7.73594493):5.57416817,(((Plethodon_albagula:8.20045894,Plethodon_grobmani:8.20045894):2.55482708,Plethodon_mississippi:10.75528602):5.64563186,Plethodon_glutinosus:16.40091788):6.18160957):1.46500574,((((((((Plethodon_ventralis:15.41829208,Plethodon_dorsalis:15.41829208):3.34092772,Plethodon_angusticlavius:18.75921979):9.50467137,Plethodon_welleri:28.26389116):7.27143091,(Plethodon_wehrlei:8.75430257,Plethodon_punctatus:8.75430257):26.76315358):5.84215702,((((((Plethodon_nettingi:11.63071627,Plethodon_hubrichti:11.63071627):1.73299459,Plethodon_richmondi:13.38157678):6.32453696,(Plethodon_cinereus:12.73840354,Plethodon_shenandoah:12.73840354):6.94984429):1.53646943,Plethodon_hoffmani:21.22471726):10.93394526,Plethodon_serratus:32.17652843):16.22225865,((((((((((Desmognathus_quadramaculatus:28.94279626,Desmognathus_marmoratus:28.94279626):3.59105065,((((Desmognathus_brimleyorum:17.72299623,Desmognathus_auriculatus:17.72299623):2.41189969,Desmognathus_monticola:20.15276184):3.01934109,((Desmognathus_welteri:15.66841501,Desmognathus_fuscus:15.66841501):2.75135224,Desmognathus_ochrophaeus:18.41976725):4.75233568):4.68087199,Desmognathus_imitator:27.85297492):4.68087199):2.98360924,Desmognathus_aeneus:35.53532208):14.43566629,Desmognathus_wrighti:49.95312244):15.97213572,Phaeognathus_hubrichti:65.94312407):8.80790034,(((Aneides_lugubris:29.87182429,Aneides_flavipunctatus:29.87182429):8.48631372,Aneides_hardii:38.358138):15.86494018,Aneides_aeneus:54.22307818):20.52794624):2.85854778,Ensatina_eschscholtzii:77.6095722):2.32257007,(Hydromantes_italicus:38.16161285,Hydromantes_platycephalus:38.16161285):41.77052941):6.07441403,(((((((((((Oedipina_cyclocauda:24.56564497,Oedipina_uniformis:24.56564498):7.53941977,(Oedipina_complex:9.21881659,Oedipina_parvipes:9.21881659):22.90411408):14.72152107,Bradytriton_silus:46.84445173):8.41485002,Nototriton_picadoi:55.25930174):8.61137518,Nyctanolis_pernix:63.88854285):6.28880511,((((((Pseudoeurycea_leprosa:28.71053925,Pseudoeurycea_werleri:28.74627109):7.28929683,((Pseudoeurycea_robertsi:10.18357647,Pseudoeurycea_gadovii:10.20144238):9.3796099,Pseudoeurycea_rex:19.56318637):16.43664973):9.79052614,Parvimolge_townsendi:45.79036223):3.30519587,((Pseudoeurycea_cephalica:23.15423701,Pseudoeurycea_galeanae:23.15423701):16.15079495,Pseudoeurycea_bellii:39.30503196):9.80839207):5.05605638,((((Bolitoglossa_dofleini:30.53286346,Bolitoglossa_morio:30.51499753):2.1975086,(Bolitoglossa_engelhardti:14.57859367,Bolitoglossa_rostrata:14.57859367):18.13391247):6.30667104,(((Bolitoglossa_mexicana:9.95131946,Bolitoglossa_yucatana:9.95131946):11.36272741,Bolitoglossa_platydactyla:21.29618095):10.43369939,(Bolitoglossa_occidentalis:18.40190132,Bolitoglossa_rufescens:18.40190132):13.32797902):7.30716276):2.93001147,((Bolitoglossa_adspersa:13.22078348,Bolitoglossa_palmata:13.22078347):15.82920833,Bolitoglossa_subpalmata:29.03212587):12.91706278):12.20242583):9.48680544,((((Chiropterotriton_dimidiatus:13.45304049,Chiropterotriton_lavae:13.45304049):5.93148664,Chiropterotriton_priscus:19.38452712):6.34240288,Chiropterotriton_multidentatus:25.72693):3.94836912,Chiropterotriton_chondrostega:29.67529913):33.96312079):6.52106212):1.32207835,Cryptotriton_nasalis:71.48156039):9.16521882,((Batrachoseps_attenuatus:38.07228323,Batrachoseps_major:38.07228323):27.19193574,Batrachoseps_wrighti:65.26421898):15.38256023):8.03966563,(((Pseudotriton_montanus:37.46484182,Pseudotriton_ruber:37.46484182):4.19849205,(Stereochilus_marginatus:37.00032782,Gyrinophilus_porphyriticus:37.00032782):4.66300606):25.45894115,(((Eurycea_tynerensis:25.54827078,Eurycea_spelaea:25.54827078):11.16620226,Eurycea_multiplicata:36.69660711):3.64464842,(((((Eurycea_cirrigera:18.86641534,Eurycea_bislineata:18.86641534):4.09129651,((Eurycea_aquatica:10.38010162,Eurycea_junaluska:10.38010162):3.39452549,Eurycea_wilderae:13.77462711):9.18308474):9.05802327,(Eurycea_lucifuga:16.90116374,Eurycea_longicauda:16.90116374):15.09670545):3.37665956,((((Eurycea_neotenes:1.64366497,Eurycea_tridentifera:1.64366497):1.07195542,Eurycea_sosorum:2.71562039):0.44664809,Eurycea_nana:3.16226848):7.73594493,Eurycea_rathbuni:10.89821341):24.47631535):1.26848058,Eurycea_quadridigitata:36.64300933):3.69824619):26.78101951):21.58203573):11.25553188,Hemidactylium_scutatum:99.95984264):9.02229143,(((((((Andrias_davidianus:66,Cryptobranchus_alleganiensis:66):95,((((((Batrachuperus_pinchonii:23.92682927,Batrachuperus_yenyuanensis:23.92682926):18.31436314,Liua_shihi:42.24119242):5.51400181,Salamandrella_keyserlingii:47.75519422):3.93857272,((((((Hynobius_nebulosus:10.26136019,Hynobius_dunni:10.26136019):4.680505127,Hynobius_tsuensis:14.94186532):8.821265868,Hynobius_leechii:23.76313119):1.916897941,Hynobius_naevius:25.68002913):2.236917639,Hynobius_stejnegeri:27.91694677):1.431822774,((Hynobius_nigrescens:19.24520975,Hynobius_lichenatus:19.24520975):3.490512535,Hynobius_abei:22.73572228):6.61304726):22.34499738):5.21860885,Pachyhynobius_shangchengensis:56.91237579):4.62782295,(Paradactylodon_mustersi:47.55826557,Ranodon_sibiricus:47.55826557):13.98193315):99.45980126):33,((Siren_lacertina:19.40020371,Siren_intermedia:19.40020371):54.59979629,Pseudobranchus_axanthus:74):160):13,((((((((Ambystoma_cingulatum:42.90378798,Ambystoma_annulatum:42.90378797):3.02515995,((Ambystoma_texanum:9.55326679,Ambystoma_barbouri:9.55326679):30.72836597,Ambystoma_opacum:40.28163277):5.64731515):5.32684515,(Ambystoma_laterale:36.15570323,Ambystoma_jeffersonianum:36.15570323):15.10008983):0.91882006,(((Ambystoma_ordinarium:15.86272809,Ambystoma_mavortium:15.8627281):12.35612986,Ambystoma_velasci:28.21885795):14.55108641,Ambystoma_californiense:42.76994437):9.40466874):5.77149223,Ambystoma_macrodactylum:57.94610534):1.47389465,(Ambystoma_maculatum:51.41116389,Ambystoma_gracile:51.41116389):8.0088361):58.58,((Dicamptodon_copei:15.88406289,Dicamptodon_tenebrosus:15.88406289):8.23254925,Dicamptodon_ensatus:24.11661214):93.88047591):45,((((((Notophthalmus_perstriatus:42.31406638,Notophthalmus_viridescens:42.31406638):17.64499771,Notophthalmus_meridionalis:59.9590641):13.16162268,((Taricha_granulosa:31.04321088,Taricha_torosa:31.04331389):4.42641615,Taricha_rivularis:35.46973006):37.6509567):9.0501799,((((Lissotriton_helveticus:28.87844877,Lissotriton_boscai:28.87844877):10.67357513,(Lissotriton_vulgaris:10.67357513,Lissotriton_montandoni:10.67357513):28.87834578):27.3994902,Ichthyosaura_alpestris:66.95151407):0.30869038,((((Neurergus_crocatus:25.96295208,Neurergus_strauchii:25.96295213):25.09466382,Ommatotriton_vittatus:51.05761589):0.14193371,((Triturus_pygmaeus:23.15548669,Triturus_cristatus:23.15558965):17.38272342,Calotriton_asper:40.53821007):10.6612365):1.00465999,((((Paramesotriton_chinensis:12.88723123,Paramesotriton_hongkongensis:12.88723128):6.08100485,Paramesotriton_caudopunctatus:18.96813311):8.32454635,Pachytriton_brevipes:27.29278242):6.8455723,(Cynops_pyrrhogaster:9.60586379,Cynops_ensicauda:9.60586379):24.53238793):18.06585487):15.05599489):14.91076518):6.66202668,((((Tylototriton_verrucosus:19.64350272,Tylototriton_kweichowensis:19.64350272):19.50558599,Tylototriton_asperrimus:39.14908871):14.98791203,Echinotriton_andersoni:54.13700075):23.93591614,Pleurodeles_waltl:78.07281387):10.76007948):14.16690066,(((Chioglossa_lusitanica:53.57235588,Mertensiella_caucasica:53.57235588):5.00887998,(Salamandra_atra:24.8437563,Salamandra_salamandra:24.84375631):33.73758253):5.68177763,Salamandrina_terdigitata:64.26301347):38.73678053):60):18):11,((((Necturus_alabamensis:70.9920748,Necturus_beyeri:70.99207481):4.15800956,Necturus_maculosus:75.15008437):9.35391177,Necturus_punctatus:84.50399613):61.49600386,Proteus_anguinus:146):24):18,(((Rhyacotriton_olympicus:1.76206061,Rhyacotriton_kezeri:1.76206061):5.75697501,Rhyacotriton_cascadae:7.51903561):1.14096439,Rhyacotriton_variegatus:8.66):143.34):12,((Amphiuma_pholeter:2.74051282,Amphiuma_means:2.74051282):3.93948718,Amphiuma_tridactylum:6.68):133.32):31):22.97557777):11.13047042,(((Plethodon_vandykei:11.45205704,Plethodon_idahoensis:11.45205704):41.89559088,Plethodon_neomexicanus:53.329782):1.05408949,((Plethodon_vehiculum:30.83658416,Plethodon_dunni:30.83658416):12.38108507,Plethodon_elongatus:43.1998033):11.18406818):20.47434846):26.45943287):7.03917391):13.50663825,Plethodon_yonahlossee:27.85297492):1.94738567,Plethodon_kentucki:25.92345517):1.12555319,(Plethodon_metcalfi:16.65104081,Plethodon_jordani:16.65104081):8.14686117):0.73250287); diff --git a/examples/caudata_shared_paths.txt b/examples/caudata_shared_paths.txt index 572c5c53f..61098cceb 100644 --- a/examples/caudata_shared_paths.txt +++ b/examples/caudata_shared_paths.txt @@ -1,394 +1,394 @@ -"V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","V11","V12","V13","V14","V15","V16","V17","V18","V19","V20","V21","V22","V23","V24","V25","V26","V27","V28","V29","V30","V31","V32","V33","V34","V35","V36","V37","V38","V39","V40","V41","V42","V43","V44","V45","V46","V47","V48","V49","V50","V51","V52","V53","V54","V55","V56","V57","V58","V59","V60","V61","V62","V63","V64","V65","V66","V67","V68","V69","V70","V71","V72","V73","V74","V75","V76","V77","V78","V79","V80","V81","V82","V83","V84","V85","V86","V87","V88","V89","V90","V91","V92","V93","V94","V95","V96","V97","V98","V99","V100","V101","V102","V103","V104","V105","V106","V107","V108","V109","V110","V111","V112","V113","V114","V115","V116","V117","V118","V119","V120","V121","V122","V123","V124","V125","V126","V127","V128","V129","V130","V131","V132","V133","V134","V135","V136","V137","V138","V139","V140","V141","V142","V143","V144","V145","V146","V147","V148","V149","V150","V151","V152","V153","V154","V155","V156","V157","V158","V159","V160","V161","V162","V163","V164","V165","V166","V167","V168","V169","V170","V171","V172","V173","V174","V175","V176","V177","V178","V179","V180","V181","V182","V183","V184","V185","V186","V187","V188","V189","V190","V191","V192","V193","V194","V195","V196","V197","V198","V199","V200","V201","V202","V203","V204","V205","V206","V207","V208","V209","V210","V211","V212","V213","V214","V215","V216","V217","V218","V219","V220","V221","V222","V223","V224","V225","V226","V227","V228","V229","V230","V231","V232","V233","V234","V235","V236","V237","V238","V239","V240","V241","V242","V243","V244","V245","V246","V247","V248","V249","V250","V251","V252","V253","V254","V255","V256","V257","V258","V259","V260","V261","V262","V263","V264","V265","V266","V267","V268","V269","V270","V271","V272","V273","V274","V275","V276","V277","V278","V279","V280","V281","V282","V283","V284","V285","V286","V287","V288","V289","V290","V291","V292","V293","V294","V295","V296","V297","V298","V299","V300","V301","V302","V303","V304","V305","V306","V307","V308","V309","V310","V311","V312","V313","V314","V315","V316","V317","V318","V319","V320","V321","V322","V323","V324","V325","V326","V327","V328","V329","V330","V331","V332","V333","V334","V335","V336","V337","V338","V339","V340","V341","V342","V343","V344","V345","V346","V347","V348","V349","V350","V351","V352","V353","V354","V355","V356","V357","V358","V359","V360","V361","V362","V363","V364","V365","V366","V367","V368","V369","V370","V371","V372","V373","V374","V375","V376","V377","V378","V379","V380","V381","V382","V383","V384","V385","V386","V387","V388","V389","V390","V391","V392","V393" -213.99708805,198.11302516,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,198.11302516,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -198.11302516,213.99708805,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,198.11302516,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -189.88047591,189.88047591,213.99708805,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,214,204.44673321,173.71836724,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,204.44673321,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,204.44673321,214,173.71836724,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,204.44673321,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,173.71836724,173.71836724,214.00000001,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,173.71836724,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,168.07105209,168.07105209,168.07105209,214.00000002,171.09621204,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,168.07105209,168.07105209,171.09621204,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,168.07105209,168.07105209,168.07105209,171.09621204,214.00000001,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,168.07105209,168.07105209,171.09621204,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,214,177.84429677,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,214,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,213.99999998,198.13727189,185.78114203,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,198.13727189,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,198.13727189,213.99999999,185.78114203,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,198.13727189,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,185.78114203,185.78114203,213.99999998,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,185.78114203,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,171.23005562,171.23005562,213.99999999,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,171.23005562,171.23005562,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,213.99999999,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,213.99999999,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,213.99999999,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,213.999794,149.73678053,149.73678053,149.73678053,149.73678053,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,149.73678053,149.73678053,149.73678053,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,213.99989699,189.15614069,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,189.15614069,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,189.15614069,213.999897,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,189.15614069,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,155.41855816,155.41855816,213.99979402,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,155.41855816,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,155.41855816,155.41855816,160.42743814,213.99979402,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,155.41855816,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,213.99969097,182.95648009,178.53006394,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,182.95648009,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,182.95648009,213.99979398,178.53006394,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,182.95648009,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,178.53006394,178.53006394,213.999794,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,178.53006394,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,213.99979402,154.04072992,154.04072992,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,154.04072992,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,154.04072992,213.99979401,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,213.99979401,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,213.99989697,147.0483829,147.0483829,147.0483829,147.0483829,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,147.0483829,147.0483829,147.0483829,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,213.99979401,203.32621888,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,203.32621888,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,203.32621888,213.99979401,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,203.32621888,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,174.4478731,174.4478731,213.999897,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,174.4478731,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,174.4478731,174.4478731,185.12144823,213.999897,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,174.4478731,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,213.99979401,190.84430732,173.4615839,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,190.84430732,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,190.84430732,213.99989697,173.4615839,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,190.84430732,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,173.4615839,173.4615839,213.99979397,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,173.4615839,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,213.999897,162.94228111,162.94228111,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,162.94228111,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.94228111,213.99989701,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,213.99989706,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,213.999794,204.39393021,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,204.39393021,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,204.39393021,213.999794,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,204.39393021,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,213.99979404,195.03166093,195.03166093,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,195.03166093,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,195.03166093,213.99989701,201.11266578,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,201.11266578,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,195.03166093,201.11266578,213.99989706,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,201.11266578,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,186.70711458,186.70711458,213.999897,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,186.70711458,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,213.99989703,159.86289628,159.86289628,159.86289628,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,159.86289628,159.86289628,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,213.99989702,194.3563943,174.85080831,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,194.3563943,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,194.3563943,213.99989702,174.85080831,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,194.3563943,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,174.85080831,174.85080831,213.99989702,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,174.85080831,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,135.92698014,135.92698014,135.92698014,213.99979401,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,135.92698014,135.92698014,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,213.98213407,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,213.98213409,200.76135061,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,200.76135061,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,200.76135061,213.98213408,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,200.76135061,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,184.93214228,184.93214228,213.96426815,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,213.98213407,183.44927061,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,183.44927061,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,183.44927061,213.96426814,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,183.44927061,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,181.25176201,181.25176201,213.96426815,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,181.25176201,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,181.25176201,181.25176201,199.38567448,213.96426815,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,181.25176201,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,213.98213407,192.68595312,192.68595312,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,192.68595312,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,192.68595312,213.99999999,204.04868053,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,204.04868053,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,192.68595312,204.04868053,213.99999999,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,204.04868053,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,213.98213407,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,213.98213407,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,213.96426815,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,213.96426814,185.25372889,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,185.25372889,177.96443206,177.96443206,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,185.25372889,213.99999998,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,185.25372889,177.96443206,177.96443206,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,213.96426816,203.78069169,194.40108179,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,203.78069169,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,203.78069169,213.98213407,194.40108179,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,203.78069169,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,194.40108179,194.40108179,213.96426816,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,194.40108179,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,213.98213408,174.67710212,174.67710212,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,174.67710212,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,213.98213408,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,213.98213408,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,213.96426815,200.51122766,194.57974102,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,200.51122766,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,200.51122766,213.96426815,194.57974102,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,200.51122766,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,194.57974102,194.57974102,213.96426814,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,194.57974102,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,188.23733814,188.23733814,188.23733814,213.96426814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,188.23733814,188.23733814,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,184.28896902,184.28896902,184.28896902,213.96426815,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,184.28896902,184.28896902,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,213.96426815,167.11981642,167.11981642,167.11981642,167.11981642,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,167.11981642,167.11981642,167.11981642,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,213.96426816,204.74545157,181.84133749,181.84133749,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,204.74545157,181.84133749,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,204.74545157,213.96426816,181.84133749,181.84133749,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,204.74545157,181.84133749,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,181.84133749,181.84133749,213.94640223,189.38075726,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,181.84133749,189.38075726,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,181.84133749,181.84133749,189.38075726,213.94640224,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,181.84133749,189.38075726,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,213.96426814,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,213.98213407,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,213.96426815,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,213.96426815,148.70004917,148.70004917,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,148.70004917,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,213.96426814,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,213.96426814,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,213.98213407,176.98180625,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,176.98180625,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,176.98180625,213.98213407,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,176.98180625,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,172.31880019,172.31880019,213.98213406,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,172.31880019,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,172.31880019,172.31880019,176.51729224,213.98213406,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,172.31880019,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,213.98213408,177.28552697,177.28552697,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,177.28552697,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,177.28552697,214.00000001,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,177.28552697,188.45172923,214.00000001,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,213.98213407,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,213.98213407,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,197.08097033,213.98213407,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,214,195.13358466,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,195.13358466,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,195.13358466,214,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,195.13358466,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,214,203.61989838,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,203.61989838,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,203.61989838,214,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,203.61989838,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,200.22537289,214,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,213.98213408,203.08392067,203.08392067,203.08392067,203.08392067,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,203.08392067,203.08392067,203.08392067,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,213.98213408,210.8198656,210.8198656,210.8198656,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,210.8198656,210.8198656,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,213.98213408,211.26651369,211.26651369,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,211.26651369,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,213.98213408,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,213.98213408,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,213.96426813,170.76446483,170.76446483,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,170.76446483,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,170.76446483,213.98213406,183.1455499,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,183.1455499,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,170.76446483,183.1455499,213.98213406,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,183.1455499,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,213.96426814,160.63448614,160.63448614,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,160.63448614,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,160.63448614,213.98213406,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,213.98213406,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,213.96426814,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,213.94640223,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,213.94640223,201.20799869,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,201.20799869,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,201.20799869,213.94640223,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,201.20799869,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,213.96426814,200.58269136,200.58269136,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,200.58269136,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,213.94640222,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,213.94640222,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,213.96426814,205.20996557,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,205.20996557,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,205.20996557,213.96426814,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,205.20996557,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,213.98213406,185.7182429,185.7182429,185.7182429,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,185.7182429,185.7182429,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,213.98213406,195.22291427,195.22291427,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,195.22291427,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,195.22291427,213.98213407,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,213.98213407,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,213.96426814,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,213.98213406,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,213.98213406,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,197.33109325,213.98213406,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,213.96426814,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,195.27651204,213.96426814,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,213.96426815,204.69185379,204.69185379,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,204.69185379,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,204.69185379,213.96426815,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,204.69185379,209.56925094,213.96426815,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,213.96426814,205.04917226,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,205.04917226,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,205.04917226,213.96426814,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,205.04917226,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,213.96426815,205.81740698,205.81740698,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,205.81740698,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,213.94640223,210.10522865,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,213.94640223,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,213.96426814,197.56335026,197.56335026,197.56335026,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,197.56335026,197.56335026,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,213.96426814,203.20898212,203.20898212,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,203.20898212,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,213.96426814,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,213.96426814,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,213.98213406,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,175.82052121,213.98213406,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,213.98213407,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,213.98213407,159.75905589,159.75905589,159.75905589,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,159.75905589,159.75905589,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,213.98213407,175.62399607,175.62399607,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,175.62399607,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,175.62399607,213.98213408,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,175.62399607,184.11030979,213.98213408,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,213.98213406,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,213.96426815,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,213.98213408,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,213.96426815,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,185.02147189,213.96426815,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,213.96426815,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,213.96426815,195.5445009,195.5445009,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,195.5445009,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,195.5445009,213.96426815,198.29585314,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,198.29585314,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,195.5445009,198.29585314,213.96426815,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,198.29585314,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,213.96426815,193.81150631,193.81150631,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,193.81150631,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,213.94640223,196.223406,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,213.94640223,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,214,211.25948718,207.32,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,211.25948718,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,211.25948718,214,207.32,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,211.25948718,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,207.32,214,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,207.32,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,214.00000001,212.2379394,206.48096439,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,212.2379394,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,212.2379394,214.00000001,206.48096439,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,212.2379394,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,206.48096439,206.48096439,214,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,206.48096439,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,205.34,205.34,214,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,205.34,205.34,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,214,68,68,68,68,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,68,68,68,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,213.99999999,143.00792519,138.84991563,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,143.00792519,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,143.00792519,214,138.84991563,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,143.00792519,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,138.84991563,138.84991563,214,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,138.84991563,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,129.49600386,129.49600386,213.99999999,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,129.49600386,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,214,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,148,214,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,214,190.07317073,171.75880759,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,190.07317073,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,190.07317073,213.99999999,171.75880759,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,190.07317073,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,171.75880759,171.75880759,214.00000001,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,171.75880759,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,166.24480578,166.24480578,166.24480578,214,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,166.24480578,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,213.999999979,203.738639789,199.058134662,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,203.738639789,184.65123044,184.65123044,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,203.738639789,213.999999979,199.058134662,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,203.738639789,184.65123044,184.65123044,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,199.058134662,199.058134662,213.999999982,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,199.058134662,184.65123044,184.65123044,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,190.236868794,190.236868794,190.236868794,213.999999984,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,190.236868794,190.236868794,184.65123044,184.65123044,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,188.319970853,188.319970853,188.319970853,188.319970853,213.999999983,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,188.319970853,188.319970853,188.319970853,184.65123044,184.65123044,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,213.999999984,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,184.65123044,184.65123044,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,213.999999985,194.754790235,191.2642777,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,194.754790235,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,194.754790235,213.999999985,191.2642777,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,194.754790235,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,191.2642777,213.99999998,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,191.2642777,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,214,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,213.99999998,166.44173441,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,213.99999998,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,0,0 -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,214,140,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,140 -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,214,194.59979629,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629 -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629 -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -189.88047591,189.88047591,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -198.11302516,198.11302516,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,198.11302516,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,168.07105209,168.07105209,168.07105209,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,168.07105209,168.07105209,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,173.71836724,173.71836724,173.71836724,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,173.71836724,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,204.44673321,204.44673321,173.71836724,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,204.44673321,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,168.07105209,168.07105209,168.07105209,171.09621204,171.09621204,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,168.07105209,168.07105209,171.09621204,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,177.84429677,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,171.23005562,171.23005562,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,171.23005562,171.23005562,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,185.78114203,185.78114203,185.78114203,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,185.78114203,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,198.13727189,198.13727189,185.78114203,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,198.13727189,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,149.73678053,149.73678053,149.73678053,149.73678053,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,149.73678053,149.73678053,149.73678053,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,155.41855816,155.41855816,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,189.15614069,189.15614069,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,189.15614069,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,155.41855816,155.41855816,160.42743814,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,155.41855816,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,178.53006394,178.53006394,178.53006394,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,178.53006394,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,182.95648009,182.95648009,178.53006394,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,182.95648009,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,154.04072992,154.04072992,154.04072992,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,154.04072992,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,147.0483829,147.0483829,147.0483829,147.0483829,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,147.0483829,147.0483829,147.0483829,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,174.4478731,174.4478731,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,203.32621888,203.32621888,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,203.32621888,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,174.4478731,174.4478731,185.12144823,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,174.4478731,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,173.4615839,173.4615839,173.4615839,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,173.4615839,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,190.84430732,190.84430732,173.4615839,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,190.84430732,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.94228111,162.94228111,162.94228111,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,162.94228111,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,204.39393021,204.39393021,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,204.39393021,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,186.70711458,186.70711458,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,186.70711458,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,195.03166093,195.03166093,195.03166093,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,195.03166093,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,195.03166093,201.11266578,201.11266578,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,201.11266578,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,135.92698014,135.92698014,135.92698014,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,135.92698014,135.92698014,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,159.86289628,159.86289628,159.86289628,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,159.86289628,159.86289628,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,174.85080831,174.85080831,174.85080831,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,174.85080831,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,194.3563943,194.3563943,174.85080831,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,194.3563943,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,184.93214228,184.93214228,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,200.76135061,200.76135061,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,200.76135061,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,181.25176201,181.25176201,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,183.44927061,183.44927061,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,183.44927061,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,181.25176201,181.25176201,199.38567448,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,181.25176201,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,192.68595312,192.68595312,192.68595312,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,192.68595312,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,192.68595312,204.04868053,204.04868053,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,204.04868053,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,185.25372889,185.25372889,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,185.25372889,177.96443206,177.96443206,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,194.40108179,194.40108179,194.40108179,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,194.40108179,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,203.78069169,203.78069169,194.40108179,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,203.78069169,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,174.67710212,174.67710212,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,174.67710212,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,184.28896902,184.28896902,184.28896902,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,184.28896902,184.28896902,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,188.23733814,188.23733814,188.23733814,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,188.23733814,188.23733814,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,194.57974102,194.57974102,194.57974102,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,194.57974102,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,200.51122766,200.51122766,194.57974102,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,200.51122766,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,167.11981642,167.11981642,167.11981642,167.11981642,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,167.11981642,167.11981642,167.11981642,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,181.84133749,181.84133749,181.84133749,181.84133749,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,181.84133749,181.84133749,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,204.74545157,204.74545157,181.84133749,181.84133749,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,204.74545157,181.84133749,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,181.84133749,181.84133749,189.38075726,189.38075726,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,181.84133749,189.38075726,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,148.70004917,148.70004917,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,148.70004917,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,172.31880019,172.31880019,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,176.98180625,176.98180625,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,176.98180625,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,172.31880019,172.31880019,176.51729224,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,172.31880019,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,177.28552697,177.28552697,177.28552697,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,177.28552697,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,177.28552697,188.45172923,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,197.08097033,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,195.13358466,195.13358466,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,195.13358466,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,200.22537289,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,203.61989838,203.61989838,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,203.61989838,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,203.08392067,203.08392067,203.08392067,203.08392067,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,203.08392067,203.08392067,203.08392067,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,210.8198656,210.8198656,210.8198656,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,210.8198656,210.8198656,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,211.26651369,211.26651369,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,211.26651369,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,170.76446483,170.76446483,170.76446483,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,170.76446483,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,170.76446483,183.1455499,183.1455499,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,183.1455499,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,160.63448614,160.63448614,160.63448614,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,160.63448614,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,201.20799869,201.20799869,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,201.20799869,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,200.58269136,200.58269136,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,200.58269136,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,205.20996557,205.20996557,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,205.20996557,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,185.7182429,185.7182429,185.7182429,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,185.7182429,185.7182429,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,195.22291427,195.22291427,195.22291427,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,195.22291427,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,197.33109325,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,195.27651204,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,204.69185379,204.69185379,204.69185379,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,204.69185379,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,204.69185379,209.56925094,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,205.04917226,205.04917226,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,205.04917226,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,205.81740698,205.81740698,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,205.81740698,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,210.10522865,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,197.56335026,197.56335026,197.56335026,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,197.56335026,197.56335026,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,203.20898212,203.20898212,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,203.20898212,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,175.82052121,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,159.75905589,159.75905589,159.75905589,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,159.75905589,159.75905589,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,175.62399607,175.62399607,175.62399607,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,175.62399607,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,175.62399607,184.11030979,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,185.02147189,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,195.5445009,195.5445009,195.5445009,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,195.5445009,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,195.5445009,198.29585314,198.29585314,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,198.29585314,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,193.81150631,193.81150631,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,193.81150631,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,196.223406,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,207.32,207.32,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,207.32,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,211.25948718,211.25948718,207.32,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,211.25948718,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,205.34,205.34,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,205.34,205.34,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,206.48096439,206.48096439,206.48096439,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,206.48096439,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,212.2379394,212.2379394,206.48096439,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,212.2379394,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,68,68,68,68,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,68,68,68,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,129.49600386,129.49600386,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,129.49600386,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,138.84991563,138.84991563,138.84991563,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,138.84991563,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,143.00792519,143.00792519,138.84991563,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,143.00792519,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,148,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,166.24480578,166.24480578,166.24480578,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,166.24480578,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,171.75880759,171.75880759,171.75880759,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,171.75880759,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,190.07317073,190.07317073,171.75880759,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,190.07317073,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,184.65123044,184.65123044,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,188.319970853,188.319970853,188.319970853,188.319970853,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,188.319970853,188.319970853,188.319970853,184.65123044,184.65123044,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,190.236868794,190.236868794,190.236868794,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,190.236868794,190.236868794,184.65123044,184.65123044,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,199.058134662,199.058134662,199.058134662,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,199.058134662,184.65123044,184.65123044,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,203.738639789,203.738639789,199.058134662,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,203.738639789,184.65123044,184.65123044,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,191.2642777,191.2642777,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,191.2642777,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,194.754790235,194.754790235,191.2642777,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,194.754790235,152.45980126,0,0 -20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,166.44173441,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,0,0 -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,140,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,140 -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629,194.59979629,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629 +"V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","V11","V12","V13","V14","V15","V16","V17","V18","V19","V20","V21","V22","V23","V24","V25","V26","V27","V28","V29","V30","V31","V32","V33","V34","V35","V36","V37","V38","V39","V40","V41","V42","V43","V44","V45","V46","V47","V48","V49","V50","V51","V52","V53","V54","V55","V56","V57","V58","V59","V60","V61","V62","V63","V64","V65","V66","V67","V68","V69","V70","V71","V72","V73","V74","V75","V76","V77","V78","V79","V80","V81","V82","V83","V84","V85","V86","V87","V88","V89","V90","V91","V92","V93","V94","V95","V96","V97","V98","V99","V100","V101","V102","V103","V104","V105","V106","V107","V108","V109","V110","V111","V112","V113","V114","V115","V116","V117","V118","V119","V120","V121","V122","V123","V124","V125","V126","V127","V128","V129","V130","V131","V132","V133","V134","V135","V136","V137","V138","V139","V140","V141","V142","V143","V144","V145","V146","V147","V148","V149","V150","V151","V152","V153","V154","V155","V156","V157","V158","V159","V160","V161","V162","V163","V164","V165","V166","V167","V168","V169","V170","V171","V172","V173","V174","V175","V176","V177","V178","V179","V180","V181","V182","V183","V184","V185","V186","V187","V188","V189","V190","V191","V192","V193","V194","V195","V196","V197","V198","V199","V200","V201","V202","V203","V204","V205","V206","V207","V208","V209","V210","V211","V212","V213","V214","V215","V216","V217","V218","V219","V220","V221","V222","V223","V224","V225","V226","V227","V228","V229","V230","V231","V232","V233","V234","V235","V236","V237","V238","V239","V240","V241","V242","V243","V244","V245","V246","V247","V248","V249","V250","V251","V252","V253","V254","V255","V256","V257","V258","V259","V260","V261","V262","V263","V264","V265","V266","V267","V268","V269","V270","V271","V272","V273","V274","V275","V276","V277","V278","V279","V280","V281","V282","V283","V284","V285","V286","V287","V288","V289","V290","V291","V292","V293","V294","V295","V296","V297","V298","V299","V300","V301","V302","V303","V304","V305","V306","V307","V308","V309","V310","V311","V312","V313","V314","V315","V316","V317","V318","V319","V320","V321","V322","V323","V324","V325","V326","V327","V328","V329","V330","V331","V332","V333","V334","V335","V336","V337","V338","V339","V340","V341","V342","V343","V344","V345","V346","V347","V348","V349","V350","V351","V352","V353","V354","V355","V356","V357","V358","V359","V360","V361","V362","V363","V364","V365","V366","V367","V368","V369","V370","V371","V372","V373","V374","V375","V376","V377","V378","V379","V380","V381","V382","V383","V384","V385","V386","V387","V388","V389","V390","V391","V392","V393" +213.99708805,198.11302516,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,198.11302516,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +198.11302516,213.99708805,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,198.11302516,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +189.88047591,189.88047591,213.99708805,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,214,204.44673321,173.71836724,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,204.44673321,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,204.44673321,214,173.71836724,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,204.44673321,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,173.71836724,173.71836724,214.00000001,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,173.71836724,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,168.07105209,168.07105209,168.07105209,214.00000002,171.09621204,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,168.07105209,168.07105209,171.09621204,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,168.07105209,168.07105209,168.07105209,171.09621204,214.00000001,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,168.07105209,168.07105209,171.09621204,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,214,177.84429677,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,214,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,213.99999998,198.13727189,185.78114203,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,198.13727189,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,198.13727189,213.99999999,185.78114203,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,198.13727189,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,185.78114203,185.78114203,213.99999998,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,185.78114203,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,171.23005562,171.23005562,213.99999999,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,171.23005562,171.23005562,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,213.99999999,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,213.99999999,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,213.99999999,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,213.999794,149.73678053,149.73678053,149.73678053,149.73678053,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,149.73678053,149.73678053,149.73678053,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,213.99989699,189.15614069,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,189.15614069,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,189.15614069,213.999897,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,189.15614069,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,155.41855816,155.41855816,213.99979402,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,155.41855816,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,155.41855816,155.41855816,160.42743814,213.99979402,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,155.41855816,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,213.99969097,182.95648009,178.53006394,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,182.95648009,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,182.95648009,213.99979398,178.53006394,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,182.95648009,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,178.53006394,178.53006394,213.999794,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,178.53006394,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,213.99979402,154.04072992,154.04072992,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,154.04072992,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,154.04072992,213.99979401,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,213.99979401,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,213.99989697,147.0483829,147.0483829,147.0483829,147.0483829,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,147.0483829,147.0483829,147.0483829,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,213.99979401,203.32621888,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,203.32621888,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,203.32621888,213.99979401,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,203.32621888,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,174.4478731,174.4478731,213.999897,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,174.4478731,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,174.4478731,174.4478731,185.12144823,213.999897,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,174.4478731,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,213.99979401,190.84430732,173.4615839,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,190.84430732,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,190.84430732,213.99989697,173.4615839,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,190.84430732,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,173.4615839,173.4615839,213.99979397,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,173.4615839,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,213.999897,162.94228111,162.94228111,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,162.94228111,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.94228111,213.99989701,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,213.99989706,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,213.999794,204.39393021,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,204.39393021,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,204.39393021,213.999794,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,204.39393021,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,213.99979404,195.03166093,195.03166093,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,195.03166093,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,195.03166093,213.99989701,201.11266578,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,201.11266578,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,195.03166093,201.11266578,213.99989706,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,201.11266578,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,186.70711458,186.70711458,213.999897,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,186.70711458,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,213.99989703,159.86289628,159.86289628,159.86289628,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,159.86289628,159.86289628,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,213.99989702,194.3563943,174.85080831,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,194.3563943,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,194.3563943,213.99989702,174.85080831,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,194.3563943,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,174.85080831,174.85080831,213.99989702,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,174.85080831,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,135.92698014,135.92698014,135.92698014,213.99979401,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,135.92698014,135.92698014,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,213.98213407,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,213.98213409,200.76135061,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,200.76135061,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,200.76135061,213.98213408,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,200.76135061,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,184.93214228,184.93214228,213.96426815,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,213.98213407,183.44927061,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,183.44927061,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,183.44927061,213.96426814,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,183.44927061,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,181.25176201,181.25176201,213.96426815,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,181.25176201,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,181.25176201,181.25176201,199.38567448,213.96426815,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,181.25176201,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,213.98213407,192.68595312,192.68595312,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,192.68595312,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,192.68595312,213.99999999,204.04868053,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,204.04868053,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,192.68595312,204.04868053,213.99999999,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,204.04868053,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,213.98213407,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,213.98213407,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,213.96426815,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,213.96426814,185.25372889,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,185.25372889,177.96443206,177.96443206,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,185.25372889,213.99999998,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,185.25372889,177.96443206,177.96443206,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,213.96426816,203.78069169,194.40108179,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,203.78069169,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,203.78069169,213.98213407,194.40108179,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,203.78069169,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,194.40108179,194.40108179,213.96426816,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,194.40108179,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,213.98213408,174.67710212,174.67710212,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,174.67710212,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,213.98213408,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,213.98213408,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,213.96426815,200.51122766,194.57974102,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,200.51122766,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,200.51122766,213.96426815,194.57974102,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,200.51122766,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,194.57974102,194.57974102,213.96426814,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,194.57974102,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,188.23733814,188.23733814,188.23733814,213.96426814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,188.23733814,188.23733814,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,184.28896902,184.28896902,184.28896902,213.96426815,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,184.28896902,184.28896902,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,213.96426815,167.11981642,167.11981642,167.11981642,167.11981642,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,167.11981642,167.11981642,167.11981642,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,213.96426816,204.74545157,181.84133749,181.84133749,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,204.74545157,181.84133749,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,204.74545157,213.96426816,181.84133749,181.84133749,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,204.74545157,181.84133749,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,181.84133749,181.84133749,213.94640223,189.38075726,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,181.84133749,189.38075726,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,181.84133749,181.84133749,189.38075726,213.94640224,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,181.84133749,189.38075726,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,213.96426814,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,213.98213407,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,213.96426815,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,213.96426815,148.70004917,148.70004917,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,148.70004917,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,213.96426814,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,213.96426814,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,213.98213407,176.98180625,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,176.98180625,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,176.98180625,213.98213407,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,176.98180625,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,172.31880019,172.31880019,213.98213406,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,172.31880019,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,172.31880019,172.31880019,176.51729224,213.98213406,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,172.31880019,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,213.98213408,177.28552697,177.28552697,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,177.28552697,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,177.28552697,214.00000001,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,177.28552697,188.45172923,214.00000001,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,213.98213407,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,213.98213407,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,197.08097033,213.98213407,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,214,195.13358466,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,195.13358466,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,195.13358466,214,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,195.13358466,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,214,203.61989838,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,203.61989838,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,203.61989838,214,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,203.61989838,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,200.22537289,214,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,213.98213408,203.08392067,203.08392067,203.08392067,203.08392067,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,203.08392067,203.08392067,203.08392067,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,213.98213408,210.8198656,210.8198656,210.8198656,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,210.8198656,210.8198656,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,213.98213408,211.26651369,211.26651369,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,211.26651369,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,213.98213408,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,213.98213408,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,213.96426813,170.76446483,170.76446483,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,170.76446483,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,170.76446483,213.98213406,183.1455499,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,183.1455499,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,170.76446483,183.1455499,213.98213406,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,183.1455499,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,213.96426814,160.63448614,160.63448614,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,160.63448614,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,160.63448614,213.98213406,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,213.98213406,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,213.96426814,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,213.94640223,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,213.94640223,201.20799869,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,201.20799869,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,201.20799869,213.94640223,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,201.20799869,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,213.96426814,200.58269136,200.58269136,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,200.58269136,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,213.94640222,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,213.94640222,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,213.96426814,205.20996557,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,205.20996557,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,205.20996557,213.96426814,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,205.20996557,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,213.98213406,185.7182429,185.7182429,185.7182429,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,185.7182429,185.7182429,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,213.98213406,195.22291427,195.22291427,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,195.22291427,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,195.22291427,213.98213407,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,213.98213407,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,213.96426814,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,213.98213406,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,213.98213406,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,197.33109325,213.98213406,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,213.96426814,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,195.27651204,213.96426814,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,213.96426815,204.69185379,204.69185379,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,204.69185379,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,204.69185379,213.96426815,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,204.69185379,209.56925094,213.96426815,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,213.96426814,205.04917226,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,205.04917226,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,205.04917226,213.96426814,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,205.04917226,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,213.96426815,205.81740698,205.81740698,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,205.81740698,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,213.94640223,210.10522865,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,213.94640223,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,213.96426814,197.56335026,197.56335026,197.56335026,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,197.56335026,197.56335026,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,213.96426814,203.20898212,203.20898212,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,203.20898212,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,213.96426814,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,213.96426814,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,213.98213406,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,175.82052121,213.98213406,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,213.98213407,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,213.98213407,159.75905589,159.75905589,159.75905589,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,159.75905589,159.75905589,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,213.98213407,175.62399607,175.62399607,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,175.62399607,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,175.62399607,213.98213408,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,175.62399607,184.11030979,213.98213408,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,213.98213406,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,213.96426815,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,213.98213408,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,213.96426815,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,185.02147189,213.96426815,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,213.96426815,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,213.96426815,195.5445009,195.5445009,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,195.5445009,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,195.5445009,213.96426815,198.29585314,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,198.29585314,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,195.5445009,198.29585314,213.96426815,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,198.29585314,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,213.96426815,193.81150631,193.81150631,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,193.81150631,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,213.94640223,196.223406,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,213.94640223,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,214,211.25948718,207.32,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,211.25948718,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,211.25948718,214,207.32,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,211.25948718,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,207.32,214,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,207.32,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,214.00000001,212.2379394,206.48096439,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,212.2379394,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,212.2379394,214.00000001,206.48096439,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,212.2379394,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,206.48096439,206.48096439,214,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,206.48096439,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,205.34,205.34,214,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,205.34,205.34,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,214,68,68,68,68,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,68,68,68,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,213.99999999,143.00792519,138.84991563,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,143.00792519,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,143.00792519,214,138.84991563,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,143.00792519,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,138.84991563,138.84991563,214,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,138.84991563,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,129.49600386,129.49600386,213.99999999,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,129.49600386,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,214,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,148,214,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,214,190.07317073,171.75880759,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,190.07317073,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,190.07317073,213.99999999,171.75880759,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,190.07317073,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,171.75880759,171.75880759,214.00000001,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,171.75880759,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,166.24480578,166.24480578,166.24480578,214,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,166.24480578,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,213.999999979,203.738639789,199.058134662,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,203.738639789,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,203.738639789,213.999999979,199.058134662,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,203.738639789,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,199.058134662,199.058134662,213.999999982,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,199.058134662,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,190.236868794,190.236868794,190.236868794,213.999999984,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,190.236868794,190.236868794,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,188.319970853,188.319970853,188.319970853,188.319970853,213.999999983,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,188.319970853,188.319970853,188.319970853,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,213.999999984,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,213.999999985,194.754790235,191.2642777,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,194.754790235,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,194.754790235,213.999999985,191.2642777,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,194.754790235,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,191.2642777,213.99999998,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,191.2642777,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,214,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,213.99999998,166.44173441,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,213.99999998,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,214,140,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,140 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,214,194.59979629,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +189.88047591,189.88047591,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +198.11302516,198.11302516,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,198.11302516,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,168.07105209,168.07105209,168.07105209,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,168.07105209,168.07105209,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,173.71836724,173.71836724,173.71836724,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,173.71836724,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,204.44673321,204.44673321,173.71836724,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,204.44673321,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,168.07105209,168.07105209,168.07105209,171.09621204,171.09621204,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,168.07105209,168.07105209,171.09621204,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,177.84429677,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,171.23005562,171.23005562,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,171.23005562,171.23005562,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,185.78114203,185.78114203,185.78114203,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,185.78114203,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,198.13727189,198.13727189,185.78114203,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,198.13727189,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,149.73678053,149.73678053,149.73678053,149.73678053,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,149.73678053,149.73678053,149.73678053,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,155.41855816,155.41855816,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,189.15614069,189.15614069,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,189.15614069,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,155.41855816,155.41855816,160.42743814,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,155.41855816,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,178.53006394,178.53006394,178.53006394,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,178.53006394,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,182.95648009,182.95648009,178.53006394,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,182.95648009,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,154.04072992,154.04072992,154.04072992,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,154.04072992,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,147.0483829,147.0483829,147.0483829,147.0483829,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,147.0483829,147.0483829,147.0483829,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,174.4478731,174.4478731,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,203.32621888,203.32621888,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,203.32621888,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,174.4478731,174.4478731,185.12144823,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,174.4478731,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,173.4615839,173.4615839,173.4615839,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,173.4615839,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,190.84430732,190.84430732,173.4615839,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,190.84430732,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.94228111,162.94228111,162.94228111,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,162.94228111,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,204.39393021,204.39393021,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,204.39393021,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,186.70711458,186.70711458,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,186.70711458,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,195.03166093,195.03166093,195.03166093,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,195.03166093,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,195.03166093,201.11266578,201.11266578,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,201.11266578,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,135.92698014,135.92698014,135.92698014,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,135.92698014,135.92698014,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,159.86289628,159.86289628,159.86289628,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,159.86289628,159.86289628,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,174.85080831,174.85080831,174.85080831,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,174.85080831,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,194.3563943,194.3563943,174.85080831,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,194.3563943,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,184.93214228,184.93214228,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,200.76135061,200.76135061,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,200.76135061,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,181.25176201,181.25176201,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,183.44927061,183.44927061,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,183.44927061,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,181.25176201,181.25176201,199.38567448,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,181.25176201,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,192.68595312,192.68595312,192.68595312,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,192.68595312,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,192.68595312,204.04868053,204.04868053,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,204.04868053,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,185.25372889,185.25372889,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,185.25372889,177.96443206,177.96443206,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,194.40108179,194.40108179,194.40108179,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,194.40108179,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,203.78069169,203.78069169,194.40108179,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,203.78069169,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,174.67710212,174.67710212,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,174.67710212,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,184.28896902,184.28896902,184.28896902,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,184.28896902,184.28896902,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,188.23733814,188.23733814,188.23733814,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,188.23733814,188.23733814,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,194.57974102,194.57974102,194.57974102,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,194.57974102,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,200.51122766,200.51122766,194.57974102,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,200.51122766,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,167.11981642,167.11981642,167.11981642,167.11981642,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,167.11981642,167.11981642,167.11981642,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,181.84133749,181.84133749,181.84133749,181.84133749,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,181.84133749,181.84133749,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,204.74545157,204.74545157,181.84133749,181.84133749,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,204.74545157,181.84133749,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,181.84133749,181.84133749,189.38075726,189.38075726,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,181.84133749,189.38075726,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,148.70004917,148.70004917,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,148.70004917,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,172.31880019,172.31880019,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,176.98180625,176.98180625,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,176.98180625,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,172.31880019,172.31880019,176.51729224,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,172.31880019,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,177.28552697,177.28552697,177.28552697,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,177.28552697,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,177.28552697,188.45172923,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,197.08097033,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,195.13358466,195.13358466,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,195.13358466,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,200.22537289,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,203.61989838,203.61989838,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,203.61989838,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,203.08392067,203.08392067,203.08392067,203.08392067,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,203.08392067,203.08392067,203.08392067,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,210.8198656,210.8198656,210.8198656,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,210.8198656,210.8198656,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,211.26651369,211.26651369,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,211.26651369,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,170.76446483,170.76446483,170.76446483,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,170.76446483,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,170.76446483,183.1455499,183.1455499,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,183.1455499,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,160.63448614,160.63448614,160.63448614,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,160.63448614,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,201.20799869,201.20799869,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,201.20799869,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,200.58269136,200.58269136,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,200.58269136,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,205.20996557,205.20996557,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,205.20996557,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,185.7182429,185.7182429,185.7182429,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,185.7182429,185.7182429,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,195.22291427,195.22291427,195.22291427,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,195.22291427,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,197.33109325,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,195.27651204,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,204.69185379,204.69185379,204.69185379,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,204.69185379,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,204.69185379,209.56925094,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,205.04917226,205.04917226,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,205.04917226,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,205.81740698,205.81740698,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,205.81740698,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,210.10522865,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,197.56335026,197.56335026,197.56335026,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,197.56335026,197.56335026,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,203.20898212,203.20898212,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,203.20898212,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,175.82052121,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,159.75905589,159.75905589,159.75905589,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,159.75905589,159.75905589,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,175.62399607,175.62399607,175.62399607,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,175.62399607,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,175.62399607,184.11030979,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,185.02147189,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,195.5445009,195.5445009,195.5445009,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,195.5445009,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,195.5445009,198.29585314,198.29585314,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,198.29585314,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,193.81150631,193.81150631,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,193.81150631,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,196.223406,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,207.32,207.32,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,207.32,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,211.25948718,211.25948718,207.32,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,211.25948718,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,205.34,205.34,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,205.34,205.34,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,206.48096439,206.48096439,206.48096439,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,206.48096439,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,212.2379394,212.2379394,206.48096439,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,212.2379394,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,68,68,68,68,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,68,68,68,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,129.49600386,129.49600386,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,129.49600386,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,138.84991563,138.84991563,138.84991563,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,138.84991563,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,143.00792519,143.00792519,138.84991563,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,143.00792519,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,148,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,166.24480578,166.24480578,166.24480578,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,166.24480578,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,171.75880759,171.75880759,171.75880759,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,171.75880759,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,190.07317073,190.07317073,171.75880759,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,190.07317073,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,188.319970853,188.319970853,188.319970853,188.319970853,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,188.319970853,188.319970853,188.319970853,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,190.236868794,190.236868794,190.236868794,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,190.236868794,190.236868794,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,199.058134662,199.058134662,199.058134662,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,199.058134662,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,203.738639789,203.738639789,199.058134662,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,203.738639789,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,191.2642777,191.2642777,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,191.2642777,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,194.754790235,194.754790235,191.2642777,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,194.754790235,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,166.44173441,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,140,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,140 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629,194.59979629,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629 diff --git a/examples/caudata_trait.txt b/examples/caudata_trait.txt index 48965bca4..7a404eda1 100644 --- a/examples/caudata_trait.txt +++ b/examples/caudata_trait.txt @@ -1,198 +1,198 @@ -"tipNames","trait" -"Ambystoma_annulatum",4.44135041075727 -"Ambystoma_barbouri",4.3210617205896 -"Ambystoma_californiense",4.51961229762644 -"Ambystoma_cingulatum",3.98713047791495 -"Ambystoma_gracile",4.35502150652934 -"Ambystoma_jeffersonianum",4.40854684448328 -"Ambystoma_laterale",4.00551334851548 -"Ambystoma_macrodactylum",4.0943445622221 -"Ambystoma_maculatum",4.39911725446659 -"Ambystoma_mavortium",4.37682400470252 -"Ambystoma_opacum",4.47966365074837 -"Ambystoma_ordinarium",4.46791759256172 -"Ambystoma_texanum",4.43355115232727 -"Ambystoma_velasci",4.43698819274786 -"Amphiuma_means",6.22455842927536 -"Amphiuma_pholeter",5.24372917626363 -"Amphiuma_tridactylum",6.32051106692587 -"Andrias_davidianus",5.80211837537706 -"Aneides_aeneus",3.90841650983403 -"Aneides_flavipunctatus",4.17899203628239 -"Aneides_hardii",3.98898404656427 -"Aneides_lugubris",4.37332639712838 -"Batrachoseps_attenuatus",3.79773385902602 -"Batrachoseps_major",3.9759363311718 -"Batrachoseps_wrighti",3.79773385902602 -"Batrachuperus_pinchonii",4.65538790214871 -"Batrachuperus_yenyuanensis",4.42157782206069 -"Bolitoglossa_adspersa",3.98898404656427 -"Bolitoglossa_dofleini",4.63812128612778 -"Bolitoglossa_engelhardti",3.82319179172153 -"Bolitoglossa_mexicana",4.12552017969055 -"Bolitoglossa_morio",3.94893335944824 -"Bolitoglossa_occidentalis",3.55105313720653 -"Bolitoglossa_palmata",3.84801767545223 -"Bolitoglossa_platydactyla",4.37866473983298 -"Bolitoglossa_rostrata",3.80058852498184 -"Bolitoglossa_rufescens",3.60114053980593 -"Bolitoglossa_subpalmata",4.01241117945941 -"Bolitoglossa_yucatana",4.04129534113228 -"Bradytriton_silus",3.75185425327532 -"Calotriton_asper",4.05817319508393 -"Chioglossa_lusitanica",3.82537519870247 -"Chiropterotriton_chondrostega",3.18013499655177 -"Chiropterotriton_dimidiatus",3.22286784613774 -"Chiropterotriton_lavae",3.40119738166216 -"Chiropterotriton_multidentatus",3.38777436133001 -"Chiropterotriton_priscus",3.87057581551397 -"Cryptobranchus_alleganiensis",5.73172184334544 -"Cryptotriton_nasalis",3.38777436133001 -"Cynops_ensicauda",4.10791868224922 -"Cynops_pyrrhogaster",4.15543966158191 -"Desmognathus_aeneus",3.2557861788883 -"Desmognathus_auriculatus",4.01223026584517 -"Desmognathus_brimleyorum",4.32714797316389 -"Desmognathus_fuscus",4.02168425963766 -"Desmognathus_imitator",3.81286543389493 -"Desmognathus_marmoratus",4.2850337899827 -"Desmognathus_monticola",4.14938499397991 -"Desmognathus_ochrophaeus",3.70831436675254 -"Desmognathus_quadramaculatus",4.3391191336626 -"Desmognathus_welteri",4.19968007756742 -"Desmognathus_wrighti",3.37142522332849 -"Dicamptodon_copei",4.42184812886055 -"Dicamptodon_ensatus",4.68213122712422 -"Dicamptodon_tenebrosus",4.51743127168008 -"Echinotriton_andersoni",4.41279829334063 -"Ensatina_eschscholtzii",4.16666522380173 -"Eurycea_aquatica",3.58351893845611 -"Eurycea_bislineata",3.7536132686805 -"Eurycea_cirrigera",3.65970807681366 -"Eurycea_junaluska",3.77292184468871 -"Eurycea_longicauda",4.07889245766318 -"Eurycea_lucifuga",4.14128380814951 -"Eurycea_multiplicata",3.71332813451625 -"Eurycea_nana",3.25848107946056 -"Eurycea_neotenes",3.5548765217606 -"Eurycea_quadridigitata",3.40734511224839 -"Eurycea_rathbuni",3.99452422693989 -"Eurycea_sosorum",3.30688670219091 -"Eurycea_spelaea",3.92592591059714 -"Eurycea_tridentifera",3.62667154831465 -"Eurycea_tynerensis",3.50480636428118 -"Eurycea_wilderae",3.60086757679072 -"Gyrinophilus_porphyriticus",4.50468664740977 -"Hemidactylium_scutatum",3.69424006035603 -"Hydromantes_italicus",3.94931879017184 -"Hydromantes_platycephalus",3.96651119071222 -"Hynobius_abei",4.05644364442232 -"Hynobius_dunni",4.17438726989564 -"Hynobius_leechii",3.94449019556565 -"Hynobius_lichenatus",4.25773810913054 -"Hynobius_naevius",4.30541553230204 -"Hynobius_nebulosus",4.14472076954717 -"Hynobius_nigrescens",4.20841701848195 -"Hynobius_stejnegeri",4.11414718951828 -"Hynobius_tsuensis",4.16666522380173 -"Lissotriton_boscai",3.41772668361337 -"Lissotriton_helveticus",3.6988297849671 -"Lissotriton_montandoni",3.79098467705109 -"Lissotriton_vulgaris",3.70480201465775 -"Liua_shihi",4.31079912538551 -"Mertensiella_caucasica",4.30271282795416 -"Ichthyosaura_alpestris",3.85142338329922 -"Necturus_alabamensis",4.88225252927326 -"Necturus_beyeri",4.92667380691538 -"Necturus_maculosus",5.22666292049755 -"Necturus_punctatus",4.83707524297087 -"Neurergus_crocatus",4.32057002622753 -"Neurergus_strauchii",4.30811095172371 -"Notophthalmus_meridionalis",3.79323946943818 -"Notophthalmus_perstriatus",3.76699723337789 -"Notophthalmus_viridescens",3.99231183665695 -"Nototriton_picadoi",3.27336401015227 -"Nyctanolis_pernix",3.68637632389582 -"Oedipina_complex",3.44680789291421 -"Oedipina_cyclocauda",3.89792408104864 -"Oedipina_parvipes",3.68260984110034 -"Oedipina_uniformis",3.90801498403061 -"Ommatotriton_vittatus",3.89182029811063 -"Pachyhynobius_shangchengensis",4.67888522381037 -"Pachytriton_brevipes",4.60266705576997 -"Paradactylodon_mustersi",4.2941307757363 -"Paramesotriton_caudopunctatus",4.22829253473184 -"Paramesotriton_chinensis",4.16278172377533 -"Paramesotriton_hongkongensis",4.36246147917904 -"Parvimolge_townsendi",2.96225304647982 -"Phaeognathus_hubrichti",4.68203863024467 -"Plethodon_albagula",4.26436859120565 -"Plethodon_amplus",4.11087386417331 -"Plethodon_angusticlavius",3.77007918448618 -"Plethodon_caddoensis",3.70990682130601 -"Plethodon_cheoah",3.96081316959758 -"Plethodon_chlorobryonis",3.93116855415038 -"Plethodon_cinereus",3.81308625756812 -"Plethodon_cylindraceus",4.31160417037734 -"Plethodon_dorsalis",3.71153340467847 -"Plethodon_dunni",4.09217554493726 -"Plethodon_elongatus",3.96128924673106 -"Plethodon_glutinosus",4.26275029709698 -"Plethodon_grobmani",4.08092154188996 -"Plethodon_hoffmani",3.89406268005115 -"Plethodon_hubrichti",3.98555223871626 -"Plethodon_idahoensis",3.77620328228561 -"Plethodon_jordani",4.11414718951828 -"Plethodon_kentucki",4.11998794220208 -"Plethodon_meridianus",4.11903717481247 -"Plethodon_metcalfi",4.00369019395397 -"Plethodon_mississippi",4.18677180246803 -"Plethodon_montanus",4.00733318523247 -"Plethodon_neomexicanus",4.12834333139423 -"Plethodon_nettingi",3.80832776908938 -"Plethodon_ouachitae",4.02980604108453 -"Plethodon_punctatus",4.16037415865418 -"Plethodon_richmondi",3.96043214463583 -"Plethodon_serratus",3.67545221079991 -"Plethodon_shenandoah",3.84801767545223 -"Plethodon_shermani",4.00914971615887 -"Plethodon_teyahalee",4.26127043353808 -"Plethodon_vandykei",3.97687397774776 -"Plethodon_vehiculum",3.9383435604935 -"Plethodon_ventralis",3.73766961828337 -"Plethodon_wehrlei",4.0515240442057 -"Plethodon_welleri",3.75419892023458 -"Plethodon_yonahlossee",4.40575536824794 -"Pleurodeles_waltl",4.50454842467744 -"Proteus_anguinus",4.98907111618042 -"Pseudobranchus_axanthus",4.5013640172625 -"Pseudoeurycea_bellii",4.29907292330404 -"Pseudoeurycea_cephalica",3.80291101734437 -"Pseudoeurycea_gadovii",3.3178157727231 -"Pseudoeurycea_galeanae",3.92395157629342 -"Pseudoeurycea_leprosa",4.06263887373527 -"Pseudoeurycea_rex",3.4904285153901 -"Pseudoeurycea_robertsi",3.8649313978943 -"Pseudoeurycea_werleri",3.97066920086088 -"Pseudotriton_montanus",4.31715472463507 -"Pseudotriton_ruber",4.32446372727274 -"Ranodon_sibiricus",4.45408563411598 -"Rhyacotriton_cascadae",3.85333400907947 -"Rhyacotriton_kezeri",3.8155121050473 -"Rhyacotriton_olympicus",3.89100363820407 -"Rhyacotriton_variegatus",3.79773385902602 -"Salamandra_atra",4.20123141243846 -"Salamandra_salamandra",4.76294286986063 -"Salamandrella_keyserlingii",3.82209829790016 -"Salamandrina_terdigitata",3.52547778217249 -"Siren_intermedia",5.28421844216853 -"Siren_lacertina",5.55218409050509 -"Stereochilus_marginatus",3.90197266957464 -"Taricha_granulosa",4.29387824789718 -"Taricha_rivularis",4.23555473077362 -"Taricha_torosa",4.35169628486605 -"Triturus_cristatus",4.15304576682959 -"Triturus_pygmaeus",4.00551334851548 -"Tylototriton_asperrimus",4.07584109065754 -"Tylototriton_kweichowensis",4.4672864786247 -"Tylototriton_verrucosus",4.23916614676084 +"tipNames","trait" +"Ambystoma_annulatum",4.44135041075727 +"Ambystoma_barbouri",4.3210617205896 +"Ambystoma_californiense",4.51961229762644 +"Ambystoma_cingulatum",3.98713047791495 +"Ambystoma_gracile",4.35502150652934 +"Ambystoma_jeffersonianum",4.40854684448328 +"Ambystoma_laterale",4.00551334851548 +"Ambystoma_macrodactylum",4.0943445622221 +"Ambystoma_maculatum",4.39911725446659 +"Ambystoma_mavortium",4.37682400470252 +"Ambystoma_opacum",4.47966365074837 +"Ambystoma_ordinarium",4.46791759256172 +"Ambystoma_texanum",4.43355115232727 +"Ambystoma_velasci",4.43698819274786 +"Amphiuma_means",6.22455842927536 +"Amphiuma_pholeter",5.24372917626363 +"Amphiuma_tridactylum",6.32051106692587 +"Andrias_davidianus",5.80211837537706 +"Aneides_aeneus",3.90841650983403 +"Aneides_flavipunctatus",4.17899203628239 +"Aneides_hardii",3.98898404656427 +"Aneides_lugubris",4.37332639712838 +"Batrachoseps_attenuatus",3.79773385902602 +"Batrachoseps_major",3.9759363311718 +"Batrachoseps_wrighti",3.79773385902602 +"Batrachuperus_pinchonii",4.65538790214871 +"Batrachuperus_yenyuanensis",4.42157782206069 +"Bolitoglossa_adspersa",3.98898404656427 +"Bolitoglossa_dofleini",4.63812128612778 +"Bolitoglossa_engelhardti",3.82319179172153 +"Bolitoglossa_mexicana",4.12552017969055 +"Bolitoglossa_morio",3.94893335944824 +"Bolitoglossa_occidentalis",3.55105313720653 +"Bolitoglossa_palmata",3.84801767545223 +"Bolitoglossa_platydactyla",4.37866473983298 +"Bolitoglossa_rostrata",3.80058852498184 +"Bolitoglossa_rufescens",3.60114053980593 +"Bolitoglossa_subpalmata",4.01241117945941 +"Bolitoglossa_yucatana",4.04129534113228 +"Bradytriton_silus",3.75185425327532 +"Calotriton_asper",4.05817319508393 +"Chioglossa_lusitanica",3.82537519870247 +"Chiropterotriton_chondrostega",3.18013499655177 +"Chiropterotriton_dimidiatus",3.22286784613774 +"Chiropterotriton_lavae",3.40119738166216 +"Chiropterotriton_multidentatus",3.38777436133001 +"Chiropterotriton_priscus",3.87057581551397 +"Cryptobranchus_alleganiensis",5.73172184334544 +"Cryptotriton_nasalis",3.38777436133001 +"Cynops_ensicauda",4.10791868224922 +"Cynops_pyrrhogaster",4.15543966158191 +"Desmognathus_aeneus",3.2557861788883 +"Desmognathus_auriculatus",4.01223026584517 +"Desmognathus_brimleyorum",4.32714797316389 +"Desmognathus_fuscus",4.02168425963766 +"Desmognathus_imitator",3.81286543389493 +"Desmognathus_marmoratus",4.2850337899827 +"Desmognathus_monticola",4.14938499397991 +"Desmognathus_ochrophaeus",3.70831436675254 +"Desmognathus_quadramaculatus",4.3391191336626 +"Desmognathus_welteri",4.19968007756742 +"Desmognathus_wrighti",3.37142522332849 +"Dicamptodon_copei",4.42184812886055 +"Dicamptodon_ensatus",4.68213122712422 +"Dicamptodon_tenebrosus",4.51743127168008 +"Echinotriton_andersoni",4.41279829334063 +"Ensatina_eschscholtzii",4.16666522380173 +"Eurycea_aquatica",3.58351893845611 +"Eurycea_bislineata",3.7536132686805 +"Eurycea_cirrigera",3.65970807681366 +"Eurycea_junaluska",3.77292184468871 +"Eurycea_longicauda",4.07889245766318 +"Eurycea_lucifuga",4.14128380814951 +"Eurycea_multiplicata",3.71332813451625 +"Eurycea_nana",3.25848107946056 +"Eurycea_neotenes",3.5548765217606 +"Eurycea_quadridigitata",3.40734511224839 +"Eurycea_rathbuni",3.99452422693989 +"Eurycea_sosorum",3.30688670219091 +"Eurycea_spelaea",3.92592591059714 +"Eurycea_tridentifera",3.62667154831465 +"Eurycea_tynerensis",3.50480636428118 +"Eurycea_wilderae",3.60086757679072 +"Gyrinophilus_porphyriticus",4.50468664740977 +"Hemidactylium_scutatum",3.69424006035603 +"Hydromantes_italicus",3.94931879017184 +"Hydromantes_platycephalus",3.96651119071222 +"Hynobius_abei",4.05644364442232 +"Hynobius_dunni",4.17438726989564 +"Hynobius_leechii",3.94449019556565 +"Hynobius_lichenatus",4.25773810913054 +"Hynobius_naevius",4.30541553230204 +"Hynobius_nebulosus",4.14472076954717 +"Hynobius_nigrescens",4.20841701848195 +"Hynobius_stejnegeri",4.11414718951828 +"Hynobius_tsuensis",4.16666522380173 +"Lissotriton_boscai",3.41772668361337 +"Lissotriton_helveticus",3.6988297849671 +"Lissotriton_montandoni",3.79098467705109 +"Lissotriton_vulgaris",3.70480201465775 +"Liua_shihi",4.31079912538551 +"Mertensiella_caucasica",4.30271282795416 +"Ichthyosaura_alpestris",3.85142338329922 +"Necturus_alabamensis",4.88225252927326 +"Necturus_beyeri",4.92667380691538 +"Necturus_maculosus",5.22666292049755 +"Necturus_punctatus",4.83707524297087 +"Neurergus_crocatus",4.32057002622753 +"Neurergus_strauchii",4.30811095172371 +"Notophthalmus_meridionalis",3.79323946943818 +"Notophthalmus_perstriatus",3.76699723337789 +"Notophthalmus_viridescens",3.99231183665695 +"Nototriton_picadoi",3.27336401015227 +"Nyctanolis_pernix",3.68637632389582 +"Oedipina_complex",3.44680789291421 +"Oedipina_cyclocauda",3.89792408104864 +"Oedipina_parvipes",3.68260984110034 +"Oedipina_uniformis",3.90801498403061 +"Ommatotriton_vittatus",3.89182029811063 +"Pachyhynobius_shangchengensis",4.67888522381037 +"Pachytriton_brevipes",4.60266705576997 +"Paradactylodon_mustersi",4.2941307757363 +"Paramesotriton_caudopunctatus",4.22829253473184 +"Paramesotriton_chinensis",4.16278172377533 +"Paramesotriton_hongkongensis",4.36246147917904 +"Parvimolge_townsendi",2.96225304647982 +"Phaeognathus_hubrichti",4.68203863024467 +"Plethodon_albagula",4.26436859120565 +"Plethodon_amplus",4.11087386417331 +"Plethodon_angusticlavius",3.77007918448618 +"Plethodon_caddoensis",3.70990682130601 +"Plethodon_cheoah",3.96081316959758 +"Plethodon_chlorobryonis",3.93116855415038 +"Plethodon_cinereus",3.81308625756812 +"Plethodon_cylindraceus",4.31160417037734 +"Plethodon_dorsalis",3.71153340467847 +"Plethodon_dunni",4.09217554493726 +"Plethodon_elongatus",3.96128924673106 +"Plethodon_glutinosus",4.26275029709698 +"Plethodon_grobmani",4.08092154188996 +"Plethodon_hoffmani",3.89406268005115 +"Plethodon_hubrichti",3.98555223871626 +"Plethodon_idahoensis",3.77620328228561 +"Plethodon_jordani",4.11414718951828 +"Plethodon_kentucki",4.11998794220208 +"Plethodon_meridianus",4.11903717481247 +"Plethodon_metcalfi",4.00369019395397 +"Plethodon_mississippi",4.18677180246803 +"Plethodon_montanus",4.00733318523247 +"Plethodon_neomexicanus",4.12834333139423 +"Plethodon_nettingi",3.80832776908938 +"Plethodon_ouachitae",4.02980604108453 +"Plethodon_punctatus",4.16037415865418 +"Plethodon_richmondi",3.96043214463583 +"Plethodon_serratus",3.67545221079991 +"Plethodon_shenandoah",3.84801767545223 +"Plethodon_shermani",4.00914971615887 +"Plethodon_teyahalee",4.26127043353808 +"Plethodon_vandykei",3.97687397774776 +"Plethodon_vehiculum",3.9383435604935 +"Plethodon_ventralis",3.73766961828337 +"Plethodon_wehrlei",4.0515240442057 +"Plethodon_welleri",3.75419892023458 +"Plethodon_yonahlossee",4.40575536824794 +"Pleurodeles_waltl",4.50454842467744 +"Proteus_anguinus",4.98907111618042 +"Pseudobranchus_axanthus",4.5013640172625 +"Pseudoeurycea_bellii",4.29907292330404 +"Pseudoeurycea_cephalica",3.80291101734437 +"Pseudoeurycea_gadovii",3.3178157727231 +"Pseudoeurycea_galeanae",3.92395157629342 +"Pseudoeurycea_leprosa",4.06263887373527 +"Pseudoeurycea_rex",3.4904285153901 +"Pseudoeurycea_robertsi",3.8649313978943 +"Pseudoeurycea_werleri",3.97066920086088 +"Pseudotriton_montanus",4.31715472463507 +"Pseudotriton_ruber",4.32446372727274 +"Ranodon_sibiricus",4.45408563411598 +"Rhyacotriton_cascadae",3.85333400907947 +"Rhyacotriton_kezeri",3.8155121050473 +"Rhyacotriton_olympicus",3.89100363820407 +"Rhyacotriton_variegatus",3.79773385902602 +"Salamandra_atra",4.20123141243846 +"Salamandra_salamandra",4.76294286986063 +"Salamandrella_keyserlingii",3.82209829790016 +"Salamandrina_terdigitata",3.52547778217249 +"Siren_intermedia",5.28421844216853 +"Siren_lacertina",5.55218409050509 +"Stereochilus_marginatus",3.90197266957464 +"Taricha_granulosa",4.29387824789718 +"Taricha_rivularis",4.23555473077362 +"Taricha_torosa",4.35169628486605 +"Triturus_cristatus",4.15304576682959 +"Triturus_pygmaeus",4.00551334851548 +"Tylototriton_asperrimus",4.07584109065754 +"Tylototriton_kweichowensis",4.4672864786247 +"Tylototriton_verrucosus",4.23916614676084 diff --git a/examples/caudata_tree.txt b/examples/caudata_tree.txt deleted file mode 100644 index e41a88190..000000000 --- a/examples/caudata_tree.txt +++ /dev/null @@ -1 +0,0 @@ -(((((((Dicamptodon_copei:15.88406289,Dicamptodon_tenebrosus:15.88406289):8.23254925,Dicamptodon_ensatus:24.11661214):93.88047591,(((((((Ambystoma_texanum:9.55326679,Ambystoma_barbouri:9.55326679):30.72836597,Ambystoma_opacum:40.28163277):5.64731515,(Ambystoma_cingulatum:42.90378798,Ambystoma_annulatum:42.90378797):3.02515995):5.32684515,(Ambystoma_laterale:36.15570323,Ambystoma_jeffersonianum:36.15570323):15.10008983):0.91882006,(((Ambystoma_ordinarium:15.86272809,Ambystoma_mavortium:15.8627281):12.35612986,Ambystoma_velasci:28.21885795):14.55108641,Ambystoma_californiense:42.76994437):9.40466874):5.77149223,Ambystoma_macrodactylum:57.94610534):1.47389465,(Ambystoma_maculatum:51.41116389,Ambystoma_gracile:51.41116389):8.0088361):58.58):45,((Salamandrina_terdigitata:64.26301347,((Salamandra_atra:24.8437563,Salamandra_salamandra:24.84375631):33.73758253,(Chioglossa_lusitanica:53.57235588,Mertensiella_caucasica:53.57235588):5.00887998):5.68177763):38.73678053,(((((Taricha_granulosa:31.04321088,Taricha_torosa:31.04331389):4.42641615,Taricha_rivularis:35.46973006):37.6509567,(Notophthalmus_meridionalis:59.9590641,(Notophthalmus_perstriatus:42.31406638,Notophthalmus_viridescens:42.31406638):17.64499771):13.16162268):9.0501799,((Ichthyosaura_alpestris:66.95151407,((Lissotriton_vulgaris:10.67357513,Lissotriton_montandoni:10.67357513):28.87834578,(Lissotriton_helveticus:28.87844877,Lissotriton_boscai:28.87844877):10.67357513):27.3994902):0.30869038,((((Triturus_pygmaeus:23.15548669,Triturus_cristatus:23.15558965):17.38272342,Calotriton_asper:40.53821007):10.6612365,(Ommatotriton_vittatus:51.05761589,(Neurergus_crocatus:25.96295208,Neurergus_strauchii:25.96295213):25.09466382):0.14193371):1.00465999,((Cynops_pyrrhogaster:9.60586379,Cynops_ensicauda:9.60586379):24.53238793,((Paramesotriton_caudopunctatus:18.96813311,(Paramesotriton_chinensis:12.88723123,Paramesotriton_hongkongensis:12.88723128):6.08100485):8.32454635,Pachytriton_brevipes:27.29278242):6.8455723):18.06585487):15.05599489):14.91076518):6.66202668,((Echinotriton_andersoni:54.13700075,((Tylototriton_verrucosus:19.64350272,Tylototriton_kweichowensis:19.64350272):19.50558599,Tylototriton_asperrimus:39.14908871):14.98791203):23.93591614,Pleurodeles_waltl:78.07281387):10.76007948):14.16690066):60):18,(((((Hemidactylium_scutatum:99.95984264,(((((((((Bolitoglossa_adspersa:13.22078348,Bolitoglossa_palmata:13.22078347):15.82920833,Bolitoglossa_subpalmata:29.03212587):12.91706278,(((Bolitoglossa_dofleini:30.53286346,Bolitoglossa_morio:30.51499753):2.1975086,(Bolitoglossa_engelhardti:14.57859367,Bolitoglossa_rostrata:14.57859367):18.13391247):6.30667104,((Bolitoglossa_platydactyla:21.29618095,(Bolitoglossa_mexicana:9.95131946,Bolitoglossa_yucatana:9.95131946):11.36272741):10.43369939,(Bolitoglossa_occidentalis:18.40190132,Bolitoglossa_rufescens:18.40190132):13.32797902):7.30716276):2.93001147):12.20242583,((Parvimolge_townsendi:45.79036223,((Pseudoeurycea_leprosa:28.71053925,Pseudoeurycea_werleri:28.74627109):7.28929683,((Pseudoeurycea_robertsi:10.18357647,Pseudoeurycea_gadovii:10.20144238):9.3796099,Pseudoeurycea_rex:19.56318637):16.43664973):9.79052614):3.30519587,(Pseudoeurycea_bellii:39.30503196,(Pseudoeurycea_cephalica:23.15423701,Pseudoeurycea_galeanae:23.15423701):16.15079495):9.80839207):5.05605638):9.48680544,((((Chiropterotriton_dimidiatus:13.45304049,Chiropterotriton_lavae:13.45304049):5.93148664,Chiropterotriton_priscus:19.38452712):6.34240288,Chiropterotriton_multidentatus:25.72693):3.94836912,Chiropterotriton_chondrostega:29.67529913):33.96312079):6.52106212,(((Bradytriton_silus:46.84445173,((Oedipina_complex:9.21881659,Oedipina_parvipes:9.21881659):22.90411408,(Oedipina_cyclocauda:24.56564497,Oedipina_uniformis:24.56564498):7.53941977):14.72152107):8.41485002,Nototriton_picadoi:55.25930174):8.61137518,Nyctanolis_pernix:63.88854285):6.28880511):1.32207835,Cryptotriton_nasalis:71.48156039):9.16521882,(Batrachoseps_wrighti:65.26421898,(Batrachoseps_attenuatus:38.07228323,Batrachoseps_major:38.07228323):27.19193574):15.38256023):8.03966563,(((Stereochilus_marginatus:37.00032782,Gyrinophilus_porphyriticus:37.00032782):4.66300606,(Pseudotriton_montanus:37.46484182,Pseudotriton_ruber:37.46484182):4.19849205):25.45894115,((Eurycea_multiplicata:36.69660711,(Eurycea_tynerensis:25.54827078,Eurycea_spelaea:25.54827078):11.16620226):3.64464842,(Eurycea_quadridigitata:36.64300933,(((Eurycea_lucifuga:16.90116374,Eurycea_longicauda:16.90116374):15.09670545,((Eurycea_cirrigera:18.86641534,Eurycea_bislineata:18.86641534):4.09129651,((Eurycea_aquatica:10.38010162,Eurycea_junaluska:10.38010162):3.39452549,Eurycea_wilderae:13.77462711):9.18308474):9.05802327):3.37665956,(Eurycea_rathbuni:10.89821341,(Eurycea_nana:3.16226848,(Eurycea_sosorum:2.71562039,(Eurycea_neotenes:1.64366497,Eurycea_tridentifera:1.64366497):1.07195542):0.44664809):7.73594493):24.47631535):1.26848058):3.69824619):26.78101951):21.58203573):11.25553188):9.02229143,((((Plethodon_elongatus:43.1998033,(Plethodon_vehiculum:30.83658416,Plethodon_dunni:30.83658416):12.38108507):11.18406818,(Plethodon_neomexicanus:53.329782,(Plethodon_vandykei:11.45205704,Plethodon_idahoensis:11.45205704):41.89559088):1.05408949):20.47434846,((Plethodon_serratus:32.17652843,(Plethodon_hoffmani:21.22471726,((Plethodon_cinereus:12.73840354,Plethodon_shenandoah:12.73840354):6.94984429,(Plethodon_richmondi:13.38157678,(Plethodon_nettingi:11.63071627,Plethodon_hubrichti:11.63071627):1.73299459):6.32453696):1.53646943):10.93394526):16.22225865,(((Plethodon_wehrlei:8.75430257,Plethodon_punctatus:8.75430257):26.76315358,(Plethodon_welleri:28.26389116,(Plethodon_angusticlavius:18.75921979,(Plethodon_ventralis:15.41829208,Plethodon_dorsalis:15.41829208):3.34092772):9.50467137):7.27143091):5.84215702,(Plethodon_yonahlossee:27.85297492,(Plethodon_kentucki:25.92345517,((Plethodon_metcalfi:16.65104081,Plethodon_jordani:16.65104081):8.14686117,((Plethodon_caddoensis:18.6877561,Plethodon_ouachitae:18.6877561):5.35977709,(((Plethodon_montanus:9.27241436,(Plethodon_amplus:4.39501721,Plethodon_meridianus:4.39501721):4.87739715):7.73594493,((Plethodon_shermani:8.91509588,Plethodon_cheoah:8.91509588):0.85756433,(Plethodon_chlorobryonis:8.14686117,(Plethodon_teyahalee:3.84117358,Plethodon_cylindraceus:3.84117358):4.28782167):1.62579905):7.23569907):5.57416817,(Plethodon_glutinosus:16.40091788,(Plethodon_mississippi:10.75528602,(Plethodon_albagula:8.20045894,Plethodon_grobmani:8.20045894):2.55482708):5.64563186):6.18160957):1.46500574):0.73250287):1.12555319):1.94738567):13.50663825):7.03917391):26.45943287):11.13047042,((Hydromantes_italicus:38.16161285,Hydromantes_platycephalus:38.16161285):41.77052941,(Ensatina_eschscholtzii:77.6095722,((Aneides_aeneus:54.22307818,(Aneides_hardii:38.358138,(Aneides_lugubris:29.87182429,Aneides_flavipunctatus:29.87182429):8.48631372):15.86494018):20.52794624,(Phaeognathus_hubrichti:65.94312407,(Desmognathus_wrighti:49.95312244,(Desmognathus_aeneus:35.53532208,((Desmognathus_quadramaculatus:28.94279626,Desmognathus_marmoratus:28.94279626):3.59105065,(Desmognathus_imitator:27.85297492,((Desmognathus_ochrophaeus:18.41976725,(Desmognathus_welteri:15.66841501,Desmognathus_fuscus:15.66841501):2.75135224):4.75233568,(Desmognathus_monticola:20.15276184,(Desmognathus_brimleyorum:17.72299623,Desmognathus_auriculatus:17.72299623):2.41189969):3.01934109):4.68087199):4.68087199):2.98360924):14.43566629):15.97213572):8.80790034):2.85854778):2.32257007):6.07441403):22.97557777):31,((Amphiuma_pholeter:2.74051282,Amphiuma_means:2.74051282):3.93948718,Amphiuma_tridactylum:6.68):133.32):12,(((Rhyacotriton_olympicus:1.76206061,Rhyacotriton_kezeri:1.76206061):5.75697501,Rhyacotriton_cascadae:7.51903561):1.14096439,Rhyacotriton_variegatus:8.66):143.34):18,(Proteus_anguinus:146,(((Necturus_alabamensis:70.9920748,Necturus_beyeri:70.99207481):4.15800956,Necturus_maculosus:75.15008437):9.35391177,Necturus_punctatus:84.50399613):61.49600386):24):11):13,((Andrias_davidianus:66,Cryptobranchus_alleganiensis:66):95,((((((Batrachuperus_pinchonii:23.92682927,Batrachuperus_yenyuanensis:23.92682926):18.31436314,Liua_shihi:42.24119242):5.51400181,Salamandrella_keyserlingii:47.75519422):3.93857272,((((((Hynobius_nebulosus:10.26136019,Hynobius_dunni:10.26136019):4.680505127,Hynobius_tsuensis:14.94186532):8.821265868,Hynobius_leechii:23.76313119):1.916897941,Hynobius_naevius:25.68002913):2.236917639,Hynobius_stejnegeri:27.91694677):1.431822774,((Hynobius_nigrescens:19.24520975,Hynobius_lichenatus:19.24520975):3.490512535,Hynobius_abei:22.73572228):6.61304726):22.34499738):5.21860885,Pachyhynobius_shangchengensis:56.91237579):4.62782295,(Paradactylodon_mustersi:47.55826557,Ranodon_sibiricus:47.55826557):13.98193315):99.45980126):33):20,(Pseudobranchus_axanthus:74,(Siren_lacertina:19.40020371,Siren_intermedia:19.40020371):54.59979629):140); diff --git a/examples/fish2hyb.net b/examples/fish2hyb.net index 5a92f8f0c..7d6fc267c 100644 --- a/examples/fish2hyb.net +++ b/examples/fish2hyb.net @@ -1 +1 @@ -(Xgordoni,Xmeyeri,(Xcouchianus,(Xvariatus,(Xevelynae,((Xxiphidium,#H25:9.992::0.167):1.383,(Xmilleri,(Xandersi,(Xmaculatus,((((Xhellerii,(Xalvarezi,Xmayae):0.327):0.259,Xsignum):1.866,(Xclemenciae_F2,Xmonticolus):1.461):0.786,((((Xmontezumae,(Xnezahuacoyotl)#H26:0.247::0.807):0.372,((Xbirchmanni_GARC,Xmalinche_CHIC2):1.003,Xcortezi):0.454):0.63,((Xcontinens,Xpygmaeus):1.927,((Xnigrensis,Xmultilineatus):1.304,#H26:0.0::0.193):0.059):2.492):2.034)#H25:0.707::0.833):1.029):0.654):0.469):0.295):0.41):0.646):3.509):0.263); +(Xgordoni,Xmeyeri,(Xcouchianus,(Xvariatus,(Xevelynae,((Xxiphidium,#H25:9.992::0.167):1.383,(Xmilleri,(Xandersi,(Xmaculatus,((((Xhellerii,(Xalvarezi,Xmayae):0.327):0.259,Xsignum):1.866,(Xclemenciae_F2,Xmonticolus):1.461):0.786,((((Xmontezumae,(Xnezahuacoyotl)#H26:0.247::0.807):0.372,((Xbirchmanni_GARC,Xmalinche_CHIC2):1.003,Xcortezi):0.454):0.63,((Xcontinens,Xpygmaeus):1.927,((Xnigrensis,Xmultilineatus):1.304,#H26:0.0::0.193):0.059):2.492):2.034)#H25:0.707::0.833):1.029):0.654):0.469):0.295):0.41):0.646):3.509):0.263); diff --git a/examples/fish3hyb_20boostrap.net b/examples/fish3hyb_20boostrap.net index a2957d8fb..c74dd6d7c 100644 --- a/examples/fish3hyb_20boostrap.net +++ b/examples/fish3hyb_20boostrap.net @@ -1,20 +1,20 @@ -(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.451,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.805):0.371,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.991,Xcortezi):0.454):0.628,(#H26:::0.195,((Xnigrensis,Xmultilineatus):1.392,(Xcontinens,Xpygmaeus):1.906):0.037):2.416):1.98)#H7:0.801::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.48::0.165):1.404,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.242):3.402):0.64):0.407):0.295):0.47):0.648):1.019):0.786):1.911)#H27:0.118::0.576):0.65,Xalvarezi):0.266,(Xsignum,#H27:1.468::0.424):9.967); -(Xmayae,(Xsignum,(#H27:0.203::0.494,((Xclemenciae_F2,Xmonticolus):1.452,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.803):0.375,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.982,Xcortezi):0.454):0.629,(#H26:::0.197,((Xnigrensis,Xmultilineatus):1.381,(Xcontinens,Xpygmaeus):1.913):0.033):2.413):1.982)#H7:0.792::0.834,(Xmaculatus,(Xandersi,(((Xxiphidium,#H7:9.431::0.166):1.384,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.265):3.41):0.64):0.409):0.294,Xmilleri):0.467):0.65):1.021):0.785):1.475):0.824):9.679,((Xalvarezi,Xhellerii):0.056)#H27:0.0::0.506); -(Xalvarezi,Xmayae,((Xsignum,(((((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.808):0.374,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.987,Xcortezi):0.452):0.625,((Xcontinens,Xpygmaeus):1.9,((Xnigrensis,Xmultilineatus):1.312,#H26:::0.192):0.075):2.459):1.977)#H25:0.797::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H25:9.952::0.165):1.395,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.246):3.413):0.638):0.407):0.295):0.465):0.651):1.02):0.782,(Xclemenciae_F2,Xmonticolus):1.445):1.758)#H27:0.59::0.719):0.809,(Xhellerii,#H27:0.554::0.281):6.133):0.035); -(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.445,((((((Xbirchmanni_GARC,Xmalinche_CHIC2):0.991,Xcortezi):0.454,(Xmontezumae,(Xnezahuacoyotl)#H26:::0.806):0.374):0.627,(#H26:::0.194,((Xcontinens,Xpygmaeus):1.901,(Xnigrensis,Xmultilineatus):1.393):0.002):2.448):1.981)#H7:0.794::0.834,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.423::0.166):1.384,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.258):3.394):0.639):0.409):0.294):0.469):0.65):1.021):0.783):1.888)#H27:0.149::0.574):0.654,Xalvarezi):0.264,(Xsignum,#H27:2.587::0.426):9.905); -(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.444,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.805):0.379,((Xbirchmanni_GARC,Xmalinche_CHIC2):1.0,Xcortezi):0.452):0.63,(#H26:::0.195,((Xnigrensis,Xmultilineatus):1.382,(Xcontinens,Xpygmaeus):1.918):0.016):2.433):1.968)#H7:0.827::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.533::0.165):1.398,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.248):3.382):0.64):0.408):0.294):0.467):0.651):1.018):0.783):1.85)#H27:0.299::0.574):0.662,Xalvarezi):0.267,(Xsignum,#H27:2.82::0.426):9.991); -(Xgordoni,Xmeyeri,(Xcouchianus,(Xvariatus,(Xevelynae,((Xxiphidium,#H25:9.787::0.165):1.419,(Xmilleri,(Xandersi,(Xmaculatus,((((Xhellerii,(Xalvarezi,Xmayae):0.34):0.251,Xsignum):1.853,(Xclemenciae_F2,Xmonticolus):1.443):0.785,((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.806):0.376,((Xbirchmanni_GARC,(Xmalinche_CHIC2)#H27:0.97::0.975):1.011,(Xcortezi,#H27:0.0::0.025):0.016):0.447):0.627,(#H26:::0.194,((Xcontinens,Xpygmaeus):1.905,(Xnigrensis,Xmultilineatus):1.395):0.032):2.414):1.978)#H25:0.8::0.835):1.015):0.655):0.465):0.296):0.407):0.641):3.379):0.268); -(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.452,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.804):0.381,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.999,Xcortezi):0.454):0.628,(#H26:::0.196,((Xcontinens,Xpygmaeus):1.902,(Xnigrensis,Xmultilineatus):1.401):0.043):2.399):1.976)#H7:0.8::0.834,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.518::0.166):1.382,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.26):3.392):0.642):0.407):0.294):0.468):0.652):1.02):0.783):1.877)#H27:0.177::0.568):0.669,Xalvarezi):0.273,(Xsignum,#H27:2.599::0.432):6.817); -(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.443,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.804):0.371,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.993,Xcortezi):0.452):0.628,(#H26:::0.196,((Xcontinens,Xpygmaeus):1.887,(Xnigrensis,Xmultilineatus):1.392):0.043):2.407):1.984)#H7:0.78::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.555::0.165):1.415,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.263):3.384):0.634):0.408):0.295):0.466):0.655):1.016):0.787):1.889)#H27:0.159::0.574):0.651,Xalvarezi):0.279,(Xsignum,#H27:2.117::0.426):9.551); -(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.445,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.807):0.377,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.994,Xcortezi):0.451):0.626,((Xcontinens,Xpygmaeus):1.912,(#H26:::0.193,(Xnigrensis,Xmultilineatus):1.391):0.01):2.455):1.975)#H7:0.81::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.5::0.165):1.402,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.261):3.393):0.641):0.406):0.296):0.467):0.65):1.015):0.786):1.891)#H27:0.169::0.575):0.654,Xalvarezi):0.271,(Xsignum,#H27:2.065::0.425):9.401); -(Xgordoni,Xmeyeri,(Xcouchianus,((((Xxiphidium,#H25:9.982::0.166):1.391,(Xmilleri,(Xandersi,(Xmaculatus,((((Xhellerii,(Xalvarezi,Xmayae):0.331):0.255,Xsignum):1.85,(Xclemenciae_F2,Xmonticolus):1.444):0.785,((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.805):0.372,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.996,Xcortezi):0.451):0.63,(#H26:::0.195,((Xcontinens,Xpygmaeus):1.907,(Xnigrensis,Xmultilineatus):1.389):0.003):2.448):1.982)#H25:0.787::0.834):1.019):0.652):0.471):0.294):0.386,(Xevelynae,#H27:::0.067):6.572):0.747,(Xvariatus)#H27:::0.933):3.332):0.235); -(Xxiphidium,#H25:9.983::0.164,((Xmilleri,(Xandersi,(Xmaculatus,((((Xhellerii,((Xalvarezi,Xmayae):0.417)#H31:0.004::0.713):0.769,(Xsignum,#H31:0.103::0.287):7.966):1.626,(Xclemenciae_F2,Xmonticolus):1.445):0.789,((((Xcontinens,Xpygmaeus):1.888,(#H26:::0.184,(Xnigrensis,Xmultilineatus):0.885):0.339):2.46,(((Xbirchmanni_GARC,Xmalinche_CHIC2):1.0,Xcortezi):0.459,(Xmontezumae,(Xnezahuacoyotl)#H26:::0.816):0.363):0.623):1.972)#H25:0.784::0.836):1.008):0.651):0.479):0.294,(Xevelynae,(Xvariatus,((Xgordoni,Xmeyeri):0.283,Xcouchianus):3.348):0.644):0.404):1.455); -(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.448,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.807):0.373,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.996,Xcortezi):0.453):0.626,((Xcontinens,Xpygmaeus):1.905,(#H26:::0.193,(Xnigrensis,Xmultilineatus):1.402):0.002):2.455):1.985)#H7:0.786::0.834,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.542::0.166):1.385,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.265):3.386):0.637):0.406):0.295):0.47):0.651):1.02):0.785):1.895)#H27:0.147::0.575):0.655,Xalvarezi):0.262,(Xsignum,#H27:1.831::0.425):9.611); -(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.449,((((((Xbirchmanni_GARC,Xmalinche_CHIC2):0.99,Xcortezi):0.453,(Xmontezumae,(Xnezahuacoyotl)#H26:::0.803):0.375):0.63,(#H26:::0.197,((Xcontinens,Xpygmaeus):1.92,(Xnigrensis,Xmultilineatus):1.403):0.043):2.405):1.979)#H7:0.801::0.834,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.56::0.166):1.386,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.258):3.386):0.641):0.408):0.293):0.467):0.652):1.021):0.784):1.885)#H27:0.15::0.574):0.658,Xalvarezi):0.262,(Xsignum,#H27:3.318::0.426):9.998); -(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.449,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.806):0.374,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.998,Xcortezi):0.45):0.627,(#H26:::0.194,((Xnigrensis,Xmultilineatus):1.391,(Xcontinens,Xpygmaeus):1.919):0.0):2.451):1.981)#H7:0.798::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.424::0.165):1.412,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.267):3.386):0.638):0.409):0.295):0.467):0.651):1.02):0.784):1.88)#H27:0.169::0.572):0.669,Xalvarezi):0.271,(Xsignum,#H27:2.589::0.428):9.542); -(Xmayae,((Xsignum,(((Xclemenciae_F2,Xmonticolus):1.441,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.806):0.37,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.988,Xcortezi):0.454):0.628,(#H26:::0.194,((Xcontinens,Xpygmaeus):1.897,(Xnigrensis,Xmultilineatus):1.392):0.004):2.45):1.972)#H7:0.809::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.583::0.165):1.392,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.264):3.379):0.636):0.406):0.297):0.466):0.653):1.015):0.787):1.578)#H27:2.716::0.587):1.212,(#H27:6.196::0.413,Xhellerii):1.261):0.025,Xalvarezi); -(Xgordoni,Xmeyeri,(Xcouchianus,((Xvariatus,(Xevelynae,(((Xxiphidium,#H25:9.986::0.165):1.414,(Xmilleri,(Xandersi,(Xmaculatus,((((Xhellerii,(Xalvarezi,Xmayae):0.324):0.258,Xsignum):1.847,(Xclemenciae_F2,Xmonticolus):1.444):0.786,((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.806):0.371,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.995,Xcortezi):0.453):0.627,(#H26:::0.194,((Xcontinens,Xpygmaeus):1.914,(Xmultilineatus,Xnigrensis):1.391):0.001):2.449):1.97)#H25:0.81::0.835):1.016):0.65):0.467):0.294):0.106)#H27:0.374::0.972):0.741):4.188,#H27:0.008::0.028):0.956):0.278); -(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.451,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.805):0.375,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.992,Xcortezi):0.453):0.628,(#H26:::0.195,((Xcontinens,Xpygmaeus):1.903,(Xnigrensis,Xmultilineatus):1.403):0.019):2.434):1.976)#H7:0.799::0.834,(Xmaculatus,(Xandersi,(Xmilleri,(((Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.259):3.392):0.639,Xevelynae):0.41,(Xxiphidium,#H7:9.438::0.166):1.39):0.293):0.469):0.651):1.022):0.785):1.882)#H27:0.137::0.573):0.662,Xalvarezi):0.256,(Xsignum,#H27:4.136::0.427):7.944); -(Xmayae,((Xhellerii,(((Xmonticolus,Xclemenciae_F2):1.454,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.807):0.376,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.99,Xcortezi):0.454):0.626,((Xcontinens,Xpygmaeus):1.926,(#H26:::0.193,(Xnigrensis,Xmultilineatus):1.377):0.021):2.448):1.98)#H7:0.795::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.551::0.165):1.429,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.26):3.379):0.638):0.407):0.296):0.466):0.651):1.019):0.786):1.874)#H27:0.176::0.573):0.669,Xalvarezi):0.271,(Xsignum,#H27:2.925::0.427):7.584); -(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.446,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.805):0.37,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.99,Xcortezi):0.458):0.627,(#H26:::0.195,((Xcontinens,Xpygmaeus):1.91,(Xnigrensis,Xmultilineatus):1.383):0.021):2.435):1.98)#H7:0.795::0.834,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.527::0.166):1.398,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.257):3.397):0.637):0.409):0.296):0.466):0.653):1.021):0.785):1.876)#H27:0.187::0.575):0.658,Xalvarezi):0.268,(Xsignum,#H27:2.894::0.425):9.997); -(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.452,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.805):0.377,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.983,Xcortezi):0.456):0.63,(#H26:::0.195,((Xcontinens,Xpygmaeus):1.891,(Xnigrensis,Xmultilineatus):1.397):0.041):2.416):1.973)#H7:0.814::0.834,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.569::0.166):1.396,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.262):3.379):0.64):0.409):0.295):0.466):0.653):1.021):0.784):1.895)#H27:0.147::0.574):0.651,Xalvarezi):0.271,(Xsignum,#H27:1.886::0.426):9.466); +(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.451,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.805):0.371,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.991,Xcortezi):0.454):0.628,(#H26:::0.195,((Xnigrensis,Xmultilineatus):1.392,(Xcontinens,Xpygmaeus):1.906):0.037):2.416):1.98)#H7:0.801::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.48::0.165):1.404,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.242):3.402):0.64):0.407):0.295):0.47):0.648):1.019):0.786):1.911)#H27:0.118::0.576):0.65,Xalvarezi):0.266,(Xsignum,#H27:1.468::0.424):9.967); +(Xmayae,(Xsignum,(#H27:0.203::0.494,((Xclemenciae_F2,Xmonticolus):1.452,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.803):0.375,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.982,Xcortezi):0.454):0.629,(#H26:::0.197,((Xnigrensis,Xmultilineatus):1.381,(Xcontinens,Xpygmaeus):1.913):0.033):2.413):1.982)#H7:0.792::0.834,(Xmaculatus,(Xandersi,(((Xxiphidium,#H7:9.431::0.166):1.384,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.265):3.41):0.64):0.409):0.294,Xmilleri):0.467):0.65):1.021):0.785):1.475):0.824):9.679,((Xalvarezi,Xhellerii):0.056)#H27:0.0::0.506); +(Xalvarezi,Xmayae,((Xsignum,(((((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.808):0.374,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.987,Xcortezi):0.452):0.625,((Xcontinens,Xpygmaeus):1.9,((Xnigrensis,Xmultilineatus):1.312,#H26:::0.192):0.075):2.459):1.977)#H25:0.797::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H25:9.952::0.165):1.395,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.246):3.413):0.638):0.407):0.295):0.465):0.651):1.02):0.782,(Xclemenciae_F2,Xmonticolus):1.445):1.758)#H27:0.59::0.719):0.809,(Xhellerii,#H27:0.554::0.281):6.133):0.035); +(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.445,((((((Xbirchmanni_GARC,Xmalinche_CHIC2):0.991,Xcortezi):0.454,(Xmontezumae,(Xnezahuacoyotl)#H26:::0.806):0.374):0.627,(#H26:::0.194,((Xcontinens,Xpygmaeus):1.901,(Xnigrensis,Xmultilineatus):1.393):0.002):2.448):1.981)#H7:0.794::0.834,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.423::0.166):1.384,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.258):3.394):0.639):0.409):0.294):0.469):0.65):1.021):0.783):1.888)#H27:0.149::0.574):0.654,Xalvarezi):0.264,(Xsignum,#H27:2.587::0.426):9.905); +(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.444,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.805):0.379,((Xbirchmanni_GARC,Xmalinche_CHIC2):1.0,Xcortezi):0.452):0.63,(#H26:::0.195,((Xnigrensis,Xmultilineatus):1.382,(Xcontinens,Xpygmaeus):1.918):0.016):2.433):1.968)#H7:0.827::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.533::0.165):1.398,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.248):3.382):0.64):0.408):0.294):0.467):0.651):1.018):0.783):1.85)#H27:0.299::0.574):0.662,Xalvarezi):0.267,(Xsignum,#H27:2.82::0.426):9.991); +(Xgordoni,Xmeyeri,(Xcouchianus,(Xvariatus,(Xevelynae,((Xxiphidium,#H25:9.787::0.165):1.419,(Xmilleri,(Xandersi,(Xmaculatus,((((Xhellerii,(Xalvarezi,Xmayae):0.34):0.251,Xsignum):1.853,(Xclemenciae_F2,Xmonticolus):1.443):0.785,((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.806):0.376,((Xbirchmanni_GARC,(Xmalinche_CHIC2)#H27:0.97::0.975):1.011,(Xcortezi,#H27:0.0::0.025):0.016):0.447):0.627,(#H26:::0.194,((Xcontinens,Xpygmaeus):1.905,(Xnigrensis,Xmultilineatus):1.395):0.032):2.414):1.978)#H25:0.8::0.835):1.015):0.655):0.465):0.296):0.407):0.641):3.379):0.268); +(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.452,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.804):0.381,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.999,Xcortezi):0.454):0.628,(#H26:::0.196,((Xcontinens,Xpygmaeus):1.902,(Xnigrensis,Xmultilineatus):1.401):0.043):2.399):1.976)#H7:0.8::0.834,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.518::0.166):1.382,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.26):3.392):0.642):0.407):0.294):0.468):0.652):1.02):0.783):1.877)#H27:0.177::0.568):0.669,Xalvarezi):0.273,(Xsignum,#H27:2.599::0.432):6.817); +(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.443,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.804):0.371,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.993,Xcortezi):0.452):0.628,(#H26:::0.196,((Xcontinens,Xpygmaeus):1.887,(Xnigrensis,Xmultilineatus):1.392):0.043):2.407):1.984)#H7:0.78::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.555::0.165):1.415,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.263):3.384):0.634):0.408):0.295):0.466):0.655):1.016):0.787):1.889)#H27:0.159::0.574):0.651,Xalvarezi):0.279,(Xsignum,#H27:2.117::0.426):9.551); +(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.445,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.807):0.377,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.994,Xcortezi):0.451):0.626,((Xcontinens,Xpygmaeus):1.912,(#H26:::0.193,(Xnigrensis,Xmultilineatus):1.391):0.01):2.455):1.975)#H7:0.81::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.5::0.165):1.402,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.261):3.393):0.641):0.406):0.296):0.467):0.65):1.015):0.786):1.891)#H27:0.169::0.575):0.654,Xalvarezi):0.271,(Xsignum,#H27:2.065::0.425):9.401); +(Xgordoni,Xmeyeri,(Xcouchianus,((((Xxiphidium,#H25:9.982::0.166):1.391,(Xmilleri,(Xandersi,(Xmaculatus,((((Xhellerii,(Xalvarezi,Xmayae):0.331):0.255,Xsignum):1.85,(Xclemenciae_F2,Xmonticolus):1.444):0.785,((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.805):0.372,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.996,Xcortezi):0.451):0.63,(#H26:::0.195,((Xcontinens,Xpygmaeus):1.907,(Xnigrensis,Xmultilineatus):1.389):0.003):2.448):1.982)#H25:0.787::0.834):1.019):0.652):0.471):0.294):0.386,(Xevelynae,#H27:::0.067):6.572):0.747,(Xvariatus)#H27:::0.933):3.332):0.235); +(Xxiphidium,#H25:9.983::0.164,((Xmilleri,(Xandersi,(Xmaculatus,((((Xhellerii,((Xalvarezi,Xmayae):0.417)#H31:0.004::0.713):0.769,(Xsignum,#H31:0.103::0.287):7.966):1.626,(Xclemenciae_F2,Xmonticolus):1.445):0.789,((((Xcontinens,Xpygmaeus):1.888,(#H26:::0.184,(Xnigrensis,Xmultilineatus):0.885):0.339):2.46,(((Xbirchmanni_GARC,Xmalinche_CHIC2):1.0,Xcortezi):0.459,(Xmontezumae,(Xnezahuacoyotl)#H26:::0.816):0.363):0.623):1.972)#H25:0.784::0.836):1.008):0.651):0.479):0.294,(Xevelynae,(Xvariatus,((Xgordoni,Xmeyeri):0.283,Xcouchianus):3.348):0.644):0.404):1.455); +(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.448,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.807):0.373,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.996,Xcortezi):0.453):0.626,((Xcontinens,Xpygmaeus):1.905,(#H26:::0.193,(Xnigrensis,Xmultilineatus):1.402):0.002):2.455):1.985)#H7:0.786::0.834,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.542::0.166):1.385,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.265):3.386):0.637):0.406):0.295):0.47):0.651):1.02):0.785):1.895)#H27:0.147::0.575):0.655,Xalvarezi):0.262,(Xsignum,#H27:1.831::0.425):9.611); +(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.449,((((((Xbirchmanni_GARC,Xmalinche_CHIC2):0.99,Xcortezi):0.453,(Xmontezumae,(Xnezahuacoyotl)#H26:::0.803):0.375):0.63,(#H26:::0.197,((Xcontinens,Xpygmaeus):1.92,(Xnigrensis,Xmultilineatus):1.403):0.043):2.405):1.979)#H7:0.801::0.834,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.56::0.166):1.386,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.258):3.386):0.641):0.408):0.293):0.467):0.652):1.021):0.784):1.885)#H27:0.15::0.574):0.658,Xalvarezi):0.262,(Xsignum,#H27:3.318::0.426):9.998); +(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.449,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.806):0.374,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.998,Xcortezi):0.45):0.627,(#H26:::0.194,((Xnigrensis,Xmultilineatus):1.391,(Xcontinens,Xpygmaeus):1.919):0.0):2.451):1.981)#H7:0.798::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.424::0.165):1.412,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.267):3.386):0.638):0.409):0.295):0.467):0.651):1.02):0.784):1.88)#H27:0.169::0.572):0.669,Xalvarezi):0.271,(Xsignum,#H27:2.589::0.428):9.542); +(Xmayae,((Xsignum,(((Xclemenciae_F2,Xmonticolus):1.441,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.806):0.37,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.988,Xcortezi):0.454):0.628,(#H26:::0.194,((Xcontinens,Xpygmaeus):1.897,(Xnigrensis,Xmultilineatus):1.392):0.004):2.45):1.972)#H7:0.809::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.583::0.165):1.392,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.264):3.379):0.636):0.406):0.297):0.466):0.653):1.015):0.787):1.578)#H27:2.716::0.587):1.212,(#H27:6.196::0.413,Xhellerii):1.261):0.025,Xalvarezi); +(Xgordoni,Xmeyeri,(Xcouchianus,((Xvariatus,(Xevelynae,(((Xxiphidium,#H25:9.986::0.165):1.414,(Xmilleri,(Xandersi,(Xmaculatus,((((Xhellerii,(Xalvarezi,Xmayae):0.324):0.258,Xsignum):1.847,(Xclemenciae_F2,Xmonticolus):1.444):0.786,((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.806):0.371,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.995,Xcortezi):0.453):0.627,(#H26:::0.194,((Xcontinens,Xpygmaeus):1.914,(Xmultilineatus,Xnigrensis):1.391):0.001):2.449):1.97)#H25:0.81::0.835):1.016):0.65):0.467):0.294):0.106)#H27:0.374::0.972):0.741):4.188,#H27:0.008::0.028):0.956):0.278); +(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.451,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.805):0.375,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.992,Xcortezi):0.453):0.628,(#H26:::0.195,((Xcontinens,Xpygmaeus):1.903,(Xnigrensis,Xmultilineatus):1.403):0.019):2.434):1.976)#H7:0.799::0.834,(Xmaculatus,(Xandersi,(Xmilleri,(((Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.259):3.392):0.639,Xevelynae):0.41,(Xxiphidium,#H7:9.438::0.166):1.39):0.293):0.469):0.651):1.022):0.785):1.882)#H27:0.137::0.573):0.662,Xalvarezi):0.256,(Xsignum,#H27:4.136::0.427):7.944); +(Xmayae,((Xhellerii,(((Xmonticolus,Xclemenciae_F2):1.454,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.807):0.376,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.99,Xcortezi):0.454):0.626,((Xcontinens,Xpygmaeus):1.926,(#H26:::0.193,(Xnigrensis,Xmultilineatus):1.377):0.021):2.448):1.98)#H7:0.795::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.551::0.165):1.429,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.26):3.379):0.638):0.407):0.296):0.466):0.651):1.019):0.786):1.874)#H27:0.176::0.573):0.669,Xalvarezi):0.271,(Xsignum,#H27:2.925::0.427):7.584); +(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.446,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.805):0.37,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.99,Xcortezi):0.458):0.627,(#H26:::0.195,((Xcontinens,Xpygmaeus):1.91,(Xnigrensis,Xmultilineatus):1.383):0.021):2.435):1.98)#H7:0.795::0.834,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.527::0.166):1.398,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.257):3.397):0.637):0.409):0.296):0.466):0.653):1.021):0.785):1.876)#H27:0.187::0.575):0.658,Xalvarezi):0.268,(Xsignum,#H27:2.894::0.425):9.997); +(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.452,(((((Xmontezumae,(Xnezahuacoyotl)#H26:::0.805):0.377,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.983,Xcortezi):0.456):0.63,(#H26:::0.195,((Xcontinens,Xpygmaeus):1.891,(Xnigrensis,Xmultilineatus):1.397):0.041):2.416):1.973)#H7:0.814::0.834,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.569::0.166):1.396,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.262):3.379):0.64):0.409):0.295):0.466):0.653):1.021):0.784):1.895)#H27:0.147::0.574):0.651,Xalvarezi):0.271,(Xsignum,#H27:1.886::0.426):9.466); diff --git a/examples/genetrees_alleletips.tre b/examples/genetrees_alleletips.tre index 6e1a58ead..a7164a8cd 100644 --- a/examples/genetrees_alleletips.tre +++ b/examples/genetrees_alleletips.tre @@ -1,16 +1,16 @@ -(((S4:1.4835,S5:1.4835):0.7879,((S1C:0.014,S1B:0.014):1.251,(S3:0.7704,S1A:0.7704):0.4946):1.0064):0.1762,S2:2.4476); -(((S3:1.2587,(S1C:0.6223,(S1A:0.1231,S1B:0.1231):0.4992):0.6364):1.1552,(S5:1.0332,S4:1.0332):1.3807):0.1454,S2:2.5592); -((S3:2.6379,(S4:0.8263,S5:0.8263):1.8116):0.212,((S1A:0.8435,(S1B:0.0441,S1C:0.0441):0.7995):0.8692,S2:1.7127):1.1372); -(S2:3.1288,(((S1A:0.2974,S1C:0.2974):0.4802,S3:0.7776):1.9636,(S1B:2.129,(S5:0.8288,S4:0.8288):1.3002):0.6122):0.3876); -(((S5:2.098,S4:2.098):0.6214,((S3:0.7126,(S1B:0.5033,S1A:0.5033):0.2094):0.8673,S1C:1.58):1.1394):0.8885,S2:3.6079); -((((S1B:1.2942,S1A:1.2942):0.8796,(S4:1.3542,S5:1.3542):0.8195):0.2455,(S3:0.9679,S1C:0.9679):1.4514):2.9787,S2:5.398); -((((S1B:0.0372,S1A:0.0372):1.2205,S1C:1.2577):0.2329,S3:1.4906):0.9159,(S2:1.932,(S5:0.9554,S4:0.9554):0.9766):0.4745); -(S3:4.6311,(((S2:1.4604,S5:1.4604):0.4353,S4:1.8957):0.2433,(S1C:0.1665,(S1A:0.1024,S1B:0.1024):0.0642):1.9725):2.4921); -((S2:1.4673,(S5:0.7265,S4:0.7265):0.7409):1.0067,(S3:2.1067,((S1B:0.2711,S1C:0.2711):1.0749,S1A:1.3461):0.7606):0.3673); -((((S1B:0.0573,S1C:0.0573):0.3884,S1A:0.4457):0.4876,S3:0.9333):1.9679,((S4:1.5713,S5:1.5713):0.9966,S2:2.568):0.3333); -((S1A:3.036,((S5:0.7604,S4:0.7604):1.6442,(S3:1.1176,(S1C:0.0465,S1B:0.0465):1.0711):1.287):0.6314):1.7552,S2:4.7912); -((S2:1.4523,((S1B:0.4758,(S1A:0.0138,S1C:0.0138):0.462):0.3946,S3:0.8704):0.5818):1.3858,(S5:1.6356,S4:1.6356):1.2024); -((S2:2.3144,(S4:0.7552,S5:0.7552):1.5592):0.8309,(S3:1.1027,((S1A:0.1344,S1C:0.1344):0.5612,S1B:0.6956):0.4071):2.0425); -(((S5:1.5464,S4:1.5464):1.9521,((S1B:0.6516,(S1A:0.0281,S1C:0.0281):0.6235):0.172,S3:0.8236):2.6749):1.8799,S2:5.3785); -(((S4:1.5191,S2:1.5191):0.7628,((S1A:1.1262,(S1B:0.3126,S1C:0.3126):0.8135):0.0776,S3:1.2038):1.0782):2.4257,S5:4.7076); -(((S3:1.8527,(S1C:1.2485,(S1B:0.4803,S1A:0.4803):0.7682):0.6042):0.4991,(S5:1.7785,S4:1.7785):0.5734):0.1705,S2:2.5224); +(((S4:1.4835,S5:1.4835):0.7879,((S1C:0.014,S1B:0.014):1.251,(S3:0.7704,S1A:0.7704):0.4946):1.0064):0.1762,S2:2.4476); +(((S3:1.2587,(S1C:0.6223,(S1A:0.1231,S1B:0.1231):0.4992):0.6364):1.1552,(S5:1.0332,S4:1.0332):1.3807):0.1454,S2:2.5592); +((S3:2.6379,(S4:0.8263,S5:0.8263):1.8116):0.212,((S1A:0.8435,(S1B:0.0441,S1C:0.0441):0.7995):0.8692,S2:1.7127):1.1372); +(S2:3.1288,(((S1A:0.2974,S1C:0.2974):0.4802,S3:0.7776):1.9636,(S1B:2.129,(S5:0.8288,S4:0.8288):1.3002):0.6122):0.3876); +(((S5:2.098,S4:2.098):0.6214,((S3:0.7126,(S1B:0.5033,S1A:0.5033):0.2094):0.8673,S1C:1.58):1.1394):0.8885,S2:3.6079); +((((S1B:1.2942,S1A:1.2942):0.8796,(S4:1.3542,S5:1.3542):0.8195):0.2455,(S3:0.9679,S1C:0.9679):1.4514):2.9787,S2:5.398); +((((S1B:0.0372,S1A:0.0372):1.2205,S1C:1.2577):0.2329,S3:1.4906):0.9159,(S2:1.932,(S5:0.9554,S4:0.9554):0.9766):0.4745); +(S3:4.6311,(((S2:1.4604,S5:1.4604):0.4353,S4:1.8957):0.2433,(S1C:0.1665,(S1A:0.1024,S1B:0.1024):0.0642):1.9725):2.4921); +((S2:1.4673,(S5:0.7265,S4:0.7265):0.7409):1.0067,(S3:2.1067,((S1B:0.2711,S1C:0.2711):1.0749,S1A:1.3461):0.7606):0.3673); +((((S1B:0.0573,S1C:0.0573):0.3884,S1A:0.4457):0.4876,S3:0.9333):1.9679,((S4:1.5713,S5:1.5713):0.9966,S2:2.568):0.3333); +((S1A:3.036,((S5:0.7604,S4:0.7604):1.6442,(S3:1.1176,(S1C:0.0465,S1B:0.0465):1.0711):1.287):0.6314):1.7552,S2:4.7912); +((S2:1.4523,((S1B:0.4758,(S1A:0.0138,S1C:0.0138):0.462):0.3946,S3:0.8704):0.5818):1.3858,(S5:1.6356,S4:1.6356):1.2024); +((S2:2.3144,(S4:0.7552,S5:0.7552):1.5592):0.8309,(S3:1.1027,((S1A:0.1344,S1C:0.1344):0.5612,S1B:0.6956):0.4071):2.0425); +(((S5:1.5464,S4:1.5464):1.9521,((S1B:0.6516,(S1A:0.0281,S1C:0.0281):0.6235):0.172,S3:0.8236):2.6749):1.8799,S2:5.3785); +(((S4:1.5191,S2:1.5191):0.7628,((S1A:1.1262,(S1B:0.3126,S1C:0.3126):0.8135):0.0776,S3:1.2038):1.0782):2.4257,S5:4.7076); +(((S3:1.8527,(S1C:1.2485,(S1B:0.4803,S1A:0.4803):0.7682):0.6042):0.4991,(S5:1.7785,S4:1.7785):0.5734):0.1705,S2:2.5224); diff --git a/examples/graph.dot b/examples/graph.dot index fcdbb3ed6..230876ebc 100644 --- a/examples/graph.dot +++ b/examples/graph.dot @@ -1,10 +1,10 @@ -graph { - a -- b; - a -- c; - b -- d; - b -- e; - c -- f; - c -- g; - f -- h; - f -- i; +graph { + a -- b; + a -- c; + b -- d; + b -- e; + c -- f; + c -- g; + f -- h; + f -- i; } \ No newline at end of file diff --git a/examples/individuals.aln b/examples/individuals.aln index 86200f34a..83dafba11 100644 --- a/examples/individuals.aln +++ b/examples/individuals.aln @@ -1,20 +1,20 @@ ->S1A -GCGCCGAC ->S1B -GCGCCGAG ->S1C -GCGCCGCC ->S4 -GTAACGAG ->S5 -GCAGAGAA ->S6 -GCAGCGCT ->S7 -GTAACGCC ->S8 -GTAACGAC ->S9 -GGAGCGAT ->S10 -GTAGCGAT +>S1A +GCGCCGAC +>S1B +GCGCCGAG +>S1C +GCGCCGCC +>S4 +GTAACGAG +>S5 +GCAGAGAA +>S6 +GCAGCGCT +>S7 +GTAACGCC +>S8 +GTAACGAC +>S9 +GGAGCGAT +>S10 +GTAGCGAT diff --git a/examples/lizard_trait.txt b/examples/lizard_trait.txt index 8f5349f1a..e4486bad8 100644 --- a/examples/lizard_trait.txt +++ b/examples/lizard_trait.txt @@ -1,101 +1,101 @@ -"tipNames","AVG_SVL","AVG_ltoe_IV","AVG_lfing_IV","region" -"ahli",4.039125443,2.553343811,1.943287666,0 -"alayoni",3.815704818,1.875257738,1.40302856,0 -"alfaroi",3.526654599,1.73254011,1.040276712,0 -"aliniger",4.036556538,2.256541154,1.702199393,1 -"allisoni",4.375390078,2.533696814,1.983412353,0 -"allogus",4.040138442,2.494900405,1.919010215,0 -"altitudinalis",3.842994419,1.786746927,1.349371007,0 -"alumina",3.588940722,1.991390664,1.179972809,1 -"alutaceus",3.554890814,1.86392508,1.133335725,0 -"angusticeps",3.788595498,1.813660733,1.270161748,0 -"argenteolus",3.971307363,2.365054167,1.763148935,0 -"argillaceus",3.757868992,2.002830439,1.467413412,0 -"armouri",4.121684075,2.580141069,1.938597764,1 -"bahorucoensis",3.827445029,2.261033666,1.538800833,1 -"baleatus",5.05305601,3.333632062,2.79766236,1 -"baracoae",5.042779747,3.320276511,2.757792293,0 -"barahonae",5.076957937,3.350305009,2.842248038,1 -"barbatus",5.003946306,3.142282716,2.759798947,0 -"barbouri",3.663931948,2.012084237,1.443252138,1 -"bartschi",4.280547466,2.655735652,2.110103001,0 -"bremeri",4.113370744,2.543110042,1.891981807,0 -"breslini",4.051110808,2.478951453,1.851206928,1 -"brevirostris",3.874154977,2.186725207,1.720979287,1 -"caudalis",3.911742966,2.144761008,1.698547088,1 -"centralis",3.697941213,1.878206962,1.330968178,0 -"chamaeleonides",5.04234927,3.148167197,2.791778417,0 -"chlorocyanus",4.275448057,2.538772612,1.976365995,1 -"christophei",3.884651809,2.387057535,1.867065703,1 -"clivicola",3.758726128,2.134905813,1.503521687,0 -"coelestinus",4.297965447,2.563339671,1.956760165,1 -"confusus",3.938442349,2.320144309,1.744717776,0 -"cooki",4.091535064,2.436241478,1.856818688,3 -"cristatellus",4.189820018,2.599384566,2.027071112,3 -"cupeyalensis",3.462013706,1.65653352,0.956365781,0 -"cuvieri",4.875011919,3.238062016,2.725422239,3 -"cyanopleurus",3.630161001,2.019485099,1.299585969,0 -"cybotes",4.210982161,2.650870397,2.035418406,1 -"darlingtoni",4.302036009,2.427454075,1.925707442,1 -"distichus",3.928795837,2.301298551,1.80194551,1 -"dolichocephalus",3.908550316,2.267475916,1.494027061,1 -"equestris",5.113993807,3.30953886,2.821031604,0 -"etheridgei",3.657990601,2.278975227,1.552514765,1 -"eugenegrahami",4.128504414,2.684781574,2.089391873,1 -"evermanni",4.165605231,2.613373154,2.015569465,3 -"fowleri",4.288779949,2.704544062,2.115652924,1 -"garmani",4.769473237,3.107656912,2.525042695,2 -"grahami",4.154274265,2.491787683,1.922578854,2 -"guafe",3.87745744,2.230954818,1.658942107,0 -"guamuhaya",5.036952602,3.238286218,2.841998174,0 -"guazuma",3.76388385,1.59240478,1.094901709,0 -"gundlachi",4.18810472,2.702255667,2.070372767,3 -"haetianus",4.316542212,2.823972922,2.193784323,1 -"hendersoni",3.859834574,2.264190705,1.508143194,1 -"homolechis",4.032805981,2.443650533,1.881752508,0 -"imias",4.099687407,2.489538762,1.926331986,0 -"inexpectatus",3.537438641,1.812582817,1.031403539,0 -"insolitus",3.80047052,1.856645152,1.337337516,1 -"isolepis",3.657087744,1.598039867,1.148988496,0 -"jubar",3.952604971,2.309477949,1.725738368,0 -"krugi",3.886500048,2.332338051,1.627670681,3 -"lineatopus",4.128611788,2.585505848,1.984901898,2 -"longitibialis",4.242103429,2.617979604,2.0589837,1 -"loysiana",3.701240244,1.894240844,1.418277407,0 -"lucius",4.198914766,2.616957781,2.140066163,0 -"luteogularis",5.101085197,3.346670796,2.832095072,0 -"macilentus",3.715764783,1.909542505,1.252762968,0 -"marcanoi",4.079484699,2.518985963,1.901062204,1 -"marron",3.831810283,2.143120318,1.662409797,1 -"mestrei",3.987147344,2.371347635,1.785527973,0 -"monticola",3.770613039,2.325976046,1.642872689,1 -"noblei",5.083472618,3.314549575,2.832428723,0 -"occultus",3.663048694,1.457451555,0.972671065,3 -"olssoni",3.79389884,2.275140483,1.406096988,1 -"opalinus",3.838376465,2.25800605,1.673726402,2 -"ophiolepis",3.637962029,1.986895396,1.279345283,0 -"oporinus",3.845669505,1.74745921,1.366091654,0 -"paternus",3.802961204,1.957979873,1.398716881,0 -"placidus",3.773967107,1.549687908,1.129787906,1 -"poncensis",3.820377531,2.183640669,1.468532459,3 -"porcatus",4.258990989,2.429091871,1.860974538,0 -"porcus",5.038034268,3.117876157,2.729594231,0 -"pulchellus",3.799022266,2.187454786,1.522244701,3 -"pumilis",3.46686027,1.588009965,1.088561953,0 -"quadriocellifer",3.901619072,2.25627934,1.690326416,0 -"reconditus",4.482606994,3.087171334,2.498768463,2 -"ricordii",5.013963084,3.359101428,2.839760492,1 -"rubribarbus",4.078469213,2.504055469,1.916628451,0 -"sagrei",4.067161768,2.476118144,1.836892159,0 -"semilineatus",3.696630586,2.201935685,1.323753843,1 -"sheplani",3.682924257,1.239822457,0.884800065,1 -"shrevei",3.983003234,2.422410486,1.776984184,1 -"singularis",4.057997494,2.332143895,1.755556421,1 -"smallwoodi",5.035095592,3.302691625,2.741300747,0 -"strahmi",4.274271278,2.654571284,2.074289403,1 -"stratulus",3.869880695,2.185301932,1.677096561,3 -"valencienni",4.321524401,2.378465303,1.869234781,2 -"vanidicus",3.62620586,1.77579945,1.067293605,0 -"vermiculatus",4.802849398,3.229900543,2.606386547,0 -"websteri",3.916546094,2.204604685,1.7275172,1 -"whitemani",4.097478535,2.51244075,1.881752508,1 +"tipNames","AVG_SVL","AVG_ltoe_IV","AVG_lfing_IV","region" +"ahli",4.039125443,2.553343811,1.943287666,0 +"alayoni",3.815704818,1.875257738,1.40302856,0 +"alfaroi",3.526654599,1.73254011,1.040276712,0 +"aliniger",4.036556538,2.256541154,1.702199393,1 +"allisoni",4.375390078,2.533696814,1.983412353,0 +"allogus",4.040138442,2.494900405,1.919010215,0 +"altitudinalis",3.842994419,1.786746927,1.349371007,0 +"alumina",3.588940722,1.991390664,1.179972809,1 +"alutaceus",3.554890814,1.86392508,1.133335725,0 +"angusticeps",3.788595498,1.813660733,1.270161748,0 +"argenteolus",3.971307363,2.365054167,1.763148935,0 +"argillaceus",3.757868992,2.002830439,1.467413412,0 +"armouri",4.121684075,2.580141069,1.938597764,1 +"bahorucoensis",3.827445029,2.261033666,1.538800833,1 +"baleatus",5.05305601,3.333632062,2.79766236,1 +"baracoae",5.042779747,3.320276511,2.757792293,0 +"barahonae",5.076957937,3.350305009,2.842248038,1 +"barbatus",5.003946306,3.142282716,2.759798947,0 +"barbouri",3.663931948,2.012084237,1.443252138,1 +"bartschi",4.280547466,2.655735652,2.110103001,0 +"bremeri",4.113370744,2.543110042,1.891981807,0 +"breslini",4.051110808,2.478951453,1.851206928,1 +"brevirostris",3.874154977,2.186725207,1.720979287,1 +"caudalis",3.911742966,2.144761008,1.698547088,1 +"centralis",3.697941213,1.878206962,1.330968178,0 +"chamaeleonides",5.04234927,3.148167197,2.791778417,0 +"chlorocyanus",4.275448057,2.538772612,1.976365995,1 +"christophei",3.884651809,2.387057535,1.867065703,1 +"clivicola",3.758726128,2.134905813,1.503521687,0 +"coelestinus",4.297965447,2.563339671,1.956760165,1 +"confusus",3.938442349,2.320144309,1.744717776,0 +"cooki",4.091535064,2.436241478,1.856818688,3 +"cristatellus",4.189820018,2.599384566,2.027071112,3 +"cupeyalensis",3.462013706,1.65653352,0.956365781,0 +"cuvieri",4.875011919,3.238062016,2.725422239,3 +"cyanopleurus",3.630161001,2.019485099,1.299585969,0 +"cybotes",4.210982161,2.650870397,2.035418406,1 +"darlingtoni",4.302036009,2.427454075,1.925707442,1 +"distichus",3.928795837,2.301298551,1.80194551,1 +"dolichocephalus",3.908550316,2.267475916,1.494027061,1 +"equestris",5.113993807,3.30953886,2.821031604,0 +"etheridgei",3.657990601,2.278975227,1.552514765,1 +"eugenegrahami",4.128504414,2.684781574,2.089391873,1 +"evermanni",4.165605231,2.613373154,2.015569465,3 +"fowleri",4.288779949,2.704544062,2.115652924,1 +"garmani",4.769473237,3.107656912,2.525042695,2 +"grahami",4.154274265,2.491787683,1.922578854,2 +"guafe",3.87745744,2.230954818,1.658942107,0 +"guamuhaya",5.036952602,3.238286218,2.841998174,0 +"guazuma",3.76388385,1.59240478,1.094901709,0 +"gundlachi",4.18810472,2.702255667,2.070372767,3 +"haetianus",4.316542212,2.823972922,2.193784323,1 +"hendersoni",3.859834574,2.264190705,1.508143194,1 +"homolechis",4.032805981,2.443650533,1.881752508,0 +"imias",4.099687407,2.489538762,1.926331986,0 +"inexpectatus",3.537438641,1.812582817,1.031403539,0 +"insolitus",3.80047052,1.856645152,1.337337516,1 +"isolepis",3.657087744,1.598039867,1.148988496,0 +"jubar",3.952604971,2.309477949,1.725738368,0 +"krugi",3.886500048,2.332338051,1.627670681,3 +"lineatopus",4.128611788,2.585505848,1.984901898,2 +"longitibialis",4.242103429,2.617979604,2.0589837,1 +"loysiana",3.701240244,1.894240844,1.418277407,0 +"lucius",4.198914766,2.616957781,2.140066163,0 +"luteogularis",5.101085197,3.346670796,2.832095072,0 +"macilentus",3.715764783,1.909542505,1.252762968,0 +"marcanoi",4.079484699,2.518985963,1.901062204,1 +"marron",3.831810283,2.143120318,1.662409797,1 +"mestrei",3.987147344,2.371347635,1.785527973,0 +"monticola",3.770613039,2.325976046,1.642872689,1 +"noblei",5.083472618,3.314549575,2.832428723,0 +"occultus",3.663048694,1.457451555,0.972671065,3 +"olssoni",3.79389884,2.275140483,1.406096988,1 +"opalinus",3.838376465,2.25800605,1.673726402,2 +"ophiolepis",3.637962029,1.986895396,1.279345283,0 +"oporinus",3.845669505,1.74745921,1.366091654,0 +"paternus",3.802961204,1.957979873,1.398716881,0 +"placidus",3.773967107,1.549687908,1.129787906,1 +"poncensis",3.820377531,2.183640669,1.468532459,3 +"porcatus",4.258990989,2.429091871,1.860974538,0 +"porcus",5.038034268,3.117876157,2.729594231,0 +"pulchellus",3.799022266,2.187454786,1.522244701,3 +"pumilis",3.46686027,1.588009965,1.088561953,0 +"quadriocellifer",3.901619072,2.25627934,1.690326416,0 +"reconditus",4.482606994,3.087171334,2.498768463,2 +"ricordii",5.013963084,3.359101428,2.839760492,1 +"rubribarbus",4.078469213,2.504055469,1.916628451,0 +"sagrei",4.067161768,2.476118144,1.836892159,0 +"semilineatus",3.696630586,2.201935685,1.323753843,1 +"sheplani",3.682924257,1.239822457,0.884800065,1 +"shrevei",3.983003234,2.422410486,1.776984184,1 +"singularis",4.057997494,2.332143895,1.755556421,1 +"smallwoodi",5.035095592,3.302691625,2.741300747,0 +"strahmi",4.274271278,2.654571284,2.074289403,1 +"stratulus",3.869880695,2.185301932,1.677096561,3 +"valencienni",4.321524401,2.378465303,1.869234781,2 +"vanidicus",3.62620586,1.77579945,1.067293605,0 +"vermiculatus",4.802849398,3.229900543,2.606386547,0 +"websteri",3.916546094,2.204604685,1.7275172,1 +"whitemani",4.097478535,2.51244075,1.881752508,1 diff --git a/examples/lizard_tree.txt b/examples/lizard_tree.txt index f5d0bbbe5..93e880b9d 100644 --- a/examples/lizard_tree.txt +++ b/examples/lizard_tree.txt @@ -1 +1 @@ -((((((((ahli:6.544436481,allogus:6.544436481):5.45394495,rubribarbus:11.99838143):17.38620364,imias:29.38458508):6.398895957,((((sagrei:12.88102021,(bremeri:5.487182621,quadriocellifer:5.487182621):7.39383759):3.075299922,ophiolepis:15.95632013):4.36096088,mestrei:20.31728101):6.490702506,(((jubar:5.943297621,homolechis:5.943297621):4.526135954,confusus:10.46943358):2.107788591,guafe:12.57722217):14.23076135):8.975497514):6.886185624,((((garmani:10.00167905,opalinus:10.00167905):0.9843599411,grahami:10.98603899):10.8904957,valencienni:21.87653468):6.130643032,(lineatopus:23.56855311,reconditus:23.56855311):4.438624604):14.66248894):3.351759762,(((evermanni:10.67601358,stratulus:10.67601358):17.60760293,(((krugi:16.33780327,pulchellus:16.33780327):6.564651854,(gundlachi:19.32330063,poncensis:19.32330063):3.57915449):1.517539033,(cooki:19.7644096,cristatellus:19.7644096):4.655584552):3.863622354):7.477878776,(((brevirostris:13.78711733,(caudalis:8.524873097,marron:8.524873097):5.262244234):1.336374726,websteri:15.12349206):4.917874343,distichus:20.0413664):15.72012888):10.25993114):1.744366152,(((barbouri:40.10542509,(((alumina:13.40538439,semilineatus:13.40538439):10.9683589,olssoni:24.37374329):13.11118303,(etheridgei:29.41536076,(fowleri:18.854692,insolitus:18.854692):10.56066875):8.069565566):2.620498769):3.360194845,((((whitemani:17.10135633,((haetianus:13.34917036,breslini:13.34917036):3.481091738,((armouri:7.419547631,cybotes:7.419547631):2.208359111,shrevei:9.627906742):7.202355359):0.2710942246):5.332800474,(longitibialis:12.60626673,strahmi:12.60626673):9.827890069):4.571501266,marcanoi:27.00565807):12.52637604,((((((baleatus:2.086522712,barahonae:2.086522712):2.631837766,ricordii:4.718360478):10.18010755,eugenegrahami:14.89846803):4.255550995,christophei:19.15401903):4.547667011,cuvieri:23.70168604):5.381927504,(barbatus:7.339713347,(porcus:4.655292118,(chamaeleonides:3.815118093,guamuhaya:3.815118093):0.8401740246):2.68442123):21.74390019):10.44842056):3.933585836):3.798999624,((((((((altitudinalis:8.744497094,oporinus:8.744497094):4.610159031,isolepis:13.35465613):12.69460446,(allisoni:14.8011465,porcatus:14.8011465):11.24811409):1.851745599,(((argillaceus:5.710826139,centralis:5.710826139):1.24881222,pumilis:6.959638359):11.78128137,loysiana:18.74091973):9.160086453):4.261431265,guazuma:32.16243745):2.322058746,((placidus:9.347897895,sheplani:9.347897895):18.86829905,(alayoni:18.96909033,(angusticeps:10.86063481,paternus:10.86063481):8.10845552):9.247106617):6.26829925):3.943522271,((alutaceus:6.04309845,inexpectatus:6.04309845):20.21257905,(((clivicola:16.79799015,(cupeyalensis:4.303151532,cyanopleurus:4.303151532):12.49483861):5.948682113,(alfaroi:14.0116969,macilentus:14.0116969):8.734975363):0.461393415,vanidicus:23.20806568):3.047611821):12.17234097):4.717657381,(argenteolus:32.82165973,lucius:32.82165973):10.32401612):4.118943716):0.5011730105):2.234207429,(((bartschi:26.23626837,vermiculatus:26.23626837):12.4729884,((((baracoae:2.926988768,(noblei:1.070308761,smallwoodi:1.070308761):1.856680007):1.424582119,luteogularis:4.351570887):0.89496035,equestris:5.246531237):31.48597248,(((monticola:30.27768839,(bahorucoensis:19.20550341,(dolichocephalus:7.546354666,hendersoni:7.546354666):11.65914875):11.07218498):1.574600858,darlingtoni:31.85228925):1.644368006,(((aliniger:8.917713736,singularis:8.917713736):6.885287536,chlorocyanus:15.80300127):10.67813301,coelestinus:26.48113428):7.015522978):3.235846465):1.976753045):6.037411928,occultus:44.74666869):5.253331306); +((((((((ahli:6.544436481,allogus:6.544436481):5.45394495,rubribarbus:11.99838143):17.38620364,imias:29.38458508):6.398895957,((((sagrei:12.88102021,(bremeri:5.487182621,quadriocellifer:5.487182621):7.39383759):3.075299922,ophiolepis:15.95632013):4.36096088,mestrei:20.31728101):6.490702506,(((jubar:5.943297621,homolechis:5.943297621):4.526135954,confusus:10.46943358):2.107788591,guafe:12.57722217):14.23076135):8.975497514):6.886185624,((((garmani:10.00167905,opalinus:10.00167905):0.9843599411,grahami:10.98603899):10.8904957,valencienni:21.87653468):6.130643032,(lineatopus:23.56855311,reconditus:23.56855311):4.438624604):14.66248894):3.351759762,(((evermanni:10.67601358,stratulus:10.67601358):17.60760293,(((krugi:16.33780327,pulchellus:16.33780327):6.564651854,(gundlachi:19.32330063,poncensis:19.32330063):3.57915449):1.517539033,(cooki:19.7644096,cristatellus:19.7644096):4.655584552):3.863622354):7.477878776,(((brevirostris:13.78711733,(caudalis:8.524873097,marron:8.524873097):5.262244234):1.336374726,websteri:15.12349206):4.917874343,distichus:20.0413664):15.72012888):10.25993114):1.744366152,(((barbouri:40.10542509,(((alumina:13.40538439,semilineatus:13.40538439):10.9683589,olssoni:24.37374329):13.11118303,(etheridgei:29.41536076,(fowleri:18.854692,insolitus:18.854692):10.56066875):8.069565566):2.620498769):3.360194845,((((whitemani:17.10135633,((haetianus:13.34917036,breslini:13.34917036):3.481091738,((armouri:7.419547631,cybotes:7.419547631):2.208359111,shrevei:9.627906742):7.202355359):0.2710942246):5.332800474,(longitibialis:12.60626673,strahmi:12.60626673):9.827890069):4.571501266,marcanoi:27.00565807):12.52637604,((((((baleatus:2.086522712,barahonae:2.086522712):2.631837766,ricordii:4.718360478):10.18010755,eugenegrahami:14.89846803):4.255550995,christophei:19.15401903):4.547667011,cuvieri:23.70168604):5.381927504,(barbatus:7.339713347,(porcus:4.655292118,(chamaeleonides:3.815118093,guamuhaya:3.815118093):0.8401740246):2.68442123):21.74390019):10.44842056):3.933585836):3.798999624,((((((((altitudinalis:8.744497094,oporinus:8.744497094):4.610159031,isolepis:13.35465613):12.69460446,(allisoni:14.8011465,porcatus:14.8011465):11.24811409):1.851745599,(((argillaceus:5.710826139,centralis:5.710826139):1.24881222,pumilis:6.959638359):11.78128137,loysiana:18.74091973):9.160086453):4.261431265,guazuma:32.16243745):2.322058746,((placidus:9.347897895,sheplani:9.347897895):18.86829905,(alayoni:18.96909033,(angusticeps:10.86063481,paternus:10.86063481):8.10845552):9.247106617):6.26829925):3.943522271,((alutaceus:6.04309845,inexpectatus:6.04309845):20.21257905,(((clivicola:16.79799015,(cupeyalensis:4.303151532,cyanopleurus:4.303151532):12.49483861):5.948682113,(alfaroi:14.0116969,macilentus:14.0116969):8.734975363):0.461393415,vanidicus:23.20806568):3.047611821):12.17234097):4.717657381,(argenteolus:32.82165973,lucius:32.82165973):10.32401612):4.118943716):0.5011730105):2.234207429,(((bartschi:26.23626837,vermiculatus:26.23626837):12.4729884,((((baracoae:2.926988768,(noblei:1.070308761,smallwoodi:1.070308761):1.856680007):1.424582119,luteogularis:4.351570887):0.89496035,equestris:5.246531237):31.48597248,(((monticola:30.27768839,(bahorucoensis:19.20550341,(dolichocephalus:7.546354666,hendersoni:7.546354666):11.65914875):11.07218498):1.574600858,darlingtoni:31.85228925):1.644368006,(((aliniger:8.917713736,singularis:8.917713736):6.885287536,chlorocyanus:15.80300127):10.67813301,coelestinus:26.48113428):7.015522978):3.235846465):1.976753045):6.037411928,occultus:44.74666869):5.253331306); diff --git a/examples/mappingIndividuals.csv b/examples/mappingIndividuals.csv index 5c25880d3..93f52e924 100644 --- a/examples/mappingIndividuals.csv +++ b/examples/mappingIndividuals.csv @@ -1,4 +1,4 @@ -species,individual -S1,S1A -S1,S1B -S1,S1C +species,individual +S1,S1A +S1,S1B +S1,S1C diff --git a/examples/multitrees.newick b/examples/multitrees.newick index c4d4dc2b7..db98a49b8 100644 --- a/examples/multitrees.newick +++ b/examples/multitrees.newick @@ -1,25 +1,25 @@ -(((((A:0.3288238,B:0.2918835):0.4361477,C:0.3792959):0.003643581,(D:0.3097247,E:0.4068338):0.2102197):0.04950544,((F:0.1412025,G:0.2318505):0.008241366,H:0.1935274):0.1739941):1.0125409999999999,(((I:0.1470873,J:0.3919584):0.3187084,((((K:0.0946427,L:0.1115708):0.6085673,M:0.4190818):0.09234778,N:0.2489648):0.6775118999999999,O:0.4406936):0.09562053):0.05605804,(((P:0.884834,Q:0.2676903):5.4935590000000003,R:0.8639786):2.4373819999999999,(S:0.3984634,T:0.1073821):0.222171):0.1281091):0.6167975999999999,U:0.3250855); -(((B:0.09686483,A:0.3890754):0.4162531,((D:0.3388085,E:0.1720759):0.2053304,(C:0.1439899,(H:0.2572135,(G:0.07524632,F:0.04657637):0.0957444):0.2493241):0.03575535):0.009743879):0.5106113,((O:0.7361103,((K:0.03640399,L:0.08567879):0.1671401,((M:0.06917792,((P:0.5665801,Q:1.223662):3.4727209999999999,R:0.8587814):2.1126490000000002):0.5105899,N:0.1877777):0.1188038):0.1391816):0.05218651,((J:0.1658793,I:0.363798):0.3425552,(T:0.108799,S:0.2586355):0.2565037):0.07308882):0.303016,U:0.5117269); -((((((K:0.02680416,L:0.002917274):0.06638755,N:0.07180777):0.03866009,M:0.2944167):0.1082545,O:0.3091584):0.0004383381,((I:0.2520902,J:0.1332406):0.004783442,(T:0.0648956,(((P:0.03391384,Q:0.3898904):2.3455910000000002,R:0.5742912999999999):0.1879835,S:0.1874321):0.1116222):0.09270509):0.05674053):0.2763289,(((E:0.1222881,D:0.1286296):0.06138859,((H:0.1606345,(F:0.04446944,G:0.06924655):0.06249782):0.006877863,C:0.1311078):0.0008405476):0.009564842,(B:0.04580021,A:0.09110923):0.1133466):0.3585744,U:0.1533016); -(((((D:0.2574838,E:0.1782664):0.08975371,(A:0.322324,B:0.2708482):0.3803372):0.2237248,(H:0.1895854,(G:0.2002425,F:0.06981753):0.08250984):0.09387173):0.1550494,C:0.4761395):0.6224255,(((((L:0.1295513,K:0.02803722):0.1627941,(M:0.3922207,N:0.5483872):0.05674886):0.267483,(R:0.4825068,(Q:1.069331,P:0.171919):5.1710960000000004):0.7405272000000001):0.148598,((S:0.3500563,T:0.4365044):0.04835447,(I:0.3215418,J:0.2348189):0.2859957):0.3426698):0.113154,O:0.6172298000000001):0.1712725,U:0.3338107); -(((O:0.4988308,((I:0.1161714,J:0.131168):0.1106991,(S:0.2577152,T:0.05229496):0.04011852):0.123588):0.04122307,((K:0.1709085,L:0.0437965):0.241535,(N:0.2072706,(M:0.0859415,(R:0.04344059,(Q:0.6667812,P:0.01320633):2.2651189999999999):0.4548582):0.3214642):0.05557312):0.07871877):0.145779,(((C:0.1430088,(A:0.1552472,B:0.1058797):0.118452):0.06366744,(H:0.09919252,(F:0.05769237,G:0.1025198):0.09375484):0.00904366):0.01630814,(E:0.2170819,D:0.07064916):0.08176492):0.2291632,U:0.2325669); -(((((((R:1.563461,(Q:0.6255352,P:0.02058508):4.429665):1.2012499999999999,S:0.1249973):0.3372651,T:0.02060359):0.1848621,(I:0.4231855,J:0.1859687):0.2112335):0.08164969,O:0.3771121):0.01827364,((M:0.3362717,(K:0.01062223,L:0.02225963):0.2448778):0.11029,N:0.3248849):0.2225906):0.221209,(((A:0.2870172,B:0.1128748):0.3046851,(C:0.1170267,((G:0.1498071,F:0.08218757):0.04990381,H:0.1531857):0.1032663):0.04967551):0.05672676,(D:0.1867089,E:0.250547):0.1154678):0.5973596,U:0.3443973); -((((((M:0.8901319,((Q:4.0006870000000001,P:0.4042283):8.2014940000000003,R:1.645526):3.2699229999999999):0.453345,(L:0.01992847,K:0.1747246):1.1523950000000001):0.8269796,N:0.4006189):0.2755791,((J:0.2923134,I:1.2256309999999999):0.2275196,(T:0.3091149,S:0.1758831):0.2329641):0.05471782):0.01187946,O:1.6809289999999999):0.4900893,(((C:0.6796999,(A:1.1100680000000001,B:0.2955573):0.4746932):0.1474301,(H:0.4167583,(F:0.2666716,G:0.2493168):0.2403236):0.3947126):0.2065674,(E:0.7650963,D:0.357805):0.08512503):1.3011029999999999,U:0.780047); -((((M:0.742889,(K:0.03040715,L:0.2146761):0.1217704):0.013882,N:0.1210335):0.2817908,(((I:0.3638432,J:0.3330106):0.2509193,(T:0.0935607,(S:0.4568686,((Q:0.6377275,P:0.3067296):6.9213740000000001,R:0.7176116):1.5434730000000001):0.3039295):0.05350973):0.06166159,O:0.754298):0.003154333):0.3605294,((((D:0.3035107,E:0.3760969):0.1994374,C:0.3358883):0.009716007,(H:0.1864209,(G:0.2582129,F:0.1543829):0.07089903):0.06214097):0.09331232,(A:0.2980277,B:0.107342):0.2359019):0.5962275,U:0.3344094); -(((C:1.328052,(E:1.7984640000000001,D:0.4130508):0.6671453000000001):0.04405637,((A:0.5213907,B:0.9439283000000001):1.6688449999999999,(H:0.7479213,(G:0.473344,F:0.5388085):0.2387505):0.2239982):0.1064419):1.9334499999999999,(((((K:0.1969274,L:0.2448157):1.4249810000000001,M:2.7011440000000002):0.2284023,N:1.1499950000000001):0.2772314,O:2.3842590000000001):1.1531549999999999,((((Q:6.1071,P:0.03012072):13.4102999999999994,R:2.8478829999999999):1.85937,(S:2.4390999999999998,T:1.1416440000000001):0.3193183):0.8008594999999999,(J:1.6084149999999999,I:0.4654395):0.4819104):0.3128451):0.8779276,U:1.8259069999999999); -(((C:0.1172898,((F:0.09990155,G:0.1079536):0.1318768,H:0.08558742):0.07692293):0.01568703,((E:0.2747921,D:0.09380719):0.06981183,(A:0.1268798,B:0.06362152):0.1183818):0.03838982):0.2280326,((((I:0.08506084,J:0.2042497):0.02607471,(S:0.3551886,T:0.04948573):0.03970153):0.05098039,O:0.4194467):0.08286293,(N:0.1498706,((M:0.0421887,(R:0.1568274,(P:0.1467817,Q:0.3487356):1.971795):0.7739102):0.1888962,(L:0.01690284,K:0.02947646):0.2074804):0.01158936):0.1889464):0.1763713,U:0.1540423); -((O:0.4594286,(((N:0.1059581,(L:0.02812806,K:0.01102755):0.1482327):0.05544185,((R:0.09978209,(P:0.2769552,Q:0.7027383):1.159732):0.6923546,M:0.1768366):0.05816758):0.1395201,((S:0.152466,T:0.08105601):0.09723953,(J:0.1895274,I:0.0905588):0.02726041):0.03349237):0.06599151):0.09735926,((((H:0.1192615,(G:0.1217331,F:0.05483975):0.06046681):0.02895204,(A:0.0830288,B:0.1846936):0.240918):0.02880109,C:0.1311552):0.01591093,(E:0.1043361,D:0.1147317):0.06424372):0.2817031,U:0.1611342); -(((((S:0.06109057,T:0.02836757):0.07959573,(J:0.03146645,I:0.04179548):0.07703363):0.03352573,(((P:0.06846469,Q:0.1399742):0.7890613,R:0.1918273):0.4505538,((M:0.1387628,(L:0.01744936,K:0.007746414):0.07733771):0.009957411,N:0.07815351):0.0225873):0.005575734):0.0139319,O:0.09836547):0.07011754,(((D:0.0275004,E:0.0835161):0.03524924,((A:0.07118716,B:0.0229837):0.03429046,(H:0.02722275,(F:0.0215719,G:0.01361068):0.038037):0.04467336):0.03073451):0.02268583,C:0.03687995):0.2176124,U:0.1629533); -(((((I:1.0770439999999999,(R:2.2904779999999998,(P:0.01403985,Q:2.4970050000000001):13.5336999999999996):1.1177649999999999):0.9557033,J:0.6278030999999999):0.2108861,(((((L:0.0185825,K:0.1186846):0.4816323,M:1.0980749999999999):0.1452012,N:0.915781):0.7400193,S:0.6529242):0.1383824,T:0.766937):0.1232067):0.2941434,O:1.6778770000000001):0.3393391,((C:0.614248,(A:0.532057,B:0.4149706):0.4055142):0.09409633,((D:0.3243441,E:0.4533314):0.2557275,((G:0.09267449,F:0.4848502):0.02650574,H:0.2662348):0.3833347):0.3340638):1.2247220000000001,U:1.2226079999999999); -((((I:0.06632528,J:0.5421861):0.04836401,(T:0.09898996,(S:0.2856428,((Q:0.5981362,P:0.5408823):2.4373420000000001,R:0.1213468):0.6681203999999999):0.0633603):0.08452595):0.05500021,(O:0.3472725,((M:0.1912734,N:0.17845):0.007036435,(K:0.08913414,L:0.03774779):0.2939338):0.1693201):0.0001982975):0.1790744,((((B:0.1233448,A:0.1032934):0.1271784,(E:0.1642897,D:0.1423153):0.1874869):0.003164537,(H:0.1895799,(F:0.06798479,G:0.1214491):0.028107):0.01216376):0.01752561,C:0.1132218):0.5086586,U:0.1965699); -((O:0.1325806,(((((Q:0.2089433,P:0.02977917):0.8097127,R:0.05417506):0.09216267,M:0.07795211):0.03815321,((K:0.04161252,L:0.03361045):0.05935534,N:0.04211943):0.01474644):0.01095594,((I:0.01865359,J:0.07751071):0.01334842,(S:0.1259139,T:0.01256364):0.05834793):0.02519805):0.002480175):0.06190232,((((D:0.05740387,E:0.06825503):0.0113841,(B:0.073317,A:0.03566013):0.07201415):0.005006505,(H:0.01583361,(G:0.05139212,F:0.03627286):0.004446824):0.01978862):0.001708759,C:0.01181504):0.2317238,U:0.07026706); -((C:0.0701244,(((F:0.03450662,G:0.093096):0.0132738,H:0.03536237):0.01172368,((D:0.04096278,E:0.1124896):0.01426978,(B:0.02435149,A:0.1132942):0.07305028):0.006891243):0.02291659):0.1669226,((((S:0.184246,T:0.04610373):0.07675174,(((Q:0.2580555,P:0.06165024):1.294475,R:0.1856087):0.2136289,(J:0.06028163,I:0.07643864):0.01595161):0.08515705):0.06850597,O:0.2172602):0.003843028,(N:0.08314594,(M:0.1188922,(K:0.02049172,L:0.01015607):0.1025447):0.03940053):0.05670753):0.1793886,U:0.0925068); -((O:0.1911627,((((T:0.174577,S:0.1634699):0.07213739,(J:0.1391058,I:0.1784193):0.1046161):0.05349279,((Q:0.2540025,P:0.03164637):1.1903729999999999,R:0.1799277):0.9740211):0.009007309,(N:0.1047618,(M:0.1558906,(K:0.1390001,L:0.03836772):0.08827065):0.04914804):0.07685799):0.05267721):0.08546485,((B:0.07251483,A:0.09236064):0.104579,(C:0.09760261,((E:0.08083426,D:0.0708541):0.04928498,((F:0.07957961,G:0.08175552):0.009189737,H:0.08821748):0.1430904):0.08494811):0.001252688):0.2778789,U:0.1705328); -((O:0.3626725,(((I:0.2421921,J:0.1323873):0.1090967,(T:0.1046798,S:0.3142792):0.1458217):0.04667916,(N:0.1346062,(M:0.2490967,(((R:0.6099431,(P:0.7127198,Q:0.5057588):2.4618389999999999):2.082049,L:0.002344715):0.01128368,K:0.03133178):0.1926271):0.03220242):0.07732522):0.008337099):0.2006941,(E:0.1932465,((((B:0.17836,A:0.1903704):0.1136862,((G:0.04458881,F:0.05426783):0.06298792,H:0.07554546):0.03387488):0.03027698,D:0.07567002):0.03283441,C:0.1036197):0.04511815):0.631032,U:0.2192178); -(((((((K:0.09895348,L:0.1482503):0.3059972,M:0.8092278000000001):0.06850404,N:0.2903233):0.207273,((J:0.4788309,I:0.5825755):0.3242471,(T:0.1091164,S:0.5270151):0.1083775):0.085639):0.1194545,O:0.6733637):0.1597022,((P:0.1050883,Q:1.3215300000000001):2.9032719999999999,R:0.7329134):1.4268099999999999):0.2899383,((((B:0.1418057,A:0.304952):0.2936229,(E:0.5350034,D:0.2561749):0.1514183):0.03421986,((F:0.06057749,G:0.1351796):0.1098658,H:0.0789):0.01175729):0.1640937,C:0.2949344):0.8562792,U:0.5820003); -((((C:0.07740406,(D:0.0206754,E:0.2027139):0.02748376):0.002064552,(H:0.05367737,(F:0.04984071,G:0.07759791):0.04375707):0.01811719):0.0009693109,(B:0.06719194,A:0.06134104):0.09208094):0.1710405,((O:0.1239895,((T:0.02932817,S:0.04496924):0.04181083,(J:0.1605231,I:0.05638622):0.05459919):0.04225972):0.02314419,(N:0.1089139,((K:0.01091746,L:0.05236203):0.04611571,(M:0.08014159,((P:0.07886282,Q:0.2091144):1.4829140000000001,R:0.1158952):1.230335):0.1035139):0.004880024):0.0543275):0.1326937,U:0.1175658); -((((B:0.1283181,A:0.1363331):0.1444095,(C:0.09915517,(H:0.07704917,(F:0.02068088,G:0.0437165):0.03004027):0.01631718):0.02133686):0.00003671364,(E:0.08459724,D:0.02642042):0.06523205):0.1691684,(O:0.2232275,(((M:0.2243209,(K:0.05345228,L:0.07353388):0.07649672):0.01956367,N:0.1023692):0.03336396,(((T:0.02582251,S:0.1588095):0.06786768,(I:0.2088249,J:0.07169008):0.09022973):0.09622083,((P:0.6902804,Q:0.3448122):1.2330669999999999,R:0.1645964):0.4606425):0.02494934):0.01552751):0.1677325,U:0.1177545); -(((O:0.9318932,((I:0.6528211,J:0.3760581):0.1560134,((S:0.4348727,R:5.8575100000000004):0.4156994,T:0.2019722):0.07307967):0.2521084):0.06181369,((((K:0.004541149,L:0.1423636):0.4870656,(P:0.6622858,Q:1.2481580000000001):6.9522940000000002):0.08868225,M:1.0132000000000001):0.1142836,N:0.3785959):0.3433083):0.3306586,((A:0.7592501,B:0.2519377):0.08801605,(((E:0.5047358,C:0.1338907):0.2228219,((F:0.16274,G:0.4822608):0.08183495,H:0.6520808):0.1026842):0.008922214,D:0.3720423):0.01175837):1.2025680000000001,U:0.3986728); -((O:0.7623037,((N:0.1784773,((L:0.004477026,K:0.005116161):0.117524,M:0.5152414):0.08084811):0.0761485,((T:0.09857698,(S:0.01006043,(R:0.6780876,(Q:0.3381186,P:0.2467715):1.8609439999999999):0.9360056):0.4185512):0.1267515,(J:0.2936629,I:0.1537886):0.2608631):0.0642495):0.00800166):0.1059409,((B:0.1585619,A:0.2579275):0.2111067,(((F:0.1879687,G:0.09290734):0.1015993,H:0.07719217):0.01500123,((E:0.3304963,D:0.1050667):0.2186313,C:0.3653319):0.06397593):0.09777278):0.7457429,U:0.2777783); -(((B:0.2364937,A:0.3499698):0.1409773,(((D:0.09998043,E:0.2824247):0.2488843,C:0.09540408):0.05896367,((F:0.2867728,G:0.06779072):0.1034767,H:0.1414029):0.07777375):0.01437391):0.4933837,((O:0.6922646,(R:0.3488952,(Q:0.4710384,P:0.05032793):2.926936):1.777247):0.02037272,(((M:0.3376646,N:0.07840727):0.08827915,(L:0.02928907,K:0.05164858):0.5639477000000001):0.1445386,((I:0.5364926,J:0.5560963):0.2397918,(T:0.08265042,S:0.3905653):0.1067281):0.03426391):0.09905804):0.1770427,U:0.2164325); -(((((S:0.4027496,T:0.1587708):0.0447222,(J:0.4365123,I:0.1485831):0.06800209):0.05429837,((N:0.5246394,M:0.3421192):0.05176703,(((P:1.0059899999999999,Q:0.4939292):2.3134299999999999,R:0.6408327):2.0120830000000001,(L:0.04895831,K:0.03577072):0.02422585):0.2377038):0.2932052):0.1965751,O:0.6810965):0.08624047,((H:0.1910597,((E:0.4099198,D:0.1787087):0.1344056,(G:0.1291177,F:0.1369049):0.2987322):0.05437218):0.04169401,(C:0.3035167,(A:0.3388286,B:0.1905268):0.2731474):0.02425734):0.5469783,U:0.3830942); +(((((A:0.3288238,B:0.2918835):0.4361477,C:0.3792959):0.003643581,(D:0.3097247,E:0.4068338):0.2102197):0.04950544,((F:0.1412025,G:0.2318505):0.008241366,H:0.1935274):0.1739941):1.0125409999999999,(((I:0.1470873,J:0.3919584):0.3187084,((((K:0.0946427,L:0.1115708):0.6085673,M:0.4190818):0.09234778,N:0.2489648):0.6775118999999999,O:0.4406936):0.09562053):0.05605804,(((P:0.884834,Q:0.2676903):5.4935590000000003,R:0.8639786):2.4373819999999999,(S:0.3984634,T:0.1073821):0.222171):0.1281091):0.6167975999999999,U:0.3250855); +(((B:0.09686483,A:0.3890754):0.4162531,((D:0.3388085,E:0.1720759):0.2053304,(C:0.1439899,(H:0.2572135,(G:0.07524632,F:0.04657637):0.0957444):0.2493241):0.03575535):0.009743879):0.5106113,((O:0.7361103,((K:0.03640399,L:0.08567879):0.1671401,((M:0.06917792,((P:0.5665801,Q:1.223662):3.4727209999999999,R:0.8587814):2.1126490000000002):0.5105899,N:0.1877777):0.1188038):0.1391816):0.05218651,((J:0.1658793,I:0.363798):0.3425552,(T:0.108799,S:0.2586355):0.2565037):0.07308882):0.303016,U:0.5117269); +((((((K:0.02680416,L:0.002917274):0.06638755,N:0.07180777):0.03866009,M:0.2944167):0.1082545,O:0.3091584):0.0004383381,((I:0.2520902,J:0.1332406):0.004783442,(T:0.0648956,(((P:0.03391384,Q:0.3898904):2.3455910000000002,R:0.5742912999999999):0.1879835,S:0.1874321):0.1116222):0.09270509):0.05674053):0.2763289,(((E:0.1222881,D:0.1286296):0.06138859,((H:0.1606345,(F:0.04446944,G:0.06924655):0.06249782):0.006877863,C:0.1311078):0.0008405476):0.009564842,(B:0.04580021,A:0.09110923):0.1133466):0.3585744,U:0.1533016); +(((((D:0.2574838,E:0.1782664):0.08975371,(A:0.322324,B:0.2708482):0.3803372):0.2237248,(H:0.1895854,(G:0.2002425,F:0.06981753):0.08250984):0.09387173):0.1550494,C:0.4761395):0.6224255,(((((L:0.1295513,K:0.02803722):0.1627941,(M:0.3922207,N:0.5483872):0.05674886):0.267483,(R:0.4825068,(Q:1.069331,P:0.171919):5.1710960000000004):0.7405272000000001):0.148598,((S:0.3500563,T:0.4365044):0.04835447,(I:0.3215418,J:0.2348189):0.2859957):0.3426698):0.113154,O:0.6172298000000001):0.1712725,U:0.3338107); +(((O:0.4988308,((I:0.1161714,J:0.131168):0.1106991,(S:0.2577152,T:0.05229496):0.04011852):0.123588):0.04122307,((K:0.1709085,L:0.0437965):0.241535,(N:0.2072706,(M:0.0859415,(R:0.04344059,(Q:0.6667812,P:0.01320633):2.2651189999999999):0.4548582):0.3214642):0.05557312):0.07871877):0.145779,(((C:0.1430088,(A:0.1552472,B:0.1058797):0.118452):0.06366744,(H:0.09919252,(F:0.05769237,G:0.1025198):0.09375484):0.00904366):0.01630814,(E:0.2170819,D:0.07064916):0.08176492):0.2291632,U:0.2325669); +(((((((R:1.563461,(Q:0.6255352,P:0.02058508):4.429665):1.2012499999999999,S:0.1249973):0.3372651,T:0.02060359):0.1848621,(I:0.4231855,J:0.1859687):0.2112335):0.08164969,O:0.3771121):0.01827364,((M:0.3362717,(K:0.01062223,L:0.02225963):0.2448778):0.11029,N:0.3248849):0.2225906):0.221209,(((A:0.2870172,B:0.1128748):0.3046851,(C:0.1170267,((G:0.1498071,F:0.08218757):0.04990381,H:0.1531857):0.1032663):0.04967551):0.05672676,(D:0.1867089,E:0.250547):0.1154678):0.5973596,U:0.3443973); +((((((M:0.8901319,((Q:4.0006870000000001,P:0.4042283):8.2014940000000003,R:1.645526):3.2699229999999999):0.453345,(L:0.01992847,K:0.1747246):1.1523950000000001):0.8269796,N:0.4006189):0.2755791,((J:0.2923134,I:1.2256309999999999):0.2275196,(T:0.3091149,S:0.1758831):0.2329641):0.05471782):0.01187946,O:1.6809289999999999):0.4900893,(((C:0.6796999,(A:1.1100680000000001,B:0.2955573):0.4746932):0.1474301,(H:0.4167583,(F:0.2666716,G:0.2493168):0.2403236):0.3947126):0.2065674,(E:0.7650963,D:0.357805):0.08512503):1.3011029999999999,U:0.780047); +((((M:0.742889,(K:0.03040715,L:0.2146761):0.1217704):0.013882,N:0.1210335):0.2817908,(((I:0.3638432,J:0.3330106):0.2509193,(T:0.0935607,(S:0.4568686,((Q:0.6377275,P:0.3067296):6.9213740000000001,R:0.7176116):1.5434730000000001):0.3039295):0.05350973):0.06166159,O:0.754298):0.003154333):0.3605294,((((D:0.3035107,E:0.3760969):0.1994374,C:0.3358883):0.009716007,(H:0.1864209,(G:0.2582129,F:0.1543829):0.07089903):0.06214097):0.09331232,(A:0.2980277,B:0.107342):0.2359019):0.5962275,U:0.3344094); +(((C:1.328052,(E:1.7984640000000001,D:0.4130508):0.6671453000000001):0.04405637,((A:0.5213907,B:0.9439283000000001):1.6688449999999999,(H:0.7479213,(G:0.473344,F:0.5388085):0.2387505):0.2239982):0.1064419):1.9334499999999999,(((((K:0.1969274,L:0.2448157):1.4249810000000001,M:2.7011440000000002):0.2284023,N:1.1499950000000001):0.2772314,O:2.3842590000000001):1.1531549999999999,((((Q:6.1071,P:0.03012072):13.4102999999999994,R:2.8478829999999999):1.85937,(S:2.4390999999999998,T:1.1416440000000001):0.3193183):0.8008594999999999,(J:1.6084149999999999,I:0.4654395):0.4819104):0.3128451):0.8779276,U:1.8259069999999999); +(((C:0.1172898,((F:0.09990155,G:0.1079536):0.1318768,H:0.08558742):0.07692293):0.01568703,((E:0.2747921,D:0.09380719):0.06981183,(A:0.1268798,B:0.06362152):0.1183818):0.03838982):0.2280326,((((I:0.08506084,J:0.2042497):0.02607471,(S:0.3551886,T:0.04948573):0.03970153):0.05098039,O:0.4194467):0.08286293,(N:0.1498706,((M:0.0421887,(R:0.1568274,(P:0.1467817,Q:0.3487356):1.971795):0.7739102):0.1888962,(L:0.01690284,K:0.02947646):0.2074804):0.01158936):0.1889464):0.1763713,U:0.1540423); +((O:0.4594286,(((N:0.1059581,(L:0.02812806,K:0.01102755):0.1482327):0.05544185,((R:0.09978209,(P:0.2769552,Q:0.7027383):1.159732):0.6923546,M:0.1768366):0.05816758):0.1395201,((S:0.152466,T:0.08105601):0.09723953,(J:0.1895274,I:0.0905588):0.02726041):0.03349237):0.06599151):0.09735926,((((H:0.1192615,(G:0.1217331,F:0.05483975):0.06046681):0.02895204,(A:0.0830288,B:0.1846936):0.240918):0.02880109,C:0.1311552):0.01591093,(E:0.1043361,D:0.1147317):0.06424372):0.2817031,U:0.1611342); +(((((S:0.06109057,T:0.02836757):0.07959573,(J:0.03146645,I:0.04179548):0.07703363):0.03352573,(((P:0.06846469,Q:0.1399742):0.7890613,R:0.1918273):0.4505538,((M:0.1387628,(L:0.01744936,K:0.007746414):0.07733771):0.009957411,N:0.07815351):0.0225873):0.005575734):0.0139319,O:0.09836547):0.07011754,(((D:0.0275004,E:0.0835161):0.03524924,((A:0.07118716,B:0.0229837):0.03429046,(H:0.02722275,(F:0.0215719,G:0.01361068):0.038037):0.04467336):0.03073451):0.02268583,C:0.03687995):0.2176124,U:0.1629533); +(((((I:1.0770439999999999,(R:2.2904779999999998,(P:0.01403985,Q:2.4970050000000001):13.5336999999999996):1.1177649999999999):0.9557033,J:0.6278030999999999):0.2108861,(((((L:0.0185825,K:0.1186846):0.4816323,M:1.0980749999999999):0.1452012,N:0.915781):0.7400193,S:0.6529242):0.1383824,T:0.766937):0.1232067):0.2941434,O:1.6778770000000001):0.3393391,((C:0.614248,(A:0.532057,B:0.4149706):0.4055142):0.09409633,((D:0.3243441,E:0.4533314):0.2557275,((G:0.09267449,F:0.4848502):0.02650574,H:0.2662348):0.3833347):0.3340638):1.2247220000000001,U:1.2226079999999999); +((((I:0.06632528,J:0.5421861):0.04836401,(T:0.09898996,(S:0.2856428,((Q:0.5981362,P:0.5408823):2.4373420000000001,R:0.1213468):0.6681203999999999):0.0633603):0.08452595):0.05500021,(O:0.3472725,((M:0.1912734,N:0.17845):0.007036435,(K:0.08913414,L:0.03774779):0.2939338):0.1693201):0.0001982975):0.1790744,((((B:0.1233448,A:0.1032934):0.1271784,(E:0.1642897,D:0.1423153):0.1874869):0.003164537,(H:0.1895799,(F:0.06798479,G:0.1214491):0.028107):0.01216376):0.01752561,C:0.1132218):0.5086586,U:0.1965699); +((O:0.1325806,(((((Q:0.2089433,P:0.02977917):0.8097127,R:0.05417506):0.09216267,M:0.07795211):0.03815321,((K:0.04161252,L:0.03361045):0.05935534,N:0.04211943):0.01474644):0.01095594,((I:0.01865359,J:0.07751071):0.01334842,(S:0.1259139,T:0.01256364):0.05834793):0.02519805):0.002480175):0.06190232,((((D:0.05740387,E:0.06825503):0.0113841,(B:0.073317,A:0.03566013):0.07201415):0.005006505,(H:0.01583361,(G:0.05139212,F:0.03627286):0.004446824):0.01978862):0.001708759,C:0.01181504):0.2317238,U:0.07026706); +((C:0.0701244,(((F:0.03450662,G:0.093096):0.0132738,H:0.03536237):0.01172368,((D:0.04096278,E:0.1124896):0.01426978,(B:0.02435149,A:0.1132942):0.07305028):0.006891243):0.02291659):0.1669226,((((S:0.184246,T:0.04610373):0.07675174,(((Q:0.2580555,P:0.06165024):1.294475,R:0.1856087):0.2136289,(J:0.06028163,I:0.07643864):0.01595161):0.08515705):0.06850597,O:0.2172602):0.003843028,(N:0.08314594,(M:0.1188922,(K:0.02049172,L:0.01015607):0.1025447):0.03940053):0.05670753):0.1793886,U:0.0925068); +((O:0.1911627,((((T:0.174577,S:0.1634699):0.07213739,(J:0.1391058,I:0.1784193):0.1046161):0.05349279,((Q:0.2540025,P:0.03164637):1.1903729999999999,R:0.1799277):0.9740211):0.009007309,(N:0.1047618,(M:0.1558906,(K:0.1390001,L:0.03836772):0.08827065):0.04914804):0.07685799):0.05267721):0.08546485,((B:0.07251483,A:0.09236064):0.104579,(C:0.09760261,((E:0.08083426,D:0.0708541):0.04928498,((F:0.07957961,G:0.08175552):0.009189737,H:0.08821748):0.1430904):0.08494811):0.001252688):0.2778789,U:0.1705328); +((O:0.3626725,(((I:0.2421921,J:0.1323873):0.1090967,(T:0.1046798,S:0.3142792):0.1458217):0.04667916,(N:0.1346062,(M:0.2490967,(((R:0.6099431,(P:0.7127198,Q:0.5057588):2.4618389999999999):2.082049,L:0.002344715):0.01128368,K:0.03133178):0.1926271):0.03220242):0.07732522):0.008337099):0.2006941,(E:0.1932465,((((B:0.17836,A:0.1903704):0.1136862,((G:0.04458881,F:0.05426783):0.06298792,H:0.07554546):0.03387488):0.03027698,D:0.07567002):0.03283441,C:0.1036197):0.04511815):0.631032,U:0.2192178); +(((((((K:0.09895348,L:0.1482503):0.3059972,M:0.8092278000000001):0.06850404,N:0.2903233):0.207273,((J:0.4788309,I:0.5825755):0.3242471,(T:0.1091164,S:0.5270151):0.1083775):0.085639):0.1194545,O:0.6733637):0.1597022,((P:0.1050883,Q:1.3215300000000001):2.9032719999999999,R:0.7329134):1.4268099999999999):0.2899383,((((B:0.1418057,A:0.304952):0.2936229,(E:0.5350034,D:0.2561749):0.1514183):0.03421986,((F:0.06057749,G:0.1351796):0.1098658,H:0.0789):0.01175729):0.1640937,C:0.2949344):0.8562792,U:0.5820003); +((((C:0.07740406,(D:0.0206754,E:0.2027139):0.02748376):0.002064552,(H:0.05367737,(F:0.04984071,G:0.07759791):0.04375707):0.01811719):0.0009693109,(B:0.06719194,A:0.06134104):0.09208094):0.1710405,((O:0.1239895,((T:0.02932817,S:0.04496924):0.04181083,(J:0.1605231,I:0.05638622):0.05459919):0.04225972):0.02314419,(N:0.1089139,((K:0.01091746,L:0.05236203):0.04611571,(M:0.08014159,((P:0.07886282,Q:0.2091144):1.4829140000000001,R:0.1158952):1.230335):0.1035139):0.004880024):0.0543275):0.1326937,U:0.1175658); +((((B:0.1283181,A:0.1363331):0.1444095,(C:0.09915517,(H:0.07704917,(F:0.02068088,G:0.0437165):0.03004027):0.01631718):0.02133686):0.00003671364,(E:0.08459724,D:0.02642042):0.06523205):0.1691684,(O:0.2232275,(((M:0.2243209,(K:0.05345228,L:0.07353388):0.07649672):0.01956367,N:0.1023692):0.03336396,(((T:0.02582251,S:0.1588095):0.06786768,(I:0.2088249,J:0.07169008):0.09022973):0.09622083,((P:0.6902804,Q:0.3448122):1.2330669999999999,R:0.1645964):0.4606425):0.02494934):0.01552751):0.1677325,U:0.1177545); +(((O:0.9318932,((I:0.6528211,J:0.3760581):0.1560134,((S:0.4348727,R:5.8575100000000004):0.4156994,T:0.2019722):0.07307967):0.2521084):0.06181369,((((K:0.004541149,L:0.1423636):0.4870656,(P:0.6622858,Q:1.2481580000000001):6.9522940000000002):0.08868225,M:1.0132000000000001):0.1142836,N:0.3785959):0.3433083):0.3306586,((A:0.7592501,B:0.2519377):0.08801605,(((E:0.5047358,C:0.1338907):0.2228219,((F:0.16274,G:0.4822608):0.08183495,H:0.6520808):0.1026842):0.008922214,D:0.3720423):0.01175837):1.2025680000000001,U:0.3986728); +((O:0.7623037,((N:0.1784773,((L:0.004477026,K:0.005116161):0.117524,M:0.5152414):0.08084811):0.0761485,((T:0.09857698,(S:0.01006043,(R:0.6780876,(Q:0.3381186,P:0.2467715):1.8609439999999999):0.9360056):0.4185512):0.1267515,(J:0.2936629,I:0.1537886):0.2608631):0.0642495):0.00800166):0.1059409,((B:0.1585619,A:0.2579275):0.2111067,(((F:0.1879687,G:0.09290734):0.1015993,H:0.07719217):0.01500123,((E:0.3304963,D:0.1050667):0.2186313,C:0.3653319):0.06397593):0.09777278):0.7457429,U:0.2777783); +(((B:0.2364937,A:0.3499698):0.1409773,(((D:0.09998043,E:0.2824247):0.2488843,C:0.09540408):0.05896367,((F:0.2867728,G:0.06779072):0.1034767,H:0.1414029):0.07777375):0.01437391):0.4933837,((O:0.6922646,(R:0.3488952,(Q:0.4710384,P:0.05032793):2.926936):1.777247):0.02037272,(((M:0.3376646,N:0.07840727):0.08827915,(L:0.02928907,K:0.05164858):0.5639477000000001):0.1445386,((I:0.5364926,J:0.5560963):0.2397918,(T:0.08265042,S:0.3905653):0.1067281):0.03426391):0.09905804):0.1770427,U:0.2164325); +(((((S:0.4027496,T:0.1587708):0.0447222,(J:0.4365123,I:0.1485831):0.06800209):0.05429837,((N:0.5246394,M:0.3421192):0.05176703,(((P:1.0059899999999999,Q:0.4939292):2.3134299999999999,R:0.6408327):2.0120830000000001,(L:0.04895831,K:0.03577072):0.02422585):0.2377038):0.2932052):0.1965751,O:0.6810965):0.08624047,((H:0.1910597,((E:0.4099198,D:0.1787087):0.1344056,(G:0.1291177,F:0.1369049):0.2987322):0.05437218):0.04169401,(C:0.3035167,(A:0.3388286,B:0.1905268):0.2731474):0.02425734):0.5469783,U:0.3830942); diff --git a/examples/net0.out b/examples/net0.out index 29c498723..51305781d 100644 --- a/examples/net0.out +++ b/examples/net0.out @@ -1,16 +1,16 @@ -(C,D,((B,A):1.395762055180493,(O,E):0.48453400554506426):10.0); -Ploglik = 53.53150526187732 - Dendroscope: (C,D,((B,A):1.395762055180493,(O,E):0.48453400554506426):10.0); - Elapsed time: 59.149959798 seconds in 10 successful runs -------- -List of estimated networks for all runs (sorted by log-pseudolik; the smaller, the better): - (C,D,((B,A):1.395762055180493,(O,E):0.48453400554506426):10.0);, with -loglik 53.53150526187732 - (C,D,((B,A):1.395762055180493,(O,E):0.48453400554506426):10.0);, with -loglik 53.53150526187732 - (C,D,((B,A):1.395762055180493,(O,E):0.48453400554506426):10.0);, with -loglik 53.53150526187732 - (C,((B,A):1.3957620587213782,(O,E):0.4845340080917299):10.0,D);, with -loglik 53.53150526187734 - (C,D,((B,A):1.3957620545953697,(O,E):0.4845340075360341):10.0);, with -loglik 53.53150526187734 - (C,D,((B,A):1.395762056455741,(E,O):0.4845340074849467):10.0);, with -loglik 53.53150526187736 - ((C,D):10.0,(O,E):0.48453399327591673,(B,A):1.3957620747912292);, with -loglik 53.53150526187742 - (C,D,((B,A):1.3957620570271982,(O,E):0.48453398008662635):10.0);, with -loglik 53.53150526187748 - (((B,A):1.3957621336927746,(D,C):10.0):0.4845338965193705,E,O);, with -loglik 53.531505261879346 - (C,((O,E):0.4845338864647309,(B,A):1.3957620021576418):10.0,D);, with -loglik 53.53150526187981 -------- +(C,D,((B,A):1.395762055180493,(O,E):0.48453400554506426):10.0); -Ploglik = 53.53150526187732 + Dendroscope: (C,D,((B,A):1.395762055180493,(O,E):0.48453400554506426):10.0); + Elapsed time: 59.149959798 seconds in 10 successful runs +------- +List of estimated networks for all runs (sorted by log-pseudolik; the smaller, the better): + (C,D,((B,A):1.395762055180493,(O,E):0.48453400554506426):10.0);, with -loglik 53.53150526187732 + (C,D,((B,A):1.395762055180493,(O,E):0.48453400554506426):10.0);, with -loglik 53.53150526187732 + (C,D,((B,A):1.395762055180493,(O,E):0.48453400554506426):10.0);, with -loglik 53.53150526187732 + (C,((B,A):1.3957620587213782,(O,E):0.4845340080917299):10.0,D);, with -loglik 53.53150526187734 + (C,D,((B,A):1.3957620545953697,(O,E):0.4845340075360341):10.0);, with -loglik 53.53150526187734 + (C,D,((B,A):1.395762056455741,(E,O):0.4845340074849467):10.0);, with -loglik 53.53150526187736 + ((C,D):10.0,(O,E):0.48453399327591673,(B,A):1.3957620747912292);, with -loglik 53.53150526187742 + (C,D,((B,A):1.3957620570271982,(O,E):0.48453398008662635):10.0);, with -loglik 53.53150526187748 + (((B,A):1.3957621336927746,(D,C):10.0):0.4845338965193705,E,O);, with -loglik 53.531505261879346 + (C,((O,E):0.4845338864647309,(B,A):1.3957620021576418):10.0,D);, with -loglik 53.53150526187981 +------- diff --git a/examples/net1.networks b/examples/net1.networks index 9f8278153..83cf06afa 100644 --- a/examples/net1.networks +++ b/examples/net1.networks @@ -1,5 +1,5 @@ -(C,D,((O,(E,#H7:::0.19558838614943078):0.31352437658618976):0.6640664399202987,(B,(A)#H7:::0.8044116138505693):10.0):10.0);, with -loglik 28.31506721890958 (best network found, remaining sorted by log-pseudolik; the smaller, the better) -(C,D,((O,(E)#H7:::0.8150784689693145):0.9336405757682176,(B,(A,#H7:::0.18492153103068557):0.25386142779877724):1.8758156446611114):10.0);, with -loglik 31.535560380783814 -(B,#H7:9.90999345612101::0.2555404440833535,(A,(E,(O,((C,D):10.0)#H7:0.3419231810962026::0.7444595559166465):0.19994859441332047):2.5014911511063644):0.7957621793330066);, with -loglik 56.64548310161462 -(C,D,((O,(E,((B)#H7:::0.7957543284159452,A):4.786202415937916):0.004527712280136759):1.7952610454570868,#H7:::0.20424567158405482):10.0);, with -loglik 67.17775727492258 -(C,D,(#H7:::0.32947301811471164,(B,(A,(E,(O)#H7:::0.6705269818852884):1.371799259141243):0.0):6.397073999864152):7.677245926003807);, with -loglik 199.11401961057143 +(C,D,((O,(E,#H7:::0.19558838614943078):0.31352437658618976):0.6640664399202987,(B,(A)#H7:::0.8044116138505693):10.0):10.0);, with -loglik 28.31506721890958 (best network found, remaining sorted by log-pseudolik; the smaller, the better) +(C,D,((O,(E)#H7:::0.8150784689693145):0.9336405757682176,(B,(A,#H7:::0.18492153103068557):0.25386142779877724):1.8758156446611114):10.0);, with -loglik 31.535560380783814 +(B,#H7:9.90999345612101::0.2555404440833535,(A,(E,(O,((C,D):10.0)#H7:0.3419231810962026::0.7444595559166465):0.19994859441332047):2.5014911511063644):0.7957621793330066);, with -loglik 56.64548310161462 +(C,D,((O,(E,((B)#H7:::0.7957543284159452,A):4.786202415937916):0.004527712280136759):1.7952610454570868,#H7:::0.20424567158405482):10.0);, with -loglik 67.17775727492258 +(C,D,(#H7:::0.32947301811471164,(B,(A,(E,(O)#H7:::0.6705269818852884):1.371799259141243):0.0):6.397073999864152):7.677245926003807);, with -loglik 199.11401961057143 diff --git a/examples/net1.out b/examples/net1.out index 1d03fe731..b6d858340 100644 --- a/examples/net1.out +++ b/examples/net1.out @@ -1,16 +1,16 @@ -(C,D,((O,(E,#H7:::0.19558838614943078):0.31352437658618976):0.6640664399202987,(B,(A)#H7:::0.8044116138505693):10.0):10.0); -Ploglik = 28.31506721890958 - Dendroscope: (C,D,((O,(E,#H7):0.31352437658618976):0.6640664399202987,(B,(A)#H7):10.0):10.0); - Elapsed time: 271.126428326 seconds in 10 successful runs -------- -List of estimated networks for all runs (sorted by log-pseudolik; the smaller, the better): - (C,D,((O,(E,#H7:::0.19558838614943078):0.31352437658618976):0.6640664399202987,(B,(A)#H7:::0.8044116138505693):10.0):10.0);, with -loglik 28.31506721890958 - (C,D,((O,(E,#H7:::0.19558838946216364):0.31352425538369977):0.664066406126365,(B,(A)#H7:::0.8044116105378364):10.0):10.0);, with -loglik 28.315067218909757 - (D,((B,(A)#H7:::0.8044116162544295):10.0,(O,(E,#H7:::0.19558838374557047):0.31352482730943887):0.6640664476294779):10.0,C);, with -loglik 28.315067218914265 - (C,D,((O,(E,#H7:::0.19558878064733037):0.3135246572320717):0.6640683396297514,(B,(A)#H7:::0.8044112193526696):10.0):10.0);, with -loglik 28.315067219414033 - (C,D,(((O,E):0.3203089414484873)#H7:0.42201406958745685::0.8824368389791968,(B,(A,#H7:0.0::0.11756316102080323):7.51153190829459):2.866176094708139):9.997713616103036);, with -loglik 29.96045168460487 - (C,D,(((B,A):0.6854399981954671,#H7:::0.31786806312434024):0.991860216918221,(O,(E)#H7:::0.6821319368756598):1.2957147806686786):10.0);, with -loglik 30.805051786019682 - (D,C,(((A,(B)#H7:::0.8602245502067076):2.777698442435405,(O,E):0.4050416456634251):3.2467936661912447,#H7:::0.1397754497932924):9.259328713724335);, with -loglik 32.2296238753743 - (C,D,(((E,(O)#H7:::0.7963290680661486):0.93173914700838,(A,B):1.2812215489517715):8.251394964150156,#H7:::0.2036709319338514):9.997447831332368);, with -loglik 32.71849255985833 - (C,D,(#H7:::0.20365962286702088,((B,A):1.2812215129020907,(E,(O)#H7:::0.7963403771329791):0.9317170970827519):8.493138837855247):9.991672582798872);, with -loglik 32.71849255986353 - (C,D,(((B,A):1.2812215797260895,(E,#H7:::0.49711490908034245):3.539202104441737):0.5190241058810571,(O)#H7:::0.5028850909196576):9.80147589122054);, with -loglik 32.71849255987108 -------- +(C,D,((O,(E,#H7:::0.19558838614943078):0.31352437658618976):0.6640664399202987,(B,(A)#H7:::0.8044116138505693):10.0):10.0); -Ploglik = 28.31506721890958 + Dendroscope: (C,D,((O,(E,#H7):0.31352437658618976):0.6640664399202987,(B,(A)#H7):10.0):10.0); + Elapsed time: 271.126428326 seconds in 10 successful runs +------- +List of estimated networks for all runs (sorted by log-pseudolik; the smaller, the better): + (C,D,((O,(E,#H7:::0.19558838614943078):0.31352437658618976):0.6640664399202987,(B,(A)#H7:::0.8044116138505693):10.0):10.0);, with -loglik 28.31506721890958 + (C,D,((O,(E,#H7:::0.19558838946216364):0.31352425538369977):0.664066406126365,(B,(A)#H7:::0.8044116105378364):10.0):10.0);, with -loglik 28.315067218909757 + (D,((B,(A)#H7:::0.8044116162544295):10.0,(O,(E,#H7:::0.19558838374557047):0.31352482730943887):0.6640664476294779):10.0,C);, with -loglik 28.315067218914265 + (C,D,((O,(E,#H7:::0.19558878064733037):0.3135246572320717):0.6640683396297514,(B,(A)#H7:::0.8044112193526696):10.0):10.0);, with -loglik 28.315067219414033 + (C,D,(((O,E):0.3203089414484873)#H7:0.42201406958745685::0.8824368389791968,(B,(A,#H7:0.0::0.11756316102080323):7.51153190829459):2.866176094708139):9.997713616103036);, with -loglik 29.96045168460487 + (C,D,(((B,A):0.6854399981954671,#H7:::0.31786806312434024):0.991860216918221,(O,(E)#H7:::0.6821319368756598):1.2957147806686786):10.0);, with -loglik 30.805051786019682 + (D,C,(((A,(B)#H7:::0.8602245502067076):2.777698442435405,(O,E):0.4050416456634251):3.2467936661912447,#H7:::0.1397754497932924):9.259328713724335);, with -loglik 32.2296238753743 + (C,D,(((E,(O)#H7:::0.7963290680661486):0.93173914700838,(A,B):1.2812215489517715):8.251394964150156,#H7:::0.2036709319338514):9.997447831332368);, with -loglik 32.71849255985833 + (C,D,(#H7:::0.20365962286702088,((B,A):1.2812215129020907,(E,(O)#H7:::0.7963403771329791):0.9317170970827519):8.493138837855247):9.991672582798872);, with -loglik 32.71849255986353 + (C,D,(((B,A):1.2812215797260895,(E,#H7:::0.49711490908034245):3.539202104441737):0.5190241058810571,(O)#H7:::0.5028850909196576):9.80147589122054);, with -loglik 32.71849255987108 +------- diff --git a/examples/net1_snaq.out b/examples/net1_snaq.out index e21823213..126a5852e 100644 --- a/examples/net1_snaq.out +++ b/examples/net1_snaq.out @@ -1,16 +1,16 @@ -((2,(1)#H7:::0.714396967572124):1.5121334835042128,((5,(6,#H7:::0.28560303242787605):10.0):0.519160770674177,3):0.4894188359537226,4); -Ploglik = 126.74250981974959 - Dendroscope: ((2,(1)#H7):1.5121334835042128,((5,(6,#H7):10.0):0.519160770674177,3):0.4894188359537226,4); - Elapsed time: 244.893727169 seconds in 10 successful runs -------- -List of estimated networks for all runs (sorted by log-pseudolik; the smaller, the better): - ((2,(1)#H7:::0.714396967572124):1.5121334835042128,((5,(6,#H7:::0.28560303242787605):10.0):0.519160770674177,3):0.4894188359537226,4);, with -loglik 126.74250981974959 - (2,(((5,(6,#H7:::0.2856029781253406):10.0):0.5191605164618681,3):0.48941891506504986,4):1.5121337611812755,(1)#H7:::0.7143970218746594);, with -loglik 126.74250981976316 - (2,(1,(6,(5,#H7:0.36656960210652617::0.4540374816488151):8.640130624078834):2.237772548754745):0.5189541233661255,((3,4):2.3038393332005034e-7)#H7:2.2848650473907608e-8::0.5459625183511849);, with -loglik 127.51396647990825 - (3,(4,(2,(1,#H7:::0.33655694149752063):2.454915262190042):0.6640757281174596):0.45677846246729964,(5,(6)#H7:::0.6634430585024793):2.4908888408127656);, with -loglik 128.8497846991383 - (5,6,(3,((4,#H7:::0.37302466051038147):2.155859614278266,(1,(2)#H7:::0.6269753394896186):2.155859614278266):0.1257326510308204):0.335346520555971);, with -loglik 155.49625734575733 - ((4,#H7:::0.3730252243724795):2.1558601023688686,((5,6):0.3353473596484674,3):0.12573349896235353,(1,(2)#H7:::0.6269747756275206):2.1558601023688686);, with -loglik 155.49625734579962 - ((3,((2,#H7:::0.32674506646968765):10.0,1):1.1071159990131527):0.04617331923805355,(6,5):0.2950496489881467,(4)#H7:::0.6732549335303124);, with -loglik 158.1387469237188 - ((1,(6,(5,#H7:::0.4225096300809103):2.211337036040264):1.0029496495275716):0.11872163186820414,(2,4):0.0,(3)#H7:::0.5774903699190896);, with -loglik 215.7344008012512 - ((5,#H7:0.0::0.49963173206096756):0.4958156240034313,3,(2,((4,(1,6):0.05550227865378959):0.0)#H7:0.0::0.5003682679390324):10.0);, with -loglik 324.13583188685334 - (5,(4,(2,#H7:0.0::0.4875284144514716):0.8782874007230708):10.0,((3,(1,6):0.0685800313783079):0.0)#H7:0.0::0.5124715855485285);, with -loglik 330.7324860225699 -------- +((2,(1)#H7:::0.714396967572124):1.5121334835042128,((5,(6,#H7:::0.28560303242787605):10.0):0.519160770674177,3):0.4894188359537226,4); -Ploglik = 126.74250981974959 + Dendroscope: ((2,(1)#H7):1.5121334835042128,((5,(6,#H7):10.0):0.519160770674177,3):0.4894188359537226,4); + Elapsed time: 244.893727169 seconds in 10 successful runs +------- +List of estimated networks for all runs (sorted by log-pseudolik; the smaller, the better): + ((2,(1)#H7:::0.714396967572124):1.5121334835042128,((5,(6,#H7:::0.28560303242787605):10.0):0.519160770674177,3):0.4894188359537226,4);, with -loglik 126.74250981974959 + (2,(((5,(6,#H7:::0.2856029781253406):10.0):0.5191605164618681,3):0.48941891506504986,4):1.5121337611812755,(1)#H7:::0.7143970218746594);, with -loglik 126.74250981976316 + (2,(1,(6,(5,#H7:0.36656960210652617::0.4540374816488151):8.640130624078834):2.237772548754745):0.5189541233661255,((3,4):2.3038393332005034e-7)#H7:2.2848650473907608e-8::0.5459625183511849);, with -loglik 127.51396647990825 + (3,(4,(2,(1,#H7:::0.33655694149752063):2.454915262190042):0.6640757281174596):0.45677846246729964,(5,(6)#H7:::0.6634430585024793):2.4908888408127656);, with -loglik 128.8497846991383 + (5,6,(3,((4,#H7:::0.37302466051038147):2.155859614278266,(1,(2)#H7:::0.6269753394896186):2.155859614278266):0.1257326510308204):0.335346520555971);, with -loglik 155.49625734575733 + ((4,#H7:::0.3730252243724795):2.1558601023688686,((5,6):0.3353473596484674,3):0.12573349896235353,(1,(2)#H7:::0.6269747756275206):2.1558601023688686);, with -loglik 155.49625734579962 + ((3,((2,#H7:::0.32674506646968765):10.0,1):1.1071159990131527):0.04617331923805355,(6,5):0.2950496489881467,(4)#H7:::0.6732549335303124);, with -loglik 158.1387469237188 + ((1,(6,(5,#H7:::0.4225096300809103):2.211337036040264):1.0029496495275716):0.11872163186820414,(2,4):0.0,(3)#H7:::0.5774903699190896);, with -loglik 215.7344008012512 + ((5,#H7:0.0::0.49963173206096756):0.4958156240034313,3,(2,((4,(1,6):0.05550227865378959):0.0)#H7:0.0::0.5003682679390324):10.0);, with -loglik 324.13583188685334 + (5,(4,(2,#H7:0.0::0.4875284144514716):0.8782874007230708):10.0,((3,(1,6):0.0685800313783079):0.0)#H7:0.0::0.5124715855485285);, with -loglik 330.7324860225699 +------- diff --git a/examples/net2.out b/examples/net2.out index 94a30d1c2..1e0a9acc2 100644 --- a/examples/net2.out +++ b/examples/net2.out @@ -1,16 +1,16 @@ -(C,D,((B,(A)#H7:::0.804411606649347):10.0,(O,(#H7:::0.19558839335065303,E):0.3135243143217013):0.664066456871298):10.0); -Ploglik = 28.31506721890957 - Dendroscope: (C,D,((B,(A)#H7):10.0,(O,(#H7,E):0.3135243143217013):0.664066456871298):10.0); - Elapsed time: 245.038893621 seconds in 10 successful runs -------- -List of estimated networks for all runs (sorted by log-pseudolik; the smaller, the better): - (C,D,((B,(A)#H7:::0.804411606649347):10.0,(O,(#H7:::0.19558839335065303,E):0.3135243143217013):0.664066456871298):10.0);, with -loglik 28.31506721890957 - (C,D,((O,(E,#H7:::0.19558839575688178):0.3135243589908287):0.6640664451728324,(B,(A)#H7:::0.8044116042431182):10.0):10.0);, with -loglik 28.315067218909576 - (C,D,((O,(E,#H7:::0.19558839575688178):0.3135243589908287):0.6640664451728324,(B,(A)#H7:::0.8044116042431182):10.0):10.0);, with -loglik 28.315067218909576 - (C,D,((O,(E,#H7:::0.19558839575688178):0.3135243589908287):0.6640664451728324,(B,(A)#H7:::0.8044116042431182):10.0):10.0);, with -loglik 28.315067218909576 - (C,D,((O,(E,#H7:::0.19558839575688178):0.3135243589908287):0.6640664451728324,(B,(A)#H7:::0.8044116042431182):10.0):10.0);, with -loglik 28.315067218909576 - (C,D,((O,(E,#H7:::0.19558839661616972):0.313524390248979):0.6640664174025381,(B,(A)#H7:::0.8044116033838302):10.0):10.0);, with -loglik 28.31506721890974 - (C,D,((O,(E,#H7:::0.19558838096319306):0.3135242964739077):0.6640663944434186,(B,(A)#H7:::0.8044116190368069):10.0):10.0);, with -loglik 28.31506721890991 - (C,D,((B,(A)#H7:::0.8044115957326758):10.0,((E,#H7:::0.1955884042673241):0.31352460122813014,O):0.6640665526213974):10.0);, with -loglik 28.315067218912294 - (C,D,((O,(E,#H7:::0.19558834593444913):0.31352429974937096):0.6640665495185252,(B,(A)#H7:::0.8044116540655508):10.0):10.0);, with -loglik 28.31506721891381 - (C,D,(((E,((A,B):1.3971140735819512)#H7:0.0::0.5001948684191775):0.521848660277393,O):9.421421128548834,#H7:9.235298995234151::0.4998051315808225):9.989864513003317);, with -loglik 30.21304053491194 -------- +(C,D,((B,(A)#H7:::0.804411606649347):10.0,(O,(#H7:::0.19558839335065303,E):0.3135243143217013):0.664066456871298):10.0); -Ploglik = 28.31506721890957 + Dendroscope: (C,D,((B,(A)#H7):10.0,(O,(#H7,E):0.3135243143217013):0.664066456871298):10.0); + Elapsed time: 245.038893621 seconds in 10 successful runs +------- +List of estimated networks for all runs (sorted by log-pseudolik; the smaller, the better): + (C,D,((B,(A)#H7:::0.804411606649347):10.0,(O,(#H7:::0.19558839335065303,E):0.3135243143217013):0.664066456871298):10.0);, with -loglik 28.31506721890957 + (C,D,((O,(E,#H7:::0.19558839575688178):0.3135243589908287):0.6640664451728324,(B,(A)#H7:::0.8044116042431182):10.0):10.0);, with -loglik 28.315067218909576 + (C,D,((O,(E,#H7:::0.19558839575688178):0.3135243589908287):0.6640664451728324,(B,(A)#H7:::0.8044116042431182):10.0):10.0);, with -loglik 28.315067218909576 + (C,D,((O,(E,#H7:::0.19558839575688178):0.3135243589908287):0.6640664451728324,(B,(A)#H7:::0.8044116042431182):10.0):10.0);, with -loglik 28.315067218909576 + (C,D,((O,(E,#H7:::0.19558839575688178):0.3135243589908287):0.6640664451728324,(B,(A)#H7:::0.8044116042431182):10.0):10.0);, with -loglik 28.315067218909576 + (C,D,((O,(E,#H7:::0.19558839661616972):0.313524390248979):0.6640664174025381,(B,(A)#H7:::0.8044116033838302):10.0):10.0);, with -loglik 28.31506721890974 + (C,D,((O,(E,#H7:::0.19558838096319306):0.3135242964739077):0.6640663944434186,(B,(A)#H7:::0.8044116190368069):10.0):10.0);, with -loglik 28.31506721890991 + (C,D,((B,(A)#H7:::0.8044115957326758):10.0,((E,#H7:::0.1955884042673241):0.31352460122813014,O):0.6640665526213974):10.0);, with -loglik 28.315067218912294 + (C,D,((O,(E,#H7:::0.19558834593444913):0.31352429974937096):0.6640665495185252,(B,(A)#H7:::0.8044116540655508):10.0):10.0);, with -loglik 28.31506721891381 + (C,D,(((E,((A,B):1.3971140735819512)#H7:0.0::0.5001948684191775):0.521848660277393,O):9.421421128548834,#H7:9.235298995234151::0.4998051315808225):9.989864513003317);, with -loglik 30.21304053491194 +------- diff --git a/examples/net3.out b/examples/net3.out index f70fe2d2a..6ddc40fb3 100644 --- a/examples/net3.out +++ b/examples/net3.out @@ -1,16 +1,16 @@ -(D,C,((O,(E,#H7:::0.19558839257941849):0.3135243301652981):0.6640664138384673,(B,(A)#H7:::0.8044116074205815):10.0):10.0); -Ploglik = 28.315067218909626 - Dendroscope: (D,C,((O,(E,#H7):0.3135243301652981):0.6640664138384673,(B,(A)#H7):10.0):10.0); - Elapsed time: 952.638932208 seconds in 10 successful runs -------- -List of estimated networks for all runs (sorted by log-pseudolik; the smaller, the better): - (D,C,((O,(E,#H7:::0.19558839257941849):0.3135243301652981):0.6640664138384673,(B,(A)#H7:::0.8044116074205815):10.0):10.0);, with -loglik 28.315067218909626 - (C,D,((O,(E,#H7:::0.19558839235174819):0.31352422856615364):0.6640664876518643,(B,(A)#H7:::0.8044116076482518):10.0):10.0);, with -loglik 28.315067218910077 - (C,D,((B,(A,#H7:0.0::0.1175213479667017):8.407396260576025):2.8654684293934847,((O,E):0.31997984089487014)#H7:0.4224481465254293::0.8824786520332983):9.895094325591028);, with -loglik 29.96044051679485 - (C,D,((B,(A,#H7:0.0::0.11756112192390786):7.468912618187224):2.866271157241852,((O,E):0.3201019950058188)#H7:0.4223586604204689::0.8824388780760921):9.984359137830834);, with -loglik 29.96045218098771 - (C,D,((B,(A,#H7:0.0::0.11149709689233744):9.269108492549247):2.8390057787009555,((O,E):0.13683319615833395)#H7:0.7151082167266016::0.8885029031076626):9.999538623559117);, with -loglik 30.170504655374277 - (C,D,((B,(A)#H7:::0.8011726778496965):9.99995885904756,((O,E):0.0,#H7:::0.19882732215030352):0.6474459124854501):10.0);, with -loglik 30.93617209446031 - (D,C,(((A,(B)#H7:::0.8656529147676766):2.687334643644658,(O,E):0.405041821800323):9.597468588229466,#H7:::0.1343470852323234):8.000475201698022);, with -loglik 32.229623875441604 - (D,C,(((A,(B)#H7:::0.8656555847537692):2.687294237962205,(E,O):0.405042353843419):9.996858745928023,#H7:::0.1343444152462307):8.024157583245904);, with -loglik 32.229623875538785 - (C,D,(((E,(O)#H7:::0.7963566010016481):0.9316862582699746,(B,A):1.2812221123025742):9.005433705135802,#H7:::0.20364339899835196):9.985298462928307);, with -loglik 32.718492560079056 - (O,(E,(A,(((C,(D,#H17:::0.0):9.80217755149062):9.999999999996133,(B)#H17:::1.0):0.0)#H7:0.0::0.5950192906826417):9.86945768141):0.2096603812009704,#H7:0.0::0.40498070931735825);, with -loglik 256.01694816137706 -------- +(D,C,((O,(E,#H7:::0.19558839257941849):0.3135243301652981):0.6640664138384673,(B,(A)#H7:::0.8044116074205815):10.0):10.0); -Ploglik = 28.315067218909626 + Dendroscope: (D,C,((O,(E,#H7):0.3135243301652981):0.6640664138384673,(B,(A)#H7):10.0):10.0); + Elapsed time: 952.638932208 seconds in 10 successful runs +------- +List of estimated networks for all runs (sorted by log-pseudolik; the smaller, the better): + (D,C,((O,(E,#H7:::0.19558839257941849):0.3135243301652981):0.6640664138384673,(B,(A)#H7:::0.8044116074205815):10.0):10.0);, with -loglik 28.315067218909626 + (C,D,((O,(E,#H7:::0.19558839235174819):0.31352422856615364):0.6640664876518643,(B,(A)#H7:::0.8044116076482518):10.0):10.0);, with -loglik 28.315067218910077 + (C,D,((B,(A,#H7:0.0::0.1175213479667017):8.407396260576025):2.8654684293934847,((O,E):0.31997984089487014)#H7:0.4224481465254293::0.8824786520332983):9.895094325591028);, with -loglik 29.96044051679485 + (C,D,((B,(A,#H7:0.0::0.11756112192390786):7.468912618187224):2.866271157241852,((O,E):0.3201019950058188)#H7:0.4223586604204689::0.8824388780760921):9.984359137830834);, with -loglik 29.96045218098771 + (C,D,((B,(A,#H7:0.0::0.11149709689233744):9.269108492549247):2.8390057787009555,((O,E):0.13683319615833395)#H7:0.7151082167266016::0.8885029031076626):9.999538623559117);, with -loglik 30.170504655374277 + (C,D,((B,(A)#H7:::0.8011726778496965):9.99995885904756,((O,E):0.0,#H7:::0.19882732215030352):0.6474459124854501):10.0);, with -loglik 30.93617209446031 + (D,C,(((A,(B)#H7:::0.8656529147676766):2.687334643644658,(O,E):0.405041821800323):9.597468588229466,#H7:::0.1343470852323234):8.000475201698022);, with -loglik 32.229623875441604 + (D,C,(((A,(B)#H7:::0.8656555847537692):2.687294237962205,(E,O):0.405042353843419):9.996858745928023,#H7:::0.1343444152462307):8.024157583245904);, with -loglik 32.229623875538785 + (C,D,(((E,(O)#H7:::0.7963566010016481):0.9316862582699746,(B,A):1.2812221123025742):9.005433705135802,#H7:::0.20364339899835196):9.985298462928307);, with -loglik 32.718492560079056 + (O,(E,(A,(((C,(D,#H17:::0.0):9.80217755149062):9.999999999996133,(B)#H17:::1.0):0.0)#H7:0.0::0.5950192906826417):9.86945768141):0.2096603812009704,#H7:0.0::0.40498070931735825);, with -loglik 256.01694816137706 +------- diff --git a/examples/raxmltrees.tre b/examples/raxmltrees.tre index 794236728..cea46c95f 100644 --- a/examples/raxmltrees.tre +++ b/examples/raxmltrees.tre @@ -1,30 +1,30 @@ -(E:0.03813009212764250505,((A:0.01431694697040608588,B:0.01015732493247077997):0.01028775801606040055,(C:0.00810229108578717529,D:0.00197193129848826374):0.01021762646788910642):0.02482469536693192314,O:0.07829148571706590065):0.0; -((C:0.00571736047208480039,D:0.00451901895383609135):0.04118870676352506116,(A:0.01822494787144924439,(B:0.01822832390246463888,E:0.02442835476448280627):0.00000100000050002909):0.03638840998788221703,O:0.08034259287710986130):0.0; -((E:0.01486951710550668548,(A:0.00607447627908505334,B:0.00606576973224593093):0.00338289315514080915):0.04130627644625901873,(C:0.00601218298654726709,D:0.00000100000050002909):0.04083936721124283020,O:0.05249779614856101700):0.0; -(((A:0.00402917501247963047,B:0.00403066338974353809):0.00659185517785173137,(C:0.00203303123998213511,D:0.00403034052058057028):0.01635211407770099587):0.02577378671413688149,O:0.05336935449761681660,E:0.05669037664679236338):0.0; -(E:0.04153237452733631735,((D:0.02480309862493045026,C:0.01656770306459705994):0.01643935021508005981,(A:0.01211501589585335138,B:0.01022898124454687911):0.02957415879776795556):0.02044953024228468932,O:0.04132365913322414569):0.0; -(E:0.03516181793185259308,((B:0.00402936124960797271,A:0.00804157682191141560):0.04350642747632686713,(D:0.00817575063812283655,C:0.00806111910944412244):0.03233774596301215720):0.00516875124013663201,O:0.08697344277167758098):0.0; -(O:0.05890983863758282590,((B:0.00618641394940406490,A:0.00185822545921187189):0.05822123278039348371,(D:0.00240193369006851294,C:0.00765916424603428972):0.03303434189665254567):0.02176512103619377206,E:0.07517581345783118374):0.0; -(((B:0.03109047590738228325,(C:0.00809900688719845073,D:0.00402127960064899495):0.02091421446507307422):0.02612665149842344214,E:0.04941939210292455031):0.00242867084318285163,A:0.04040293233701416215,O:0.05778176930998157879):0.0; -((C:0.00820066009382535571,D:0.00800589288691389185):0.05043056858200253845,((A:0.00815590199942295944,B:0.00609836175364117817):0.00100966111818810537,E:0.03434252314576125009):0.03470738132369270007,O:0.07750759645851632018):0.0; -((O:0.04427557083545044514,(A:0.03793278486264991395,E:0.04712435083514216611):0.01893515639449515689):0.03385177635196909979,(D:0.00401581598431689953,C:0.00199175221884765425):0.01228315039404601593,B:0.02884804427111284722):0.0; -(((C:0.00408892389247997919,D:0.00192949119424977228):0.03815517931191197282,(B:0.01057697983448284071,A:0.00964382250690727638):0.02918830834656110929):0.00628488512115817945,E:0.05647206050410982781,O:0.08933273785057320449):0.0; -((C:0.03529629111533112706,D:0.04778140253492024758):0.00172894436013809366,((B:0.01223799714923287825,A:0.02057052055942481389):0.01666485264886672507,E:0.02046165982290950452):0.01865038613502555467,O:0.08328122886393918289):0.0; -((E:0.04645658943797616874,(A:0.00816580251665219650,B:0.00798894790110632469):0.03818371443106661350):0.00000100000050002909,(C:0.01829952233041390666,D:0.01022340196801741971):0.04301410123967592397,O:0.09841649236863467265):0.0; -((A:0.02868006631952052174,B:0.01810665611251799367):0.01797181276906633859,(E:0.03351287092084617725,(D:0.01435992487182153644,C:0.01210652333977693847):0.03011763157162934343):0.00087028813071200663,O:0.05775601327779029265):0.0; -((C:0.02058332890684925337,D:0.02361439132548245889):0.02840311066916735225,((A:0.00406345961594432783,B:0.00193185118635310314):0.02738138925735913304,E:0.01907544533191102287):0.06545118963244370147,O:0.09119804111763779586):0.0; -(E:0.04067838696544015531,((A:0.01419847879567022984,B:0.01211173399943177645):0.01411352141703243676,(D:0.01011725487662109776,C:0.00810283450129651445):0.01324140394122765886):0.02609577509246965854,O:0.08235318672474560564):0.0; -(((B:0.00609961604447279999,A:0.00396926241512854643):0.01426231616886528691,(C:0.01632172083357376693,D:0.01424518991448497571):0.01438367611119334248):0.01196546939637872092,E:0.03568829444675703649,O:0.04632623624970866327):0.0; -((A:0.02092025785936565269,E:0.02259708104355810307):0.01893078621350575974,((C:0.00796337171981085536,D:0.01639326654774836411):0.02635252813044052997,B:0.03041508971270984185):0.00522672894730935155,O:0.10886618302739664577):0.0; -((E:0.01914273573803900591,(B:0.01906041485221728407,A:0.01773003992380778673):0.00390077240495100225):0.02056710195610762446,(D:0.00400372978922959935,C:0.00000100000050002909):0.04803019247532761687,O:0.12013969255025792882):0.0; -(((B:0.01519437826504500301,A:0.02431591004953537541):0.01749238917436101923,(D:0.02118082056759552217,C:0.00145347190883918730):0.02269287292568180139):0.02746614653710783421,O:0.05431638739570073676,E:0.07055188051358809997):0.0; -(((D:0.02583010298836236479,C:0.00920766286166286099):0.01487627372355209039,(B:0.00195488965083694642,A:0.00814054450917570810):0.00724133467410019091):0.02187642359223765376,E:0.05007668459557133162,O:0.05510772724662604816):0.0; -((O:0.04313499121196846114,((C:0.00601321879116324069,D:0.00812026891728685057):0.02997854508163357717,E:0.03507073838246458491):0.01832110799774123652):0.06569413548879976528,B:0.00200397046393964353,A:0.00000100000050002909):0.0; -((E:0.04653413184598869518,(B:0.02252087333250619300,(C:0.00397743047423039942,D:0.00607561940910932279):0.01862360761879640683):0.01025046809216331040):0.01306043747857414151,A:0.04844725216140377544,O:0.07741946953233914963):0.0; -(B:0.00832931720088105065,((O:0.06812105519839414813,E:0.04444890844049058376):0.05105384154889264919,(D:0.02610530323731895599,C:0.01695656847818867094):0.03701873870777557668):0.03083894918865456164,A:0.00177911569465941761):0.0; -(((D:0.01225662746753232620,C:0.00395888382965802876):0.00999553014723381962,(A:0.01219674876028758320,B:0.00803679867389906454):0.01671936064472259731):0.02501853644072403807,E:0.05299129926238516086,O:0.08562460949607129945):0.0; -(((D:0.00395123468793576269,C:0.01216668306844928896):0.01445877459847915748,(B:0.00401110763564967165,A:0.00000100000050002909):0.03084530823942782315):0.00000100000050002909,E:0.06047056799420198053,O:0.11602184519482416913):0.0; -(((C:0.01011245022272229399,D:0.01225274837044238417):0.01026993361915826998,(A:0.00606363703421933502,B:0.00400744738579739742):0.01439555862624560326):0.01000582083920089488,E:0.03147842605196455451,O:0.06393926985005159158):0.0; -(((B:0.01950780770480515722,A:0.02383851235571951555):0.01142974818548855159,(D:0.00604130449682676804,C:0.00810696000238021915):0.03012430708125988371):0.01174582856460014424,E:0.03556264634057080404,O:0.09475114687229116428):0.0; -((E:0.02438161333087584745,(A:0.00955324961523210808,B:0.00465519046315720445):0.01279129551630384110):0.01924875570191005719,(C:0.00815613124404165196,D:0.00603847801366393273):0.02591679699615763097,O:0.06333515951110803288):0.0; -(E:0.05142324942311692071,((C:0.02114999133813477358,D:0.00338903536734198700):0.00734430258017630590,(A:0.00400208466792373839,B:0.00404309766624557677):0.02447736013082011525):0.01990525534238807986,O:0.10733613073293125917):0.0; +(E:0.03813009212764250505,((A:0.01431694697040608588,B:0.01015732493247077997):0.01028775801606040055,(C:0.00810229108578717529,D:0.00197193129848826374):0.01021762646788910642):0.02482469536693192314,O:0.07829148571706590065):0.0; +((C:0.00571736047208480039,D:0.00451901895383609135):0.04118870676352506116,(A:0.01822494787144924439,(B:0.01822832390246463888,E:0.02442835476448280627):0.00000100000050002909):0.03638840998788221703,O:0.08034259287710986130):0.0; +((E:0.01486951710550668548,(A:0.00607447627908505334,B:0.00606576973224593093):0.00338289315514080915):0.04130627644625901873,(C:0.00601218298654726709,D:0.00000100000050002909):0.04083936721124283020,O:0.05249779614856101700):0.0; +(((A:0.00402917501247963047,B:0.00403066338974353809):0.00659185517785173137,(C:0.00203303123998213511,D:0.00403034052058057028):0.01635211407770099587):0.02577378671413688149,O:0.05336935449761681660,E:0.05669037664679236338):0.0; +(E:0.04153237452733631735,((D:0.02480309862493045026,C:0.01656770306459705994):0.01643935021508005981,(A:0.01211501589585335138,B:0.01022898124454687911):0.02957415879776795556):0.02044953024228468932,O:0.04132365913322414569):0.0; +(E:0.03516181793185259308,((B:0.00402936124960797271,A:0.00804157682191141560):0.04350642747632686713,(D:0.00817575063812283655,C:0.00806111910944412244):0.03233774596301215720):0.00516875124013663201,O:0.08697344277167758098):0.0; +(O:0.05890983863758282590,((B:0.00618641394940406490,A:0.00185822545921187189):0.05822123278039348371,(D:0.00240193369006851294,C:0.00765916424603428972):0.03303434189665254567):0.02176512103619377206,E:0.07517581345783118374):0.0; +(((B:0.03109047590738228325,(C:0.00809900688719845073,D:0.00402127960064899495):0.02091421446507307422):0.02612665149842344214,E:0.04941939210292455031):0.00242867084318285163,A:0.04040293233701416215,O:0.05778176930998157879):0.0; +((C:0.00820066009382535571,D:0.00800589288691389185):0.05043056858200253845,((A:0.00815590199942295944,B:0.00609836175364117817):0.00100966111818810537,E:0.03434252314576125009):0.03470738132369270007,O:0.07750759645851632018):0.0; +((O:0.04427557083545044514,(A:0.03793278486264991395,E:0.04712435083514216611):0.01893515639449515689):0.03385177635196909979,(D:0.00401581598431689953,C:0.00199175221884765425):0.01228315039404601593,B:0.02884804427111284722):0.0; +(((C:0.00408892389247997919,D:0.00192949119424977228):0.03815517931191197282,(B:0.01057697983448284071,A:0.00964382250690727638):0.02918830834656110929):0.00628488512115817945,E:0.05647206050410982781,O:0.08933273785057320449):0.0; +((C:0.03529629111533112706,D:0.04778140253492024758):0.00172894436013809366,((B:0.01223799714923287825,A:0.02057052055942481389):0.01666485264886672507,E:0.02046165982290950452):0.01865038613502555467,O:0.08328122886393918289):0.0; +((E:0.04645658943797616874,(A:0.00816580251665219650,B:0.00798894790110632469):0.03818371443106661350):0.00000100000050002909,(C:0.01829952233041390666,D:0.01022340196801741971):0.04301410123967592397,O:0.09841649236863467265):0.0; +((A:0.02868006631952052174,B:0.01810665611251799367):0.01797181276906633859,(E:0.03351287092084617725,(D:0.01435992487182153644,C:0.01210652333977693847):0.03011763157162934343):0.00087028813071200663,O:0.05775601327779029265):0.0; +((C:0.02058332890684925337,D:0.02361439132548245889):0.02840311066916735225,((A:0.00406345961594432783,B:0.00193185118635310314):0.02738138925735913304,E:0.01907544533191102287):0.06545118963244370147,O:0.09119804111763779586):0.0; +(E:0.04067838696544015531,((A:0.01419847879567022984,B:0.01211173399943177645):0.01411352141703243676,(D:0.01011725487662109776,C:0.00810283450129651445):0.01324140394122765886):0.02609577509246965854,O:0.08235318672474560564):0.0; +(((B:0.00609961604447279999,A:0.00396926241512854643):0.01426231616886528691,(C:0.01632172083357376693,D:0.01424518991448497571):0.01438367611119334248):0.01196546939637872092,E:0.03568829444675703649,O:0.04632623624970866327):0.0; +((A:0.02092025785936565269,E:0.02259708104355810307):0.01893078621350575974,((C:0.00796337171981085536,D:0.01639326654774836411):0.02635252813044052997,B:0.03041508971270984185):0.00522672894730935155,O:0.10886618302739664577):0.0; +((E:0.01914273573803900591,(B:0.01906041485221728407,A:0.01773003992380778673):0.00390077240495100225):0.02056710195610762446,(D:0.00400372978922959935,C:0.00000100000050002909):0.04803019247532761687,O:0.12013969255025792882):0.0; +(((B:0.01519437826504500301,A:0.02431591004953537541):0.01749238917436101923,(D:0.02118082056759552217,C:0.00145347190883918730):0.02269287292568180139):0.02746614653710783421,O:0.05431638739570073676,E:0.07055188051358809997):0.0; +(((D:0.02583010298836236479,C:0.00920766286166286099):0.01487627372355209039,(B:0.00195488965083694642,A:0.00814054450917570810):0.00724133467410019091):0.02187642359223765376,E:0.05007668459557133162,O:0.05510772724662604816):0.0; +((O:0.04313499121196846114,((C:0.00601321879116324069,D:0.00812026891728685057):0.02997854508163357717,E:0.03507073838246458491):0.01832110799774123652):0.06569413548879976528,B:0.00200397046393964353,A:0.00000100000050002909):0.0; +((E:0.04653413184598869518,(B:0.02252087333250619300,(C:0.00397743047423039942,D:0.00607561940910932279):0.01862360761879640683):0.01025046809216331040):0.01306043747857414151,A:0.04844725216140377544,O:0.07741946953233914963):0.0; +(B:0.00832931720088105065,((O:0.06812105519839414813,E:0.04444890844049058376):0.05105384154889264919,(D:0.02610530323731895599,C:0.01695656847818867094):0.03701873870777557668):0.03083894918865456164,A:0.00177911569465941761):0.0; +(((D:0.01225662746753232620,C:0.00395888382965802876):0.00999553014723381962,(A:0.01219674876028758320,B:0.00803679867389906454):0.01671936064472259731):0.02501853644072403807,E:0.05299129926238516086,O:0.08562460949607129945):0.0; +(((D:0.00395123468793576269,C:0.01216668306844928896):0.01445877459847915748,(B:0.00401110763564967165,A:0.00000100000050002909):0.03084530823942782315):0.00000100000050002909,E:0.06047056799420198053,O:0.11602184519482416913):0.0; +(((C:0.01011245022272229399,D:0.01225274837044238417):0.01026993361915826998,(A:0.00606363703421933502,B:0.00400744738579739742):0.01439555862624560326):0.01000582083920089488,E:0.03147842605196455451,O:0.06393926985005159158):0.0; +(((B:0.01950780770480515722,A:0.02383851235571951555):0.01142974818548855159,(D:0.00604130449682676804,C:0.00810696000238021915):0.03012430708125988371):0.01174582856460014424,E:0.03556264634057080404,O:0.09475114687229116428):0.0; +((E:0.02438161333087584745,(A:0.00955324961523210808,B:0.00465519046315720445):0.01279129551630384110):0.01924875570191005719,(C:0.00815613124404165196,D:0.00603847801366393273):0.02591679699615763097,O:0.06333515951110803288):0.0; +(E:0.05142324942311692071,((C:0.02114999133813477358,D:0.00338903536734198700):0.00734430258017630590,(A:0.00400208466792373839,B:0.00404309766624557677):0.02447736013082011525):0.01990525534238807986,O:0.10733613073293125917):0.0; diff --git a/examples/simple.aln b/examples/simple.aln index 94cc70014..23793f22f 100644 --- a/examples/simple.aln +++ b/examples/simple.aln @@ -1,8 +1,8 @@ ->A -GCGCCGAC ->B -GCAGCGAT ->C -GCAGCGAT ->D -GTAACGAC +>A +GCGCCGAC +>B +GCAGCGAT +>C +GCAGCGAT +>D +GTAACGAC diff --git a/examples/simple_missingone.aln b/examples/simple_missingone.aln index 1b1617ce2..fa23c62f6 100644 --- a/examples/simple_missingone.aln +++ b/examples/simple_missingone.aln @@ -1,6 +1,6 @@ ->A -GCGCCGAC ->B -GCAGCGAT ->C -GCAGCGAT +>A +GCGCCGAC +>B +GCAGCGAT +>C +GCAGCGAT diff --git a/examples/swadesh.out b/examples/swadesh.out index 733e34c93..2b31992ad 100644 --- a/examples/swadesh.out +++ b/examples/swadesh.out @@ -1,11 +1,11 @@ -(Spanish:0.5,((German:1.0,(Norwegian:0.9085285733958854)#H5:1.0914714266041146::0.6237369044760683):0.23790053617846252,(English:0.3248093318624443,#H5:0.0::0.37626309552393167):0.43729013195909316):0.5); softwired parsimony score = 305.0 - Dendroscope: (Spanish:0.5,((German:1.0,(Norwegian:0.9085285733958854)#H5:1.0914714266041146):0.23790053617846252,(English:0.3248093318624443,#H5:0.0):0.43729013195909316):0.5); - Elapsed time: 12.030053742 seconds, 5 attempted runs -------- -List of estimated networks for all runs (sorted by softwired parsimony score; the smaller, the better): - (Spanish:0.5,((German:1.0,(Norwegian:0.9085285733958854)#H5:1.0914714266041146::0.6237369044760683):0.23790053617846252,(English:0.3248093318624443,#H5:0.0::0.37626309552393167):0.43729013195909316):0.5);, with softwired parsimony 305.0 - (Spanish:0.10225954841198599,((Norwegian:1.4076806786867044,(German:0.4500748600222062,#H5:0.0::0.3021668739751817):0.15662415927687823):0.08337848419758871,(English:1.6827041304143804)#H5:0.3172958695856196::0.6978331260248183):0.10225954841198599);, with softwired parsimony 305.0 - (Spanish:0.5,((English:1.0,(German:0.29880999200816705)#H5:0.701190007991833::0.8583303888706454):1.0,(Norwegian:0.6660612306945473,#H5:0.0::0.1416696111293546):0.33393876930545274):0.5);, with softwired parsimony 305.0 - (Spanish:1.0,((German:0.7492684406563732,(Norwegian:0.6524856001295047,#H5:0.0::0.37432630563505875):0.34751439987049526):0.2507315593436268,(English:0.9791542875501837)#H5:0.020845712449816256::0.6256736943649412):1.0);, with softwired parsimony 305.0 - (Spanish:0.5,((Norwegian:0.12003409480180682,(German:0.8360470622481879,#H5:0.0::0.377769638497227):0.16395293775181208):0.8799659051981932,(English:1.8529229372715137)#H5:0.1470770627284863::0.622230361502773):0.5);, with softwired parsimony 305.0 -------- +(Spanish:0.5,((German:1.0,(Norwegian:0.9085285733958854)#H5:1.0914714266041146::0.6237369044760683):0.23790053617846252,(English:0.3248093318624443,#H5:0.0::0.37626309552393167):0.43729013195909316):0.5); softwired parsimony score = 305.0 + Dendroscope: (Spanish:0.5,((German:1.0,(Norwegian:0.9085285733958854)#H5:1.0914714266041146):0.23790053617846252,(English:0.3248093318624443,#H5:0.0):0.43729013195909316):0.5); + Elapsed time: 12.030053742 seconds, 5 attempted runs +------- +List of estimated networks for all runs (sorted by softwired parsimony score; the smaller, the better): + (Spanish:0.5,((German:1.0,(Norwegian:0.9085285733958854)#H5:1.0914714266041146::0.6237369044760683):0.23790053617846252,(English:0.3248093318624443,#H5:0.0::0.37626309552393167):0.43729013195909316):0.5);, with softwired parsimony 305.0 + (Spanish:0.10225954841198599,((Norwegian:1.4076806786867044,(German:0.4500748600222062,#H5:0.0::0.3021668739751817):0.15662415927687823):0.08337848419758871,(English:1.6827041304143804)#H5:0.3172958695856196::0.6978331260248183):0.10225954841198599);, with softwired parsimony 305.0 + (Spanish:0.5,((English:1.0,(German:0.29880999200816705)#H5:0.701190007991833::0.8583303888706454):1.0,(Norwegian:0.6660612306945473,#H5:0.0::0.1416696111293546):0.33393876930545274):0.5);, with softwired parsimony 305.0 + (Spanish:1.0,((German:0.7492684406563732,(Norwegian:0.6524856001295047,#H5:0.0::0.37432630563505875):0.34751439987049526):0.2507315593436268,(English:0.9791542875501837)#H5:0.020845712449816256::0.6256736943649412):1.0);, with softwired parsimony 305.0 + (Spanish:0.5,((Norwegian:0.12003409480180682,(German:0.8360470622481879,#H5:0.0::0.377769638497227):0.16395293775181208):0.8799659051981932,(English:1.8529229372715137)#H5:0.1470770627284863::0.622230361502773):0.5);, with softwired parsimony 305.0 +------- diff --git a/examples/tableCF.txt b/examples/tableCF.txt index 4d3c348c3..436740e6e 100644 --- a/examples/tableCF.txt +++ b/examples/tableCF.txt @@ -1,16 +1,16 @@ -"t1","t2","t3","t4","CF12_34","CF13_24","CF14_23" -"6","1","5","4",0.4,0.6,0.0 -"6","1","5","2",0.2,0.8,0.0 -"6","1","5","3",0.5,0.5,0.0 -"6","1","4","2",0.4,0.6,0.0 -"6","1","4","3",0.4,0.2,0.4 -"6","1","2","3",0.2,0.1,0.7 -"6","5","4","2",0.8,0.0,0.2 -"6","5","4","3",0.4,0.4,0.2 -"6","5","2","3",0.6,0.4,0.0 -"6","4","2","3",0.3,0.2,0.5 -"1","5","4","2",0.4,0.0,0.6 -"1","5","4","3",0.3,0.5,0.2 -"1","5","2","3",0.1,0.8,0.1 -"1","4","2","3",0.1,0.5,0.4 -"5","4","2","3",0.3,0.2,0.5 +"t1","t2","t3","t4","CF12_34","CF13_24","CF14_23" +"6","1","5","4",0.4,0.6,0.0 +"6","1","5","2",0.2,0.8,0.0 +"6","1","5","3",0.5,0.5,0.0 +"6","1","4","2",0.4,0.6,0.0 +"6","1","4","3",0.4,0.2,0.4 +"6","1","2","3",0.2,0.1,0.7 +"6","5","4","2",0.8,0.0,0.2 +"6","5","4","3",0.4,0.4,0.2 +"6","5","2","3",0.6,0.4,0.0 +"6","4","2","3",0.3,0.2,0.5 +"1","5","4","2",0.4,0.0,0.6 +"1","5","4","3",0.3,0.5,0.2 +"1","5","2","3",0.1,0.8,0.1 +"1","4","2","3",0.1,0.5,0.4 +"5","4","2","3",0.3,0.2,0.5 diff --git a/examples/tableCFCI.csv b/examples/tableCFCI.csv index 8504a8618..22b50037c 100644 --- a/examples/tableCFCI.csv +++ b/examples/tableCFCI.csv @@ -1,16 +1,16 @@ -t1,t2,t3,t4,CF12_34,CF12_34_lo,CF12_34_hi,CF13_24,CF13_24_lo,CF13_24_hi,CF14_23,CF14_23_lo,CF14_23_hi -6,1,5,4,0.4,0.35,0.45,0.6,0.55,0.65,0,0,0.1 -6,1,5,2,0.2,0.15,0.25,0.8,0.75,0.85,0,0,0.1 -6,1,5,3,0.5,0.45,0.55,0.5,0.45,0.55,0,0,0.1 -6,1,4,2,0.4,0.35,0.45,0.6,0.55,0.65,0,0,0.1 -6,1,4,3,0.4,0.35,0.45,0.2,0.15,0.25,0.4,0.35,0.45 -6,1,2,3,0.2,0.15,0.25,0.1,0.05,0.15,0.7,0.65,0.75 -6,5,4,2,0.8,0.75,0.85,0,0,0.1,0.2,0.15,0.25 -6,5,4,3,0.4,0.35,0.45,0.4,0.35,0.45,0.2,0.15,0.25 -6,5,2,3,0.6,0.55,0.65,0.4,0.35,0.45,0,0,0.1 -6,4,2,3,0.3,0.25,0.35,0.2,0.15,0.25,0.5,0.45,0.55 -1,5,4,2,0.4,0.35,0.45,0,0,0.1,0.6,0.55,0.65 -1,5,4,3,0.3,0.25,0.35,0.5,0.45,0.55,0.2,0.15,0.25 -1,5,2,3,0.1,0.05,0.15,0.8,0.75,0.85,0.1,0.05,0.15 -1,4,2,3,0.1,0.05,0.15,0.5,0.45,0.55,0.4,0.35,0.45 -5,4,2,3,0.3,0.25,0.35,0.2,0.15,0.25,0.5,0.45,0.55 +t1,t2,t3,t4,CF12_34,CF12_34_lo,CF12_34_hi,CF13_24,CF13_24_lo,CF13_24_hi,CF14_23,CF14_23_lo,CF14_23_hi +6,1,5,4,0.4,0.35,0.45,0.6,0.55,0.65,0,0,0.1 +6,1,5,2,0.2,0.15,0.25,0.8,0.75,0.85,0,0,0.1 +6,1,5,3,0.5,0.45,0.55,0.5,0.45,0.55,0,0,0.1 +6,1,4,2,0.4,0.35,0.45,0.6,0.55,0.65,0,0,0.1 +6,1,4,3,0.4,0.35,0.45,0.2,0.15,0.25,0.4,0.35,0.45 +6,1,2,3,0.2,0.15,0.25,0.1,0.05,0.15,0.7,0.65,0.75 +6,5,4,2,0.8,0.75,0.85,0,0,0.1,0.2,0.15,0.25 +6,5,4,3,0.4,0.35,0.45,0.4,0.35,0.45,0.2,0.15,0.25 +6,5,2,3,0.6,0.55,0.65,0.4,0.35,0.45,0,0,0.1 +6,4,2,3,0.3,0.25,0.35,0.2,0.15,0.25,0.5,0.45,0.55 +1,5,4,2,0.4,0.35,0.45,0,0,0.1,0.6,0.55,0.65 +1,5,4,3,0.3,0.25,0.35,0.5,0.45,0.55,0.2,0.15,0.25 +1,5,2,3,0.1,0.05,0.15,0.8,0.75,0.85,0.1,0.05,0.15 +1,4,2,3,0.1,0.05,0.15,0.5,0.45,0.55,0.4,0.35,0.45 +5,4,2,3,0.3,0.25,0.35,0.2,0.15,0.25,0.5,0.45,0.55 diff --git a/examples/test.nex b/examples/test.nex index 3ce835f85..4419e57f4 100644 --- a/examples/test.nex +++ b/examples/test.nex @@ -1,18 +1,18 @@ -#NEXUS -BEGIN TREES; - -Tree gt0=(((((taxa01:0.00372,taxa02:0.00219):0.00096,taxa03:0.00420):0.00055,taxa05:0.00482):0.00067,taxa06:0.00573):0.00084,taxa04:0.00706):0.00000; - tree gt1 = (((taxa02:0.00116,taxa03:0.00066):0.00145,((taxa05:0.00271,taxa01:0.00377):0.00018,taxa04:0.00331):0.00095):0.00073,taxa06:0.00548):0.00000; -Tree gt2 = [&R] ((taxa03:0.00352,(taxa02:0.00158,(taxa04:0.00251,(taxa05:0.00239,taxa01:0.00245):0.00050):0.00030):0.00040):0.00062,taxa06:0.00528):0.00000; -Tree gt3=(((taxa02:0.00306,taxa03:0.00310):0.00146,taxa06:0.00730):0.00050,((taxa05:0.00630,taxa01:0.00408):0.00083,taxa04:0.00536):0.00102):0.00000; -Tree gt4=(((taxa01:0.00444,(taxa02:0.00324,(taxa04:0.00343,taxa03:0.00323):0.00044):0.00029):0.00075,taxa05:0.00372):0.00085,taxa06:0.00541):0.00000; -Tree gt5=((((taxa02:0.00310,taxa03:0.00468):0.00100,taxa06:0.00593):0.00025,(taxa05:0.00422,taxa01:0.00394):0.00054):0.00036,taxa04:0.00503):0.00000; -Tree gt6=((taxa04:0.00466,((taxa02:0.00331,taxa03:0.00264):0.00097,(taxa05:0.00322,taxa01:0.00368):0.00120):0.00018):0.00050,taxa06:0.00494):0.00000; -Tree gt7=((((taxa05:0.00264,taxa01:0.00306):0.00103,taxa04:0.00368):0.00028,taxa06:0.00401):0.00030,(taxa02:0.00245,taxa03:0.00217):0.00123):0.00000; -Tree gt8=(((taxa05:0.00475,taxa01:0.00411):0.00097,(taxa04:0.00603,(taxa02:0.00468,taxa03:0.00443):0.00063):0.00037):0.00126,taxa06:0.00778):0.00000; -Tree gt9=((((taxa04:0.00491,taxa06:0.00476):0.00071,taxa02:0.00547):0.00054,taxa03:0.00563):0.00035,(taxa05:0.00540,taxa01:0.00410):0.00061):0.00000; - -END; - -[this should be ignored] -tree trap = (taxa04:0.00491,taxa06:0.00476); +#NEXUS +BEGIN TREES; + +Tree gt0=(((((taxa01:0.00372,taxa02:0.00219):0.00096,taxa03:0.00420):0.00055,taxa05:0.00482):0.00067,taxa06:0.00573):0.00084,taxa04:0.00706):0.00000; + tree gt1 = (((taxa02:0.00116,taxa03:0.00066):0.00145,((taxa05:0.00271,taxa01:0.00377):0.00018,taxa04:0.00331):0.00095):0.00073,taxa06:0.00548):0.00000; +Tree gt2 = [&R] ((taxa03:0.00352,(taxa02:0.00158,(taxa04:0.00251,(taxa05:0.00239,taxa01:0.00245):0.00050):0.00030):0.00040):0.00062,taxa06:0.00528):0.00000; +Tree gt3=(((taxa02:0.00306,taxa03:0.00310):0.00146,taxa06:0.00730):0.00050,((taxa05:0.00630,taxa01:0.00408):0.00083,taxa04:0.00536):0.00102):0.00000; +Tree gt4=(((taxa01:0.00444,(taxa02:0.00324,(taxa04:0.00343,taxa03:0.00323):0.00044):0.00029):0.00075,taxa05:0.00372):0.00085,taxa06:0.00541):0.00000; +Tree gt5=((((taxa02:0.00310,taxa03:0.00468):0.00100,taxa06:0.00593):0.00025,(taxa05:0.00422,taxa01:0.00394):0.00054):0.00036,taxa04:0.00503):0.00000; +Tree gt6=((taxa04:0.00466,((taxa02:0.00331,taxa03:0.00264):0.00097,(taxa05:0.00322,taxa01:0.00368):0.00120):0.00018):0.00050,taxa06:0.00494):0.00000; +Tree gt7=((((taxa05:0.00264,taxa01:0.00306):0.00103,taxa04:0.00368):0.00028,taxa06:0.00401):0.00030,(taxa02:0.00245,taxa03:0.00217):0.00123):0.00000; +Tree gt8=(((taxa05:0.00475,taxa01:0.00411):0.00097,(taxa04:0.00603,(taxa02:0.00468,taxa03:0.00443):0.00063):0.00037):0.00126,taxa06:0.00778):0.00000; +Tree gt9=((((taxa04:0.00491,taxa06:0.00476):0.00071,taxa02:0.00547):0.00054,taxa03:0.00563):0.00035,(taxa05:0.00540,taxa01:0.00410):0.00061):0.00000; + +END; + +[this should be ignored] +tree trap = (taxa04:0.00491,taxa06:0.00476); diff --git a/examples/test_8_withrepeatingsites.aln b/examples/test_8_withrepeatingsites.aln index e0b8600c3..90c8af129 100644 --- a/examples/test_8_withrepeatingsites.aln +++ b/examples/test_8_withrepeatingsites.aln @@ -1,12 +1,12 @@ ->test_1 -GCGCCGAG ->test_2 -GCACCGAG ->test_3 -GCACCGAG ->test_4 -GTACCGAG ->test_5 -GTACCGAG ->test_6 +>test_1 +GCGCCGAG +>test_2 +GCACCGAG +>test_3 +GCACCGAG +>test_4 +GTACCGAG +>test_5 +GTACCGAG +>test_6 GTACCGGG \ No newline at end of file diff --git a/examples/test_reticulatetreeblock.nex b/examples/test_reticulatetreeblock.nex index bd88f0a3b..36216c1de 100644 --- a/examples/test_reticulatetreeblock.nex +++ b/examples/test_reticulatetreeblock.nex @@ -1,32 +1,32 @@ -#NEXUS - -begin taxa; -dimensions ntax=2; -taxlabels -A -D -; -End; - -begin trees; - -translate -5 tax5, [to check robustness] -1 tax1, -2 tax2, -3 tax3, -4 tax4 -; - -Tree bacter=((4,(3,#7[&conv=1, relSize=0.08, affectedBlocks="{bark,dirty,dry}"]:0.001)[&height_95%_HPD={38.01,87.51}]:0.3):0.6,(2,(1:0.1)#7:0.9):10); -tree gt1 = ((4,(3,#7[&conv=7,relSize=0.58, posterior=0.87]:0.001::0.57):0.3):0.6,(2,(1)#7)); -tree fake = this line won't match a newick string -tree gt2 = (error will be caught and warning sent; -tree speciesnetwork = (((1:1.13,((2:0.21)#H1:0.89,(3:1.03,(#H1[&gamma=0.28]:0.30,4:0.51)S3:0.51)S4:0.08)S5:0.2):0.6,5:1.14):0.16); - -end; - -bacter example: https://raw.githubusercontent.com/taming-the-beast/Bacter-Tutorial/master/precooked_runs/bacter_tutorial.Ecoli_rplA.trees -SpeciesNetwork examples: -MCMC sample: https://raw.githubusercontent.com/mmatschiner/tutorials/master/bayesian_analysis_of_species_networks/res/speciesnetwork.trees -summary: https://raw.githubusercontent.com/mmatschiner/tutorials/master/bayesian_analysis_of_species_networks/res/speciesnetwork_sum.trees +#NEXUS + +begin taxa; +dimensions ntax=2; +taxlabels +A +D +; +End; + +begin trees; + +translate +5 tax5, [to check robustness] +1 tax1, +2 tax2, +3 tax3, +4 tax4 +; + +Tree bacter=((4,(3,#7[&conv=1, relSize=0.08, affectedBlocks="{bark,dirty,dry}"]:0.001)[&height_95%_HPD={38.01,87.51}]:0.3):0.6,(2,(1:0.1)#7:0.9):10); +tree gt1 = ((4,(3,#7[&conv=7,relSize=0.58, posterior=0.87]:0.001::0.57):0.3):0.6,(2,(1)#7)); +tree fake = this line won't match a newick string +tree gt2 = (error will be caught and warning sent; +tree speciesnetwork = (((1:1.13,((2:0.21)#H1:0.89,(3:1.03,(#H1[&gamma=0.28]:0.30,4:0.51)S3:0.51)S4:0.08)S5:0.2):0.6,5:1.14):0.16); + +end; + +bacter example: https://raw.githubusercontent.com/taming-the-beast/Bacter-Tutorial/master/precooked_runs/bacter_tutorial.Ecoli_rplA.trees +SpeciesNetwork examples: +MCMC sample: https://raw.githubusercontent.com/mmatschiner/tutorials/master/bayesian_analysis_of_species_networks/res/speciesnetwork.trees +summary: https://raw.githubusercontent.com/mmatschiner/tutorials/master/bayesian_analysis_of_species_networks/res/speciesnetwork_sum.trees diff --git a/examples/treefile.txt b/examples/treefile.txt index 5882b866b..dc4056ff3 100644 --- a/examples/treefile.txt +++ b/examples/treefile.txt @@ -1,10 +1,10 @@ -(6:3.500,(1:2.236,(5:1.850,(4:0.660,(2:0.632,3:0.632):0.028):1.190):0.386):1.264); -(6:2.569,((1:0.818,(2:0.677,4:0.677):0.141):1.268,(3:1.105,5:1.105):0.982):0.483); -((3:0.676,(1:0.104,2:0.104):0.572):2.362,(6:2.790,(4:0.551,5:0.551):2.238):0.248); -(6:2.728,((3:0.655,5:0.655):1.202,(1:0.881,(2:0.783,4:0.783):0.098):0.976):0.871); -(6:4.714,(5:2.433,(3:1.318,(4:0.896,(1:0.506,2:0.506):0.391):0.422):1.114):2.281); -(6:2.210,((3:0.694,5:0.694):1.302,(4:0.726,(1:0.351,2:0.351):0.376):1.270):0.214); -(6:3.077,(5:2.349,((1:0.499,2:0.499):0.704,(3:0.730,4:0.730):0.473):1.146):0.728); -(((1:0.211,2:0.211):1.629,(3:0.754,4:0.754):1.086):0.801,(5:2.280,6:2.280):0.361); -(6:2.181,((4:0.875,5:0.875):1.131,(2:1.304,(1:0.821,3:0.821):0.484):0.701):0.176); -(6:2.249,(1:2.092,((2:0.617,4:0.617):1.413,(3:0.749,5:0.749):1.281):0.062):0.157); +(6:3.500,(1:2.236,(5:1.850,(4:0.660,(2:0.632,3:0.632):0.028):1.190):0.386):1.264); +(6:2.569,((1:0.818,(2:0.677,4:0.677):0.141):1.268,(3:1.105,5:1.105):0.982):0.483); +((3:0.676,(1:0.104,2:0.104):0.572):2.362,(6:2.790,(4:0.551,5:0.551):2.238):0.248); +(6:2.728,((3:0.655,5:0.655):1.202,(1:0.881,(2:0.783,4:0.783):0.098):0.976):0.871); +(6:4.714,(5:2.433,(3:1.318,(4:0.896,(1:0.506,2:0.506):0.391):0.422):1.114):2.281); +(6:2.210,((3:0.694,5:0.694):1.302,(4:0.726,(1:0.351,2:0.351):0.376):1.270):0.214); +(6:3.077,(5:2.349,((1:0.499,2:0.499):0.704,(3:0.730,4:0.730):0.473):1.146):0.728); +(((1:0.211,2:0.211):1.629,(3:0.754,4:0.754):1.086):0.801,(5:2.280,6:2.280):0.361); +(6:2.181,((4:0.875,5:0.875):1.131,(2:1.304,(1:0.821,3:0.821):0.484):0.701):0.176); +(6:2.249,(1:2.092,((2:0.617,4:0.617):1.413,(3:0.749,5:0.749):1.281):0.062):0.157); diff --git a/examples/treefilelist.txt b/examples/treefilelist.txt index 7d90b15de..66c585794 100644 --- a/examples/treefilelist.txt +++ b/examples/treefilelist.txt @@ -1,2 +1,2 @@ -treefile.txt -treefile.txt +treefile.txt +treefile.txt diff --git a/src/PhyloNetworks.jl b/src/PhyloNetworks.jl index 0979b3e6f..4a47cfe88 100644 --- a/src/PhyloNetworks.jl +++ b/src/PhyloNetworks.jl @@ -4,7 +4,7 @@ module PhyloNetworks # stdlib (standard libraries) using Dates - using Distributed + using Distributed # used for parsimony search, currently broken using LinearAlgebra: diag, I, logdet, norm, LowerTriangular, mul!, lmul!, rmul!, Diagonal, cholesky, qr, BLAS # alternative: drop support for julia v1.4, because LinearAlgebra.rotate! requires julia v1.5 @@ -24,57 +24,40 @@ module PhyloNetworks using Distributions #for RateVariationAcrossSites using FASTX using Functors: fmap - using GLM # for the lm function using NLopt # for branch lengths optimization - using StaticArrays - using StatsBase # sample, coef etc. - using StatsFuns # logsumexp, logaddexp, log2π, various cdf - using StatsModels # re-exported by GLM. for ModelFrame ModelMatrix Formula etc + using StatsBase # cov2cor! for vcv import Base: show - import GLM: ftest - import StatsModels: coefnames const DEBUGC = false # even more debug messages global CHECKNET = false # for debugging only - export ftest export ## Network Definition HybridNetwork, - DataCF, - Quartet, - readTopology, - readTopologyLevel1, - tipLabels, - writeTopology, - writeSubTree!, + readnewick, + readmultinewick, + writenewick, + writesubtree!, + writemultinewick, hybridlambdaformat, deleteleaf!, deleteaboveLSA!, removedegree2nodes!, shrink2cycles!, shrink3cycles!, - printEdges, - printNodes, - sorttaxa!, - ## SNAQ - readTrees2CF, - countquartetsintrees, - readTableCF, - readTableCF!, - writeTableCF, - mapAllelesCFtable, - readInputTrees, + printedges, + printnodes, readnexus_treeblock, - summarizeDataCF, - snaq!, - readSnaqNetwork, - topologyMaxQPseudolik!, - topologyQPseudolik!, + ## getters # fixit: add ancestors? getsibling? getdescendants (currently descendants)? getroot, + istimeconsistent, + getnodeheights, + getnodeheights!, + getnodeheights_average, + getnodeheights_majortree, isrootof, isleaf, isexternal, @@ -90,126 +73,76 @@ module PhyloNetworks getparentedge, getparentedgeminor, getpartneredge, + tiplabels, ## Network Manipulation + nameinternalnodes!, rootatnode!, rootonedge!, - directEdges!, + directedges!, preorder!, cladewiseorder!, - fittedQuartetCF, rotate!, - setLength!, - setGamma!, - deleteHybridThreshold!, - displayedTrees, - majorTree, - minorTreeAt, - displayedNetworkAt!, - hardwiredClusters, - hardwiredCluster, - hardwiredCluster!, - hardwiredClusterDistance, - biconnectedComponents, - blobDecomposition!, - blobDecomposition, + setlength!, + setlengths!, + setgamma!, + deletehybridthreshold!, + displayedtrees, + majortree, + minortreeat, + displayednetworkat!, + hardwiredclusters, + hardwiredcluster, + hardwiredcluster!, + hardwiredclusterdistance, + biconnectedcomponents, + blobdecomposition!, + blobdecomposition, nni!, checkroot!, treeedgecomponents, - ## Network Bootstrap - treeEdgesBootstrap, - hybridDetection, - summarizeHFdf, - hybridBootstrapSupport, - bootsnaq, - readBootstrapTrees, - writeMultiTopology, - readMultiTopologyLevel1, - readMultiTopology, - hybridatnode!, - undirectedOtherNetworks, + ## Network support + treeedges_support, + hybridclades_support, + readmultinewick_files, ## Network Calibration - getNodeAges, - pairwiseTaxonDistanceMatrix, - calibrateFromPairwiseDistances!, - ## Network PCM - phylolm, - PhyloNetworkLinearModel, - simulate, - TraitSimulation, - ParamsBM, - ParamsMultiBM, - ShiftNet, - shiftHybrid, - getShiftEdgeNumber, - getShiftValue, - sharedPathMatrix, - descendenceMatrix, - regressorShift, - regressorHybrid, - ancestralStateReconstruction, - ReconstructedStates, - sigma2_phylo, - sigma2_within, - mu_phylo, - lambda_estim, - expectations, - expectationsPlot, - predint, - predintPlot, + getnodeages, + pairwisetaxondistancematrix, + calibratefrompairwisedistances!, + # recursion + sharedpathmatrix, + descendencematrix, vcv, - ## Discrete Trait PCM - parsimonySoftwired, + ## parsimony + parsimonysoftwired, parsimonyGF, - maxParsimonyNet, - TraitSubstitutionModel, - EqualRatesSubstitutionModel, - BinaryTraitSubstitutionModel, - TwoBinaryTraitSubstitutionModel, - JC69, HKY85, - nstates, - Q, - getlabels, - nparams, - RateVariationAcrossSites, - randomTrait, - randomTrait!, - fitdiscrete, + #maxParsimonyNet # broken after v0.17 refactoring: fix network search readfastatodna, - stationary, - empiricalDNAfrequencies, - # phyLiNC, # neighbor joining nj + ##Constants + const fAbsBL = 1e-10 + const fRelBL = 1e-12 + const xAbsBL = 1e-10 + const xRelBL = 1e-10 + include("types.jl") - include("nloptsummary.jl") include("auxiliary.jl") include("generate_topology.jl") - include("update.jl") - include("undo.jl") - include("addHybrid_snaq.jl") - include("addHybrid.jl") - include("deleteHybrid.jl") - include("moves_snaq.jl") include("moves_semidirected.jl") + include("addHybrid.jl") include("readwrite.jl") - include("readData.jl") - include("snaq_optimization.jl") - include("pseudolik.jl") include("descriptive.jl") include("manipulateNet.jl") include("bootstrap.jl") - include("multipleAlleles.jl") include("compareNetworks.jl") - include("traits.jl") + include("recursion_routines.jl") + include("recursion_matrices.jl") include("parsimony.jl") include("pairwiseDistanceLS.jl") include("interop.jl") - include("substitutionModels.jl") include("graph_components.jl") - include("traitsLikDiscrete.jl") include("deprecated.jl") include("nj.jl") - include("phyLiNCoptimization.jl") end #module diff --git a/src/addHybrid.jl b/src/addHybrid.jl index c7c61c96b..fe925b42e 100644 --- a/src/addHybrid.jl +++ b/src/addHybrid.jl @@ -2,14 +2,21 @@ # subject to topological constraints; no level restriction """ - addhybridedge!(net::HybridNetwork, nohybridladder::Bool, no3cycle::Bool, - constraints=TopologyConstraint[]::Vector{TopologyConstraint}; - maxattempts=10::Int, fixroot=false::Bool) + addhybridedge!( + [rng::AbstractRNG,] + net::HybridNetwork, + nohybridladder::Bool, + no3cycle::Bool, + constraints::Vector{TopologyConstraint}=TopologyConstraint[]; + maxattempts::Int=10, + fixroot::Bool=false + ) Randomly choose two edges in `net` then: add hybrid edge from edge 1 to edge 2 of length 0.01. The two halves of edge 1 (and of edge 2) have equal lengths. The hybrid partner edge (top half of edge 2, if fixroot is true) will point -towards the newly-created node on the middle of the original edge 2. +towards the newly-created node on the middle of the original edge 2, +and have an inheritance γ randomly uniformly chosen in (0,0.5). If the resulting network is a DAG, satisfies the constraint(s), does not contain any 3-cycle (if `no3cycle=true`), and does not have @@ -36,7 +43,7 @@ requires to flip the direction of edge 2, and to move the root accordingly # examples ```jldoctest -julia> net = readTopology("((S1,(((S2,(S3)#H1),(#H1,S4)))#H2),(#H2,S5));"); +julia> net = readnewick("((S1,(((S2,(S3)#H1),(#H1,S4)))#H2),(#H2,S5));"); julia> using Random @@ -55,23 +62,32 @@ julia> PhyloNetworks.addhybridedge!(net, true, true) attached to 2 node(s) (parent first): 8 9 ) -julia> writeTopology(net, round=true, digits=2) +julia> writenewick(net, round=true, digits=2) "((S1,(((#H1,S4),((S2,(S3)#H1))#H3:::0.67))#H2),((#H2,S5),#H3:0.01::0.33));" ``` """ -function addhybridedge!(net::HybridNetwork, nohybridladder::Bool, no3cycle::Bool, - constraints=TopologyConstraint[]::Vector{TopologyConstraint}; - maxattempts=10::Int, fixroot=false::Bool) +function addhybridedge!(net::HybridNetwork, nolad::Bool, args...; kwargs...) + addhybridedge!(Random.default_rng(), net, nolad, args...; kwargs...) +end +function addhybridedge!( + rng::Random.AbstractRNG, + net::HybridNetwork, + nohybridladder::Bool, + no3cycle::Bool, + constraints::Vector{TopologyConstraint}=TopologyConstraint[]; + maxattempts::Int=10, + fixroot::Bool=false +) all(con.type == 1 for con in constraints) || error("only type-1 constraints implemented so far") numedges = length(net.edge) blacklist = Set{Tuple{Int,Int}}() nmax_blacklist = numedges * (numedges-1) # all sets of edge1 -> edge2 nattempts = 0 while nattempts < maxattempts && length(blacklist) < nmax_blacklist - e1 = Random.rand(1:numedges) # presumably faster than Random.randperm or Random.shuffle + e1 = Random.rand(rng, 1:numedges) # presumably faster than Random.randperm or Random.shuffle edge1 = net.edge[e1] - e2 = Random.rand(1:(numedges-1)) # e2 must be different from e1: only numedges-1 options + e2 = Random.rand(rng, 1:(numedges-1)) # e2 must be different from e1: only numedges-1 options edge2 = net.edge[(e2 0.2) # if true: partner hybrid = new edge above edge 2 + hybridpartnernew = (fixroot ? true : rand(rng) > 0.2) # if true: partner hybrid = new edge above edge 2 ## check that the new network will be a DAG: no directional conflict if directionalconflict(p1, edge2, hybridpartnernew) if fixroot # don't try to change the direction of edge2 @@ -114,7 +130,7 @@ function addhybridedge!(net::HybridNetwork, nohybridladder::Bool, no3cycle::Bool continue end # else: switching hybridpartnernew worked end - newgamma = rand()*0.5; # in (0,.5) to create a minor hybrid edge + newgamma = rand(rng)/2; # in (0,.5) to create a minor hybrid edge return addhybridedge!(net, edge1, edge2, hybridpartnernew, 0.01, newgamma) end # if we get here: none of the max number of attempts worked - return nothing. @@ -123,8 +139,14 @@ function addhybridedge!(net::HybridNetwork, nohybridladder::Bool, no3cycle::Bool end """ - addhybridedge!(net::HybridNetwork, edge1::Edge, edge2::Edge, hybridpartnernew::Bool, - edgelength=-1.0::Float64, gamma=-1.0::Float64) + addhybridedge!( + net::HybridNetwork, + edge1::Edge, + edge2::Edge, + hybridpartnernew::Bool, + edgelength::Float64=-1.0, + gamma::Float64=-1.0 + ) Add hybridization to `net` coming from `edge1` going into `edge2`. 2 new nodes and 3 new edges are created: `edge1` are `edge2` are both cut into 2 edges, @@ -136,14 +158,14 @@ and either the newly edge "above" `edge2` if `hybridpartnernew=true`, or the old `edge2` otherwise (which would reverse the direction of `edge2` and others). Should be called from the other method, which performs a bunch of checks. -Updates `containRoot` attributes for edges below the new hybrid node. +Updates `containroot` attributes for edges below the new hybrid node. Output: new hybrid node (middle of the old `edge2`) and new hybrid edge. # examples ```jldoctest -julia> net = readTopology("((S8,(((S1,(S5)#H1),(#H1,S6)))#H2),(#H2,S10));"); +julia> net = readnewick("((S8,(((S1,(S5)#H1),(#H1,S6)))#H2),(#H2,S10));"); julia> hybnode, hybedge = PhyloNetworks.addhybridedge!(net, net.edge[13], net.edge[8], true, 0.0, 0.2) (PhyloNetworks.Node: @@ -159,43 +181,49 @@ julia> hybnode, hybedge = PhyloNetworks.addhybridedge!(net, net.edge[13], net.ed ) -julia> writeTopology(net) +julia> writenewick(net) "((S8,(((S1,(S5)#H1),((#H1,S6))#H3:::0.8))#H2),(#H2,(S10,#H3:0.0::0.2)));" ``` """ -function addhybridedge!(net::HybridNetwork, edge1::Edge, edge2::Edge, hybridpartnernew::Bool, - edgelength::Float64=-1.0, gamma::Float64=-1.0) +function addhybridedge!( + net::HybridNetwork, + edge1::Edge, + edge2::Edge, + hybridpartnernew::Bool, + edgelength::Float64=-1.0, + gamma::Float64=-1.0 +) gamma == -1.0 || (gamma <= 1.0 && gamma >= 0.0) || error("invalid γ to add a hybrid edge") gbar = (gamma == -1.0 ? -1.0 : 1.0 - gamma) # 1-gamma, with γ=-1 as missing newnode1_tree, edgeabovee1 = breakedge!(edge1, net) # new tree node newnode2_hybrid, edgeabovee2 = breakedge!(edge2, net) # new hybrid node newnode2_hybrid.hybrid = true - pushHybrid!(net, newnode2_hybrid) # updates net.hybrid and net.numHybrids + pushHybrid!(net, newnode2_hybrid) # updates net.hybrid and net.numhybrids # new hybrid edge, minor if γ missing (-1) - hybrid_edge = Edge(maximum(e.number for e in net.edge) + 1, edgelength, true, gamma, gamma>0.5) # number, length, hybrid, gamma, isMajor + hybrid_edge = Edge(maximum(e.number for e in net.edge) + 1, edgelength, true, gamma, gamma>0.5) # number, length, hybrid, gamma, ismajor # partner edge: update hybrid status, γ and direction if hybridpartnernew edgeabovee2.hybrid = true edgeabovee2.gamma = gbar if gamma>0.5 - edgeabovee2.isMajor = false + edgeabovee2.ismajor = false end else c2 = getchild(edge2) # child of edge2 before we switch its direction i2 = findfirst(isequal(c2), net.node) - net.root = i2 # makes c2 the new root node + net.rooti = i2 # makes c2 the new root node edge2.hybrid = true edge2.gamma = gbar if gamma>0.5 - edge2.isMajor = false + edge2.ismajor = false end - edge2.isChild1 = !edge2.isChild1 # reverse the direction of edge2 - edgeabovee2.isChild1 = !edgeabovee2.isChild1 + edge2.ischild1 = !edge2.ischild1 # reverse the direction of edge2 + edgeabovee2.ischild1 = !edgeabovee2.ischild1 end # parse hyb names to find the next available. assignhybridnames! would do them all rx = r"^H(\d+)$" - hnum = net.numHybrids # to name the new hybrid, potentially + hnum = net.numhybrids # to name the new hybrid, potentially for n in net.node m = match(rx, n.name) if m !== nothing @@ -204,15 +232,15 @@ function addhybridedge!(net::HybridNetwork, edge1::Edge, edge2::Edge, hybridpart end end newnode2_hybrid.name = "H$hnum" - setNode!(hybrid_edge, [newnode2_hybrid, newnode1_tree]) # [child node, parent node] to match isChild1=true + setNode!(hybrid_edge, [newnode2_hybrid, newnode1_tree]) # [child node, parent node] to match ischild1=true setEdge!(newnode1_tree, hybrid_edge) setEdge!(newnode2_hybrid, hybrid_edge) pushEdge!(net, hybrid_edge) if hybridpartnernew - # @debug "triple-check it's a DAG" directEdges!(net) + # @debug "triple-check it's a DAG" directedges!(net) norootbelow!(edge2) else - directEdges!(net) + directedges!(net) norootbelow!(edgeabovee2) end return newnode2_hybrid, hybrid_edge @@ -243,11 +271,11 @@ Does *not* modify the network. Output: `true` if a conflict would arise (non-DAG), `false` if no conflict. """ function directionalconflict(parent::Node, edge2::Edge, hybridpartnernew::Bool) - if hybridpartnernew # all edges would retain their directions: use isChild1 fields + if hybridpartnernew # all edges would retain their directions: use ischild1 fields c2 = getchild(edge2) return parent === c2 || isdescendant(parent, c2) else # after hybrid addition, edge 2 would be reversed: "up" toward its own parent - if !edge2.containRoot || edge2.hybrid + if !edge2.containroot || edge2.hybrid return true # direction of edge2 cannot be reversed else # net would be a DAG with reversed directions, could even be rooted on edge2 p2 = getparent(edge2) @@ -255,3 +283,140 @@ function directionalconflict(parent::Node, edge2::Edge, hybridpartnernew::Bool) end end end + + +# --- add alternative hybridizations found in bootstrap +""" + addAlternativeHybridizations!(net::HybridNetwork, BSe::DataFrame; + cutoff::Number=10, top::Int=3) + +Modify the network `net` (the best estimated network) by adding some of +the hybridizations present in the bootstrap networks. By default, it will only +add hybrid edges with more than 10% bootstrap support (`cutoff`) and it will +only include the top 3 hybridizations (`top`) sorted by bootstrap support. + +The dataframe `BSe` is also modified. In the original `BSe`, +supposedly obtained with `hybridclades_support`, hybrid edges that do not +appear in the best network have a missing number. +After hybrid edges from bootstrap networks are added, +`BSe` is modified to include the edge numbers of the newly added hybrid edges. +To distinguish hybrid edges present in the original network versus new edges, +an extra column of true/false values is also added to `BSe`, named "alternative", +with true for newly added edges absent from the original network. + +The hybrid edges added to `net` are added as minor edges, to keep the underlying +major tree topology. + +# example + +```jldoctest +julia> bootnet = readmultinewick(joinpath(dirname(pathof(PhyloNetworks)), "..","examples", "bootsnaq.out")); # vector of 10 networks + +julia> bestnet = readnewick("((O,(E,#H7:::0.196):0.314):0.332,(((A)#H7:::0.804,B):10.0,(C,D):10.0):0.332);"); + +julia> BSn, BSe, BSc, BSgam, BSedgenum = hybridclades_support(bootnet, bestnet); + +julia> BSe[1:6,[:edge,:hybrid_clade,:sister_clade,:BS_hybrid_edge]] +6×4 DataFrame + Row │ edge hybrid_clade sister_clade BS_hybrid_edge + │ Int64? String String Float64 +─────┼───────────────────────────────────────────────────── + 1 │ 7 H7 B 33.0 + 2 │ 3 H7 E 32.0 + 3 │ missing c_minus3 c_minus8 44.0 + 4 │ missing c_minus3 H7 44.0 + 5 │ missing E O 12.0 + 6 │ missing c_minus6 c_minus8 9.0 + +julia> PhyloNetworks.addAlternativeHybridizations!(bestnet, BSe) + +julia> BSe[1:6,[:edge,:hybrid_clade,:sister_clade,:BS_hybrid_edge,:alternative]] +6×5 DataFrame + Row │ edge hybrid_clade sister_clade BS_hybrid_edge alternative + │ Int64? String String Float64 Bool +─────┼────────────────────────────────────────────────────────────────── + 1 │ 7 H7 B 33.0 false + 2 │ 3 H7 E 32.0 false + 3 │ 16 c_minus3 c_minus8 44.0 true + 4 │ 19 c_minus3 H7 44.0 true + 5 │ 22 E O 12.0 true + 6 │ missing c_minus6 c_minus8 9.0 false + +julia> # using PhyloPlots; plot(bestnet, edgelabel=BSe[:,[:edge,:BS_hybrid_edge]]); +``` +""" +function addAlternativeHybridizations!( + net::HybridNetwork, + BSe::DataFrame; + cutoff::Number=10, + top::Int=3 +) + top > 0 || error("top must be greater than 0") + BSe[!,:alternative] = falses(nrow(BSe)) + newBSe = subset(BSe, + :BS_hybrid_edge => x -> x.> cutoff, :edge => ByRow( ismissing), + :hybrid => ByRow(!ismissing), :sister => ByRow(!ismissing), + ) + top = min(top,nrow(newBSe)) + if top==0 + @info "no alternative hybridizations with support > cutoff $cutoff%, so nothing added." + return + end + for i in 1:top + hybnum = newBSe[i,:hybrid] + sisnum = newBSe[i,:sister] + edgenum = addHybridBetweenClades!(net, hybnum, sisnum) + if isnothing(edgenum) + @warn "cannot add desired hybrid (BS=$(newBSe[i,:BS_hybrid_edge])): the network would have a directed cycle" + continue + end + ind1 = findall(x->!ismissing(x) && x==hybnum, BSe[!,:hybrid]) + ind2 = findall(x->!ismissing(x) && x==sisnum, BSe[!,:sister]) + ind = intersect(ind1,ind2) + BSe[ind,:edge] .= edgenum + BSe[ind,:alternative] .= true + end +end + + +""" + addHybridBetweenClades!(net::HybridNetwork, hybnum::Number, sisnum::Number) + +Modify `net` by adding a minor hybrid edge from "donor" to "recipient", +where "donor" is the major parent edge `e1` of node number `hybnum` and +"recipient" is the major parent edge `e2` of node number `sisnum`. +The new nodes are currently inserted at the middle of these parent edges. + +If a hybrid edge from `e1` to `e2` would create a directed cycle in the network, +then this hybrid cannot be added. +In that case, the donor edge `e1` is moved up if its parent is a hybrid node, +to ensure that the sister clade to the new hybrid would be a desired (the +descendant taxa from `e1`) and a new attempt is made to create a hybrid edge. + +Output: number of the new hybrid edge, or `nothing` if the desired hybridization +is not possible. + +See also: +[`addhybridedge!`](@ref) (used by this method) and +[`directionalconflict`](@ref) to check that `net` would still be a DAG. +""" +function addHybridBetweenClades!(net::HybridNetwork, hybnum::Number, sisnum::Number) + hybind = getIndexNode(hybnum,net) + sisind = getIndexNode(sisnum,net) + e1 = getparentedge(net.node[sisind]) # major parent edges + e2 = getparentedge(net.node[hybind]) + p1 = getparent(e1) + if directionalconflict(p1, e2, true) # then: first try to move the donor up + # so long as the descendant taxa (= sister clade) remain the same + while p1.hybrid + e1 = getparentedge(p1) # major parent edge: same descendant taxa + p1 = getparent(e1) + end + directionalconflict(p1, e2, true) && return nothing + end + hn, he = addhybridedge!(net, e1, e2, true) # he: missing length & gamma by default + # ideally: add option "where" to breakedge!, used by addhybridedge! + # so as to place the new nodes at the base of each clade. + # currently: the new nodes are inserted at the middle of e1 and e2. + return he.number +end \ No newline at end of file diff --git a/src/addHybrid_snaq.jl b/src/addHybrid_snaq.jl deleted file mode 100644 index bda76f242..000000000 --- a/src/addHybrid_snaq.jl +++ /dev/null @@ -1,476 +0,0 @@ -# functions to add a hybridization -# originally in functions.jl -# Claudia March 2015 - - -# ------------------------------------------------ add new hybridization------------------------------------ - -# function to add hybridization event -# input: edge1, edge2 are the edges to remove -# edge3, edge4, edge5 are the new tree edges to add -# net is the network -# gamma is the gamma for the hybridization -# warning: assumes that edge1, edge2 are tree edges with inCycle=-1 -# assumes the hybrid edge goes from edge1 to edge2 -# sets minor hybrid edge length to zero -# this function create the hybrid node/edges and connect everything -# and deletes edge1,2 from the nodes, and removes the nodes from edge1,2 -# returns the hybrid node to start future updates there -function createHybrid!(edge1::Edge, edge2::Edge, edge3::Edge, edge4::Edge, net::HybridNetwork, gamma::Float64) - 0 < gamma < 1 || error("gamma must be between 0 and 1: $(gamma)") - (edge1.hybrid || edge2.hybrid) ? error("edges to delete must be tree edges") : nothing - (edge3.hybrid || edge4.hybrid) ? error("edges to add must be tree edges") : nothing - pushEdge!(net,edge3); - pushEdge!(net,edge4); - # create hybridization - max_node = maximum([e.number for e in net.node]); - max_edge = maximum([e.number for e in net.edge]); - gamma < 0.5 || @warn "adding a major hybrid edge with gamma $(gamma), this can cause problems when updating incycle" - hybrid_edge = Edge(max_edge+1,0.0,true,gamma,gamma>=0.5); - pushEdge!(net,hybrid_edge); - hybrid_node = Node(max_node+1,false,true,[edge2,hybrid_edge,edge4]); - tree_node = Node(max_node+2,false,false,[edge1,edge3,hybrid_edge]); - setNode!(hybrid_edge,[tree_node,hybrid_node]); - setNode!(edge3,[tree_node,edge1.node[2]]); - setNode!(edge4,[hybrid_node,edge2.node[2]]); - setEdge!(edge1.node[2],edge3); - setEdge!(edge2.node[2],edge4); - removeEdge!(edge2.node[2],edge2); - removeEdge!(edge1.node[2],edge1); - removeNode!(edge1.node[2],edge1); - setNode!(edge1,tree_node); - removeNode!(edge2.node[2],edge2); - #[n.number for n in edge2.node] - setNode!(edge2,hybrid_node) - pushNode!(net,hybrid_node); - pushNode!(net,tree_node); - #pushHybrid!(net,hybrid_node); - return hybrid_node -end - -# aux function for chooseEdgesGamma to identify -# if two edges are sisters and if they are cherry -# (have leaves) -# returns true/false for sisters, true/false for cherry -# true/false for nonidentifiable (two leaves, k=1 node crossed by hybridization) -function sisterOrCherry(edge1::Edge,edge2::Edge) - sisters = false - cherry = false - nonidentifiable = false - node = nothing; - if isEqual(edge1.node[1],edge2.node[1]) || isEqual(edge1.node[1],edge2.node[2]) - node = edge1.node[1]; - elseif isEqual(edge1.node[2],edge2.node[1]) || isEqual(edge1.node[2],edge2.node[2]) - node = edge1.node[2]; - end - if node !== nothing - size(node.edge,1) == 3 || error("node found $(node.number) that does not have exactly 3 edges, it has $(size(node.edge,1)) edges instead.") - sisters = true - if getOtherNode(edge1,node).leaf && getOtherNode(edge2,node).leaf - cherry = true - elseif getOtherNode(edge1,node).leaf || getOtherNode(edge2,node).leaf - edge = nothing - for e in node.edge - if(!isEqual(e,edge1) && !isEqual(e,edge2)) - edge = e - end - end - if getOtherNode(edge,node).leaf - nonidentifiable = true - end - end - end - return sisters, cherry, nonidentifiable -end - -# aux function to addHybridization -# it chooses the edges in the network and the gamma value -# warning: chooses edge1, edge2, gamma randomly, but -# we could do better later -# check: gamma is uniform(0,1/2) to avoid big gammas -# fixit: add different function to choose gamma -# fixit: how to stop from infinite loop if there are no options -# blacklist used for afterOptBLAll -# input: edges, list of edges from which to choose, default is net.edge -# warning: if edges is not net.edge, it still need to contain Edge objects from net (not deepcopies) -function chooseEdgesGamma(net::HybridNetwork, blacklist::Bool, edges::Vector{Edge}) - index1 = 1; - index2 = 1; - inlimits = false - inblack = true - cherry = false - nonidentifiable = false - while !inlimits || edges[index1].inCycle != -1 || edges[index2].inCycle != -1 || inblack || cherry || nonidentifiable - index1 = round(Integer,rand()*size(edges,1)); - index2 = round(Integer,rand()*size(edges,1)); - if index1 != index2 && index1 != 0 && index2 != 0 && index1 <= size(edges,1) && index2 <= size(edges,1) - inlimits = true - sisters, cherry, nonidentifiable = sisterOrCherry(edges[index1],edges[index2]); - else - inlimits = false - end - if blacklist && !isempty(net.blacklist) - length(net.blacklist) % 2 == 0 || error("net.blacklist should have even number of entries, not length: $(length(net.blacklist))") - i = 1 - while i < length(net.blacklist) - if edges[index1].number == net.blacklist[i] - if edges[index2].number == net.blacklist[i+1] - inblack = true - else - inblack = false - end - elseif edges[index2].number == net.blacklist[i] - if edges[index1].number == net.blacklist[i+1] - inblack = true - else - inblack = false - end - end - i += 2 - end - else - inblack = false - end - end - gamma = rand()*0.5; - @debug "choose edges and gamma: from $(edges[index1].number) to $(edges[index2].number), $(gamma)" - return edges[index1],edges[index2],gamma -end - -chooseEdgesGamma(net::HybridNetwork) = chooseEdgesGamma(net, false, net.edge) -chooseEdgesGamma(net::HybridNetwork, blacklist::Bool) = chooseEdgesGamma(net, blacklist, net.edge) - -# aux function for addHybridization -# that takes the output edge1, edge2. -# returns edge3, edge4, and adjusts edge1, edge2 to shorter length -# fixit: problem if edge1 or edge2 have a missing length, coded as -1.0. -# would be best to set lengths of e3, e4 to 0.0, and leave lengths of e1,e2 unchanged -function parameters4createHybrid!(edge1::Edge, edge2::Edge,net::HybridNetwork) - max_edge = maximum([e.number for e in net.edge]); - t1 = rand()*edge1.length; - t3 = edge1.length - t1; - edge3 = Edge(max_edge+1,t3); - edge1.length = t1; - t1 = rand()*edge2.length; - t3 = edge2.length - t1; - edge4 = Edge(max_edge+2,t3); - edge2.length = t1; - edge3.containRoot = edge1.containRoot - edge4.containRoot = edge2.containRoot - return edge3, edge4 -end - -# aux function to add the hybridization -# without checking all the updates -# returns the hybrid node of the new hybridization -# calls chooseEdgesGamma, parameter4createHybrid and createHybrid -# blacklist used in afterOptBLAll -# usePartition=true if we use the information on net.partition, default true -function addHybridization!(net::HybridNetwork, blacklist::Bool, usePartition::Bool) - if(net.numHybrids > 0 && usePartition) - !isempty(net.partition) || error("net has $(net.numHybrids) but net.partition is empty") - index = choosePartition(net) - if(index == 0) #no place for new hybrid - @debug "no partition suitable to place new hybridization" - return nothing - end - partition = splice!(net.partition,index) #type partition - @debug "add hybrid with partition $([n.number for n in partition.edges])" - edge1, edge2, gamma = chooseEdgesGamma(net, blacklist,partition.edges); - else - edge1, edge2, gamma = chooseEdgesGamma(net, blacklist); - end - @debug "add hybridization between edge1, $(edge1.number) and edge2 $(edge2.number) with gamma $(gamma)" - edge3, edge4 = parameters4createHybrid!(edge1,edge2,net); - hybrid = createHybrid!(edge1, edge2, edge3, edge4, net, gamma); - return hybrid -end - -addHybridization!(net::HybridNetwork) = addHybridization!(net, false, true) - -# function to update who is the major hybrid -# after a new hybridization is added and -# inCycle is updated -# warning: needs updateInCycle! run first -# can return the updated edge for when undoing network moves, not needed now -function updateMajorHybrid!(net::HybridNetwork, node::Node) - node.hybrid || error("node $(node.number) is not hybrid, cannot update major hybrid after updateInCycle") - length(node.edge) == 3 || error("hybrid node $(node.number) has $(length(node.edge)) edges, should have 3") - hybedge = nothing - edgecycle = nothing - for e in node.edge - if(e.hybrid) - hybedge = e - elseif(e.inCycle != -1 && !e.hybrid) - edgecycle = e - end - end - !isa(hybedge,Nothing) || error("hybrid node $(node.number) does not have hybrid edge") - !isa(edgecycle,Nothing) || error("hybrid node $(node.number) does not have tree edge in cycle to update to hybrid edge after updateInCycle") - #println("updating hybrid status to edgeincycle $(edgecycle.number) for hybedge $(hybedge.number)") - makeEdgeHybrid!(edgecycle,node,1-hybedge.gamma) -end - -# function to update everything of a new hybridization -# it follows the flow diagram in ipad -# input: new added hybrid, network, -# updatemajor (bool) to decide if we need to update major edge -# only need to update if new hybrid added, if read from file not needed -# allow=true allows extreme/very bad triangles, needed when reading -# updatePart = true will update PArtition at this moment, it makes sense with a newly added hybrid -# but not if net just read (because in this case it needs all inCycle updated before) -# returns: success bool, hybrid, flag, nocycle, flag2, flag3 -function updateAllNewHybrid!(hybrid::Node,net::HybridNetwork, updatemajor::Bool, allow::Bool, updatePart::Bool) - flag, nocycle, edgesInCycle, nodesInCycle = updateInCycle!(net,hybrid); - if(nocycle) - return false, hybrid, flag, nocycle, false, false - else - if(flag) - if(updatemajor) - updateMajorHybrid!(net,hybrid); - end - flag2, edgesGammaz = updateGammaz!(net,hybrid,allow); - if(flag2) - flag3, edgesRoot = updateContainRoot!(net,hybrid); - if(updatePart) - updatePartition!(net,nodesInCycle) - end - if(flag3) - parameters!(net) - return true, hybrid, flag, nocycle, flag2, flag3 - else - #undoContainRoot!(edgesRoot); - #undoistIdentifiable!(edgesGammaz); - #undoGammaz!(hybrid,net); - #undoInCycle!(edgesInCycle, nodesInCycle); - return false, hybrid, flag, nocycle, flag2, flag3 - end - else - if(updatePart) - updatePartition!(net,nodesInCycle) - end - flag3, edgesRoot = updateContainRoot!(net,hybrid); #update contain root even if it is bad triangle to writeTopologyLevel1 correctly - #undoistIdentifiable!(edgesGammaz); - #undoGammaz!(hybrid,net); - #undoInCycle!(edgesInCycle, nodesInCycle); - return false, hybrid, flag, nocycle, flag2, flag3 - end - else - # no need to do updatePartition in this case, because we only call deleteHybrid after - undoInCycle!(edgesInCycle, nodesInCycle); - return false, hybrid, flag, nocycle, true, true - end - end -end - -updateAllNewHybrid!(hybrid::Node,net::HybridNetwork, updatemajor::Bool) = updateAllNewHybrid!(hybrid,net, updatemajor, false, true) - -# function to add a new hybridization event -# it calls chooseEdgesGamma and createHybrid! -# input: network -# check: assumes that one of the two possibilities for -# major hybrid edge gives you a cycle, true? -# warning: "while" removed, it does not attempt to add until -# success, it attempts to add once -# returns: success (bool), hybrid, flag, nocycle, flag2, flag3 -# blacklist used in afterOptBLAll -function addHybridizationUpdate!(net::HybridNetwork, blacklist::Bool, usePartition::Bool) - hybrid = addHybridization!(net,blacklist, usePartition); - isa(hybrid,Nothing) && return false,nothing,false,false,false,false - updateAllNewHybrid!(hybrid,net,true) -end - -addHybridizationUpdate!(net::HybridNetwork) = addHybridizationUpdate!(net, false, true) -addHybridizationUpdate!(net::HybridNetwork, blacklist::Bool) = addHybridizationUpdate!(net, blacklist::Bool, true) - - - - -# function that will add a hybridization with addHybridizationUpdate, -# if success=false, it will try to move the hybridization before -# declaring failure -# blacklist used in afterOptBLAll -function addHybridizationUpdateSmart!(net::HybridNetwork, blacklist::Bool, N::Integer) - global CHECKNET - @debug "MOVE: addHybridizationUpdateSmart" - success, hybrid, flag, nocycle, flag2, flag3 = addHybridizationUpdate!(net, blacklist) - @debug begin - printEverything(net) - "success $(success), flag $(flag), flag2 $(flag2), flag3 $(flag3)" - end - i = 0 - if !success - if isa(hybrid,Nothing) - @debug "MOVE: could not add hybrid by any means" - else - while((nocycle || !flag) && i < N) #incycle failed - @debug "MOVE: added hybrid causes conflict with previous cycle, need to delete and add another" - deleteHybrid!(hybrid,net,true) - success, hybrid, flag, nocycle, flag2, flag3 = addHybridizationUpdate!(net, blacklist) - end - if(nocycle || !flag) - @debug "MOVE: added hybridization $(i) times trying to avoid incycle conflicts, but failed" - else - if(!flag3 && flag2) #containRoot failed - @debug "MOVE: added hybrid causes problems with containRoot, will change the direction to fix it" - success = changeDirectionUpdate!(net,hybrid) #change dir of minor - elseif(!flag2 && flag3) #gammaz failed - @debug "MOVE: added hybrid has problem with gammaz (not identifiable bad triangle)" - if(flag3) - @debug "MOVE: we will move origin to fix the gammaz situation" - success = moveOriginUpdateRepeat!(net,hybrid,true) - else - @debug "MOVE: we will move target to fix the gammaz situation" - success = moveTargetUpdateRepeat!(net,hybrid,true) - end - elseif(!flag2 && !flag3) #containRoot AND gammaz failed - @debug "MOVE: containRoot and gammaz both fail" - end - end - if !success - @debug "MOVE: could not fix the added hybrid by any means, we will delete it now" - CHECKNET && checkNet(net) - @debug begin printEverything(net); "printed everything" end - deleteHybridizationUpdate!(net,hybrid) - @debug begin printEverything(net); "printed everything" end - CHECKNET && checkNet(net) - end - end - end - success && @debug "MOVE: added hybridization SUCCESSFUL: new hybrid $(hybrid.number)" - return success -end - -addHybridizationUpdateSmart!(net::HybridNetwork, N::Integer) = addHybridizationUpdateSmart!(net, false,N) - - -# --- add alternative hybridizations found in bootstrap -""" - addAlternativeHybridizations!(net::HybridNetwork, BSe::DataFrame; - cutoff=10::Number, top=3::Int) - -Modify the network `net` (the best estimated network) by adding some of -the hybridizations present in the bootstrap networks. By default, it will only -add hybrid edges with more than 10% bootstrap support (`cutoff`) and it will -only include the top 3 hybridizations (`top`) sorted by bootstrap support. - -The dataframe `BSe` is also modified. In the original `BSe`, -supposedly obtained with `hybridBootstrapSupport`, hybrid edges that do not -appear in the best network have a missing number. -After hybrid edges from bootstrap networks are added, -`BSe` is modified to include the edge numbers of the newly added hybrid edges. -To distinguish hybrid edges present in the original network versus new edges, -an extra column of true/false values is also added to `BSe`, named "alternative", -with true for newly added edges absent from the original network. - -The hybrid edges added to `net` are added as minor edges, to keep the underlying -major tree topology. - -# example - -```jldoctest -julia> bootnet = readMultiTopology(joinpath(dirname(pathof(PhyloNetworks)), "..","examples", "bootsnaq.out")); # vector of 10 networks - -julia> bestnet = readTopology("((O,(E,#H7:::0.196):0.314):0.332,(((A)#H7:::0.804,B):10.0,(C,D):10.0):0.332);"); - -julia> BSn, BSe, BSc, BSgam, BSedgenum = hybridBootstrapSupport(bootnet, bestnet); - -julia> BSe[1:6,[:edge,:hybrid_clade,:sister_clade,:BS_hybrid_edge]] -6×4 DataFrame - Row │ edge hybrid_clade sister_clade BS_hybrid_edge - │ Int64? String String Float64 -─────┼───────────────────────────────────────────────────── - 1 │ 7 H7 B 33.0 - 2 │ 3 H7 E 32.0 - 3 │ missing c_minus3 c_minus8 44.0 - 4 │ missing c_minus3 H7 44.0 - 5 │ missing E O 12.0 - 6 │ missing c_minus6 c_minus8 9.0 - -julia> PhyloNetworks.addAlternativeHybridizations!(bestnet, BSe) - -julia> BSe[1:6,[:edge,:hybrid_clade,:sister_clade,:BS_hybrid_edge,:alternative]] -6×5 DataFrame - Row │ edge hybrid_clade sister_clade BS_hybrid_edge alternative - │ Int64? String String Float64 Bool -─────┼────────────────────────────────────────────────────────────────── - 1 │ 7 H7 B 33.0 false - 2 │ 3 H7 E 32.0 false - 3 │ 16 c_minus3 c_minus8 44.0 true - 4 │ 19 c_minus3 H7 44.0 true - 5 │ 22 E O 12.0 true - 6 │ missing c_minus6 c_minus8 9.0 false - -julia> # using PhyloPlots; plot(bestnet, edgelabel=BSe[:,[:edge,:BS_hybrid_edge]]); -``` -""" -function addAlternativeHybridizations!(net::HybridNetwork,BSe::DataFrame; cutoff=10::Number,top=3::Int) - top > 0 || error("top must be greater than 0") - BSe[!,:alternative] = falses(nrow(BSe)) - newBSe = subset(BSe, - :BS_hybrid_edge => x -> x.> cutoff, :edge => ByRow( ismissing), - :hybrid => ByRow(!ismissing), :sister => ByRow(!ismissing), - ) - top = min(top,nrow(newBSe)) - if top==0 - @info "no alternative hybridizations with support > cutoff $cutoff%, so nothing added." - return - end - for i in 1:top - hybnum = newBSe[i,:hybrid] - sisnum = newBSe[i,:sister] - edgenum = addHybridBetweenClades!(net, hybnum, sisnum) - if isnothing(edgenum) - @warn "cannot add desired hybrid (BS=$(newBSe[i,:BS_hybrid_edge])): the network would have a directed cycle" - continue - end - ind1 = findall(x->!ismissing(x) && x==hybnum, BSe[!,:hybrid]) - ind2 = findall(x->!ismissing(x) && x==sisnum, BSe[!,:sister]) - ind = intersect(ind1,ind2) - BSe[ind,:edge] .= edgenum - BSe[ind,:alternative] .= true - end -end - - -""" - addHybridBetweenClades!(net::HybridNetwork, hybnum::Number, sisnum::Number) - -Modify `net` by adding a minor hybrid edge from "donor" to "recipient", -where "donor" is the major parent edge `e1` of node number `hybnum` and -"recipient" is the major parent edge `e2` of node number `sisnum`. -The new nodes are currently inserted at the middle of these parent edges. - -If a hybrid edge from `e1` to `e2` would create a directed cycle in the network, -then this hybrid cannot be added. -In that case, the donor edge `e1` is moved up if its parent is a hybrid node, -to ensure that the sister clade to the new hybrid would be a desired (the -descendant taxa from `e1`) and a new attempt is made to create a hybrid edge. - -Output: number of the new hybrid edge, or `nothing` if the desired hybridization -is not possible. - -See also: -[`addhybridedge!`](@ref) (used by this method) and -[`directionalconflict`](@ref) to check that `net` would still be a DAG. -""" -function addHybridBetweenClades!(net::HybridNetwork, hybnum::Number, sisnum::Number) - hybind = getIndexNode(hybnum,net) - sisind = getIndexNode(sisnum,net) - e1 = getparentedge(net.node[sisind]) # major parent edges - e2 = getparentedge(net.node[hybind]) - p1 = getparent(e1) - if directionalconflict(p1, e2, true) # then: first try to move the donor up - # so long as the descendant taxa (= sister clade) remain the same - while p1.hybrid - e1 = getparentedge(p1) # major parent edge: same descendant taxa - p1 = getparent(e1) - end - directionalconflict(p1, e2, true) && return nothing - end - hn, he = addhybridedge!(net, e1, e2, true) # he: missing length & gamma by default - # ideally: add option "where" to breakedge!, used by addhybridedge! - # so as to place the new nodes at the base of each clade. - # currently: the new nodes are inserted at the middle of e1 and e2. - return he.number -end diff --git a/src/auxiliary.jl b/src/auxiliary.jl index 5cbd728ff..202118494 100644 --- a/src/auxiliary.jl +++ b/src/auxiliary.jl @@ -3,26 +3,10 @@ # Claudia February 2015 ##################### -function setCHECKNET(b::Bool) - global CHECKNET - CHECKNET = b - CHECKNET && @warn "PhyloNetworks.CHECKNET is true: will slow snaq! down." - b || @info "PhyloNetworks.CHECKNET set to false" -end + # ----- aux general functions --------------- -#based in coupon's collector: E+sqrt(V) -function coupon(n::Number) - return n*log(n) + n -end - -function binom(n::Number,k::Number) - n >= k || return 0 - n == 1 && return 1 - k == 0 && return 1 - binom(n-1,k-1) + binom(n-1,k) #recursive call -end function approxEq(a::Number,b::Number,absTol::Number,relTol::Number) if(a e.hybrid, node.edge) + node.booln1 = any(e -> e.hybrid, node.edge) end function getOtherNode(edge::Edge, node::Node) @@ -401,15 +389,6 @@ function getIndex(node::Node, net::Network) return i end -function getIndex(edge::Edge, net::Network) - i = 1; - while(i<= size(net.edge,1) && !isEqual(edge,net.edge[i])) - i = i+1; - end - i <= size(net.edge,1) || error("edge $(edge.number) not in network") - return i -end - function getIndex(edge::Edge, edges::Vector{Edge}) i = 1; while(i<= size(edges,1) && !isEqual(edge,edges[i])) @@ -418,6 +397,7 @@ function getIndex(edge::Edge, edges::Vector{Edge}) i <= size(edges,1) || error("edge $(edge.number) not in array of edges") return i end +getIndex(edge::Edge, net::Network) = getIndex(edge, net.edge) # aux function to find the index of a node in a # node array @@ -452,12 +432,6 @@ function getIndexEdge(edge::Edge,node::Node) findfirst(e -> isequal(edge,e), node.edge) end -# find the index of an edge with given number in node.edge -# bug found & fixed 2019-08-22. Unused function? -function getIndexEdge(number::Integer,node::Node) - findfirst(e -> isequal(number,e.number), node.edge) -end - # find the index of a node in edge.node function getIndexNode(edge::Edge,node::Node) size(edge.node,1) == 2 || @warn "this edge $(edge.number) has more or less than 2 nodes: $([n.number for n in edge.node])" @@ -481,23 +455,22 @@ function getIndexHybrid(node::Node, net::Network) return i end +""" + getconnectingedge(node1::Node, node2::Node) + +Edge shared by (or connecting) `node1` and `node2`, that is: edge incident +to both nodes. An error is thrown if the 2 nodes are not connected. -# function that given two nodes, it gives you the edge that connects them -# returns error if they are not connected by an edge -function getConnectingEdge(node1::Node,node2::Node) - found = false; - i = 1; - while(i<= size(node1.edge,1) && !found) - if(isequal(getOtherNode(node1.edge[i],node1),node2)) - found = true; +See also [`isconnected`](@ref) +""" +function getconnectingedge(node1::Node, node2::Node) + for e1 in node1.edge + for e2 in node2.edge + e1 === e2 && return e1 end - i = i+1; - end - if(found) - return node1.edge[i-1] - else - error("nodes not connected") end + error("nodes not connected") + return nothing end """ @@ -505,38 +478,28 @@ end Check if two nodes are connected by an edge. Return true if connected, false if not connected. + +See also [`getconnectingedge`](@ref) """ function isconnected(node1, node2) - for e in node1.edge - if e in node2.edge - return true - end - end - return false + !isdisjoint(node1.edge, node2.edge) # requires Julia v1.5 end -# function to check in an edge is in an array by comparing -# edge numbers (could use isEqual for adding comparisons of gammaz and inCycle) -# needed for updateHasEdge -function isEdgeNumIn(edge::Edge,array::Array{Edge,1}) - enum = edge.number - return any(e -> e.number == enum, array) -end -# function to check in a leaf is in an array by comparing -# the numbers (uses isEqual) -# needed for updateHasEdge -function isNodeNumIn(node::Node,array::Array{Node,1}) - return all((e->!isEqual(node,e)), array) ? false : true + +function isTree(net::HybridNetwork) + net.numhybrids == length(net.hybrid) || error("numhybrids does not match to length of net.hybrid") + net.numhybrids != 0 || return true + return false end # function to push a Node in net.node and -# update numNodes and numTaxa +# update numnodes and numtaxa function pushNode!(net::Network, n::Node) push!(net.node,n); - net.numNodes += 1; + net.numnodes += 1; if(n.leaf) - net.numTaxa += 1 + net.numtaxa += 1 push!(net.leaf,n); end if(n.hybrid) @@ -545,19 +508,19 @@ function pushNode!(net::Network, n::Node) end # function to push an Edge in net.edge and -# update numEdges +# update numedges function pushEdge!(net::Network, e::Edge) push!(net.edge,e); - net.numEdges += 1; + net.numedges += 1; end # function to push a hybrid Node in net.hybrid and -# update numHybrids +# update numhybrids function pushHybrid!(net::Network, n::Node) if(n.hybrid) push!(net.hybrid,n); - net.numHybrids += 1; + net.numhybrids += 1; else error("node $(n.number) is not hybrid, so cannot be pushed in net.hybrid") end @@ -565,13 +528,11 @@ end """ deleteNode!(net::HybridNetwork, n::Node) - deleteNode!(net::QuartetNetwork, n::Node) Delete node `n` from a network, i.e. removes it from net.node, and from net.hybrid or net.leaf as appropriate. -Update attributes `numNodes`, `numTaxa`, `numHybrids`. -Warning: `net.names` is *not* updated, and this is a feature (not a bug) -for networks of type QuartetNetwork. +Update attributes `numnodes`, `numtaxa`, `numhybrids`. + Warning: if the root is deleted, the new root is arbitrarily set to the first node in the list. This is intentional to save time because this function @@ -583,11 +544,11 @@ function deleteNode!(net::HybridNetwork, n::Node) # isEqual (from above) could match nodes across different networks index !== nothing || error("Node $(n.number) not in network"); deleteat!(net.node,index); - net.numNodes -= 1; - if net.root == index # do not check containRoot to save time in snaq! - net.root = 1 # arbitrary - elseif net.root > index - net.root -= 1 + net.numnodes -= 1; + if net.rooti == index # do not check containroot to save time in snaq! + net.rooti = 1 # arbitrary + elseif net.rooti > index + net.rooti -= 1 end if n.hybrid removeHybrid!(net,n) @@ -597,33 +558,20 @@ function deleteNode!(net::HybridNetwork, n::Node) end end -function deleteNode!(net::QuartetNetwork, n::Node) - index = findfirst(no -> no.number == n.number, net.node) - # isEqual (from above) checks for more than node number - index !== nothing || error("Node $(n.number) not in quartet network"); - deleteat!(net.node,index); - net.numNodes -= 1 - if n.hybrid - removeHybrid!(net,n) - end - if n.leaf - index = findfirst(no -> no === n, net.leaf) - index !== nothing || error("node $(n.number) not net.leaf") - deleteat!(net.leaf,index) - net.numTaxa -= 1 - end -end """ deleteEdge!(net::HybridNetwork, e::Edge; part=true) - deleteEdge!(net::QuartetNetwork, e::Edge) -Delete edge `e` from `net.edge` and update `net.numEdges`. +Delete edge `e` from `net.edge` and update `net.numedges`. If `part` is true, update the network's partition field. + +*Warning*: if `part` is true (the default), then `net` is assumed to be of +level-1, with valid internal fields `e.inte1` (to track which cycle +`e` may be in) and valid `net.partition`, which then gets updated. """ -function deleteEdge!(net::HybridNetwork, e::Edge; part=true::Bool) +function deleteEdge!(net::HybridNetwork, e::Edge; part::Bool=true) if part - if e.inCycle == -1 && !e.hybrid && !isempty(net.partition) && !isTree(net) + if e.inte1 == -1 && !e.hybrid && !isempty(net.partition) && !isTree(net) ind = whichPartition(net,e) indE = getIndex(e,net.partition[ind].edges) deleteat!(net.partition[ind].edges,indE) @@ -632,42 +580,32 @@ function deleteEdge!(net::HybridNetwork, e::Edge; part=true::Bool) i = findfirst(x -> x===e, net.edge) i !== nothing || error("edge $(e.number) not in network: can't delete"); deleteat!(net.edge, i); - net.numEdges -= 1; + net.numedges -= 1; end -# function to delete an Edge in net.edge and -# update numEdges from a QuartetNetwork -function deleteEdge!(net::QuartetNetwork, e::Edge) - index = findfirst(x -> x.number == e.number, net.edge) - # isEqual (from above) checks for more than edge number - index !== nothing || error("edge not in quartet network"); - deleteat!(net.edge,index); - net.numEdges -= 1; -end - - """ removeHybrid!(net::Network, n::Node) Delete a hybrid node `n` from `net.hybrid`, and update `net.numHybrid`. The actual node `n` is not deleted. It is kept in the full list `net.node`. +Very internal function, used by [`deletehybridedge!`](@ref) and others. """ function removeHybrid!(net::Network, n::Node) n.hybrid || error("cannot delete node $(n.number) from net.hybrid because it is not hybrid") i = findfirst(x -> x===n, net.hybrid) i !== nothing || error("hybrid node $(n.number) not in the network's list of hybrids"); deleteat!(net.hybrid, i); - net.numHybrids -= 1; + net.numhybrids -= 1; end # function to delete a leaf node in net.leaf -# and update numTaxa +# and update numtaxa function removeLeaf!(net::Network,n::Node) n.leaf || error("cannot delete node $(n.number) from net.leaf because it is not leaf") index = findfirst(no -> no === n, net.leaf) index !== nothing || error("leaf node $(n.number) not in network") deleteat!(net.leaf,index) - net.numTaxa -= 1 + net.numtaxa -= 1 end # function to delete an internal node with only 2 edges @@ -714,61 +652,51 @@ function searchHybridEdge(net::Network) end """ - printEdges(net) - printEdges(io::IO, net) + printedges(net) + printedges(io::IO, net) -Print information on the edges of a `HybridNetwork` or `QuartetNetwork` object +Print information on the edges of a `HybridNetwork` `net`: edge number, numbers of nodes attached to it, edge length, whether it's a hybrid edge, its γ inheritance value, whether it's a major edge, if it could contain the root (this field is not always updated, though) -and attributes pertaining to level-1 networks used in SNaQ: -in which cycle it is contained (-1 if no cycle), and if the edge length -is identifiable (based on quartet concordance factors). +and one more attribute pertaining to level-1 networks used in SNaQ: +in which cycle it is contained (-1 if no cycle). """ -printEdges(x) = printEdges(stdout::IO, x) -function printEdges(io::IO, net::HybridNetwork) - if net.numBad > 0 - println(io, "net has $(net.numBad) bad diamond I. Some γ and edge lengths t are not identifiable, although their γ * (1-exp(-t)) are.") +printedges(x) = printedges(stdout::IO, x) +function printedges(io::IO, net::HybridNetwork) + if net.intg1 > 0 + println(io, "net has $(net.intg1) bad diamond I. Some γ and edge lengths t are not identifiable, although their γ * (1-exp(-t)) are.") end miss = "" - println(io, "edge parent child length hybrid isMajor gamma containRoot inCycle istIdentitiable") + println(io, "edge parent child length hybrid ismajor gamma containroot i_cycle") for e in net.edge @printf(io, "%-4d %-6d %-6d ", e.number, getparent(e).number, getchild(e).number) if e.length==-1.0 @printf(io, "%-7s ", miss); else @printf(io, "%-7.3f ", e.length); end - @printf(io, "%-6s %-7s ", e.hybrid, e.isMajor) + @printf(io, "%-6s %-7s ", e.hybrid, e.ismajor) if e.gamma==-1.0 @printf(io, "%-7s ", miss); else @printf(io, "%-7.4g ", e.gamma); end - @printf(io, "%-11s %-7d %-5s\n", e.containRoot, e.inCycle, e.istIdentifiable) + @printf(io, "%-11s %-7d\n", e.containroot, e.inte1) end end -function printEdges(io::IO, net::QuartetNetwork) - println(io, "edge parent child length hybrid isMajor gamma containRoot inCycle istIdentitiable") - for e in net.edge - @printf(io, "%-4d %-6d %-6d ", e.number, getparent(e).number, getchild(e).number) - @printf(io, "%-7.3f %-6s %-7s ", e.length, e.hybrid, e.isMajor) - @printf(io, "%-7.4g %-11s %-7d %-5s\n", e.gamma, e.containRoot, e.inCycle, e.istIdentifiable) - end -end -# print for every node, inCycle and edges """ - printNodes(net) - printNodes(io, net) + printnodes(net) + printnodes(io, net) Print information on the nodes of a `HybridNetwork` net: node number, -whether it's a leaf, whether it's a hybrid node, whether it's connected to one -or more hybrid edges, it's name (label), -the cycle in which it is belong (-1 if no cycle; makes sense for level-1 networks), +whether it's a leaf, whether it's a hybrid node, it's name (label), +its `intn1` field (for level-1 networks in SNaQ: number given to the cycle in +which the node might be, -1 if the node it *not* in a cycle cycle), and the list of edges attached to it, by their numbers. """ -printNodes(x) = printNodes(stdout::IO, x) -function printNodes(io::IO, net::Network) +printnodes(x) = printnodes(stdout::IO, x) +function printnodes(io::IO, net::Network) namepad = max(4, maximum(length.([n.name for n in net.node]))) - println(io, "node leaf hybrid hasHybEdge ", rpad("name", namepad), " inCycle edges'numbers") + println(io, "node leaf hybrid ", rpad("name", namepad), " i_cycle edges'numbers") for n in net.node - @printf(io, "%-4d %-5s %-6s %-10s ", n.number, n.leaf, n.hybrid, n.hasHybEdge) + @printf(io, "%-4d %-5s %-6s ", n.number, n.leaf, n.hybrid) print(io, rpad(n.name,namepad)) - @printf(io, " %-7d", n.inCycle) + @printf(io, " %-7d", n.intn1) for e in n.edge @printf(io, " %-4d", e.number) end @@ -780,8 +708,10 @@ end hybridEdges(node::Node) Return the 3 edges attached to `node` in a specific order [e1,e2,e3]. -**Warning**: assume a level-1 network with node field `hasHybEdge` -and edge field `inCycle` up-to-date. +**Warning**: assume a level-1 network with up-to-date node fields +`booln1` (tracking whether the node is incident to a hybrid edge +and edge) and field `intn1` (tracking the number given to the cycle in which +the node might be). If `node` is a hybrid node: @@ -789,7 +719,7 @@ If `node` is a hybrid node: - e2 is the minor hybrid parent edge - e3 is the tree edge, child of `node`. -If `node` is a tree node parent of one child edge: +If `node` is a tree node parent of one child hybrid edge: - e1 is the hybrid edge, child of `node` - e2 is the tree edge that belongs to the cycle created by e1 @@ -801,28 +731,28 @@ Otherwise: """ function hybridEdges(node::Node) size(node.edge,1) == 3 || error("node $(node.number) has $(size(node.edge,1)) edges instead of 3"); - if(node.hybrid) + if node.hybrid hybmajor = nothing; hybminor = nothing; tree = nothing; for e in node.edge - (e.hybrid && e.isMajor) ? hybmajor = e : nothing - (e.hybrid && !e.isMajor) ? hybminor = e : nothing + (e.hybrid && e.ismajor) ? hybmajor = e : nothing + (e.hybrid && !e.ismajor) ? hybminor = e : nothing !e.hybrid ? tree = e : nothing end return hybmajor, hybminor, tree - elseif(node.hasHybEdge) + elseif node.booln1 hybrid = nothing; treecycle = nothing; tree = nothing; for e in node.edge (e.hybrid) ? hybrid = e : nothing - (!e.hybrid && e.inCycle != -1) ? treecycle = e : nothing - (!e.hybrid && e.inCycle == -1) ? tree = e : nothing + (!e.hybrid && e.inte1 != -1) ? treecycle = e : nothing + (!e.hybrid && e.inte1 == -1) ? tree = e : nothing end return hybrid, treecycle, tree else - #@warn "node $(node.number) is not hybrid $(node.hybrid) nor tree with hybrid edges (hasHybEdge) $(node.hasHybEdge), return the node.edge in order, unless a leaf is attached, then the edge attached to leaf is last"; + #@warn "node $(node.number) is not hybrid $(node.hybrid) nor tree with hybrid edges (booln1) $(node.booln1), return the node.edge in order, unless a leaf is attached, then the edge attached to leaf is last"; edge1 = nothing edge2 = nothing edge3 = nothing @@ -877,14 +807,14 @@ end # warning: deletion is final, you can only # have edge back by pushing it again # warning: if the edge removed is hybrid and node is tree, -# node.hasHybEdge is set to false +# node.booln1 is set to false # assuming any tree node can only have one # one hybrid edge function removeEdge!(node::Node, edg::Edge) index = findfirst(x -> x === edg, node.edge) index !== nothing || error("edge $(edg.number) not in node $(node.number)") deleteat!(node.edge,index) - node.hasHybEdge = any(e -> e.hybrid, node.edge) + node.booln1 = any(e -> e.hybrid, node.edge) end # function to remove a node from a edge @@ -901,87 +831,35 @@ end # ---------------------------------------------------------------------------------------- -# setLength -# warning: allows to change edge length for istIdentifiable=false -# but issues a warning -# negative=true means it allows negative branch lengths (useful in qnet typeHyb=4) -function setLength!(edge::Edge, new_length::Number, negative::Bool) - (negative || new_length >= 0) || error("length has to be nonnegative: $(new_length), cannot set to edge $(edge.number)") - new_length >= -0.4054651081081644 || error("length can be negative, but not too negative (greater than -log(1.5)) or majorCF<0: new length is $(new_length)") - #println("setting length $(new_length) to edge $(edge.number)") - if(new_length > 10.0) - new_length = 10.0; - end - edge.length = new_length; - edge.y = exp(-new_length); - edge.z = 1.0 - edge.y; - #edge.istIdentifiable || @warn "set edge length for edge $(edge.number) that is not identifiable" - return nothing -end - -""" - setLength!(edge, newlength)` - -Set the length of `edge`, and set `edge.y` and `edge.z` accordingly. -Warning: specific to SNaQ. Use [`setlengths!`](@ref) or [`setBranchLength!`](@ref) -for more general tools. - -- The new length is censored to 10: if the new length is above 10, - the edge's length will be set to 10. Lengths are interpreted in coalescent - units, and 10 is close to infinity: near perfect gene tree concordance. - 10 is used as an upper limit to coalescent units that can be reliably estimated. -- The new length is allowed to be negative, but must be greater than -log(1.5), - to ensure that the major quartet concordance factor (1 - 2/3 exp(-length)) is >= 0. -""" -setLength!(edge::Edge, new_length::Number) = setLength!(edge, new_length, false) """ - setBranchLength!(Edge, newlength) - -Set the length of an Edge object. The new length needs to be non-negative, -or -1.0 to be interpreted as missing. `edge.y` and `edge.z` are updated -accordingly. -""" -function setBranchLength!(edge::Edge, new_length::Number) - (new_length >= 0 || new_length == -1.0) || error("length $(new_length) has to be nonnegative or -1.0 (for missing).") - edge.length = new_length; - edge.y = exp(-new_length); - edge.z = 1.0 - edge.y; -end - - -""" - setGamma!(Edge, new γ) - setGamma!(Edge, new γ, change_other=true::Bool) + setgamma!(Edge, new γ, change_other=true) Set inheritance probability γ for an edge, which must be a hybrid edge. The new γ needs to be in [0,1]. The γ of the "partner" hybrid edge is changed -accordingly, to 1-γ. The field `isMajor` is also changed accordingly. +accordingly, to 1-γ. The field `ismajor` is also changed accordingly. If the new γ is approximately 0.5, `Edge` is set to the major parent, its partner is set to the minor parent. -If `net` is a HybridNetwork object, `printEdges(net)` will show the list of edges +If `net` is a HybridNetwork object, `printedges(net)` will show the list of edges and their γ's. The γ of the third hybrid edge (say) can be changed to 0.2 with -`setGamma!(net.edge[3],0.2)`. +`setgamma!(net.edge[3],0.2)`. This will automatically set γ of the partner hybrid edge to 0.8. The last argument is true by default. If false: the partner edge is not updated. This is useful if the new γ is 0.5, and the partner's γ is already 0.5, -in which case the `isMajor` attributes can remain unchanged. -""" -setGamma!(edge::Edge, new_gamma::Float64) = setGamma!(edge, new_gamma, true) +in which case the `ismajor` attributes can remain unchanged. -# warning in the bad diamond/triangle cases because gamma is not identifiable -# changeOther = true, looks for the other hybrid edge and changes gamma too - -function setGamma!(edge::Edge, new_gamma::Float64, changeOther::Bool) +See also [`PhyloNetworks.setmultiplegammas!`](@ref) +""" +function setgamma!(edge::Edge, new_gamma::Float64, changeOther::Bool=true) new_gamma >= 0.0 || error("gamma has to be positive: $(new_gamma)") new_gamma <= 1.0 || error("gamma has to be less than 1: $(new_gamma)") edge.hybrid || error("cannot change gamma in a tree edge"); node = getchild(edge) # child of hybrid edge node.hybrid || @warn "hybrid edge $(edge.number) not pointing at hybrid node" - # @debug (node.isBadDiamondI ? "bad diamond situation: gamma not identifiable" : "") + # @debug (node.booln2 ? "bad diamond I situation: gamma not identifiable" : "") partner = Edge[] # list of other hybrid parents of node, other than edge for e in node.edge if e.hybrid && e != edge && node == getchild(e) @@ -996,70 +874,584 @@ function setGamma!(edge::Edge, new_gamma::Float64, changeOther::Bool) new_ismajor = new_gamma >= 0.5 edge.gamma = new_gamma if changeOther - edge.isMajor = new_ismajor + edge.ismajor = new_ismajor e2.gamma = 1.0 - new_gamma - e2.isMajor = !new_ismajor + e2.ismajor = !new_ismajor else if onehalf # who is major is arbitrary: so we pick what's consistent with the partner - edge.isMajor = !e2.isMajor + edge.ismajor = !e2.ismajor else - edge.isMajor = new_ismajor + edge.ismajor = new_ismajor end end return nothing end +""" + setmultiplegammas!(edges::Vector{Edge}, γs::Vector{Float64}) + +Set the inheritance of the ith edge to the ith γ value, +calling [`setgamma!`](@ref). +""" @inline function setmultiplegammas!(edges::Vector{Edge}, gammas::Vector{Float64}) for (e,g) in zip(edges, gammas) - setGamma!(e, g) + setgamma!(e, g) end end """ - setGammaBLfromGammaz!(node, network) + remove_edgelengthsgammas!(net::HybridNetwork) -Update the γ values of the two sister hybrid edges in a bad diamond I, given the `gammaz` values -of their parent nodes, and update the branch lengths t1 and t2 of their parent edges -(those across from the hybrid nodes), in such a way that t1=t2 and that these branch lengths -and γ values are consistent with the `gammaz` values in the network. +Reset all edge lengths and all hybrid edge γs to be missing (coded as -1.0). +""" +function remove_edgelengthsgammas!(net::HybridNetwork) + for e in net.edge + e.length = -1.0 + if e.hybrid + e.gamma = -1.0 + end + end +end -Similar to the first section of [`undoGammaz!`](@ref), -but does not update anything else than γ and t's. -Unlike `undoGammaz!`, no error if non-hybrid `node` or not at bad diamond I. """ -function setGammaBLfromGammaz!(node::Node, net::HybridNetwork) - if !node.isBadDiamondI || !node.hybrid - return nothing + check_nonmissing_nonnegative_edgelengths(net, str="") + +Throw an Exception if `net` has undefined edge lengths (coded as -1.0) or +negative edge lengths. The error message indicates the number of the offending +edge(s), followed by `str`. +""" +function check_nonmissing_nonnegative_edgelengths(net::HybridNetwork, str="") + if any(e.length == -1.0 for e in net.edge) + undefined = [e.number for e in net.edge if e.length == -1.0] + error(string("Branch(es) number ", join(undefined,","), " have no length.\n", str)) + end + if any(e.length < 0 for e in net.edge) + negatives = [e.number for e in net.edge if e.length < 0.0] + error(string("Branch(es) number ", join(negatives,","), " have negative length.\n", str)) end - edge_maj, edge_min, tree_edge2 = hybridEdges(node); - other_maj = getOtherNode(edge_maj,node); - other_min = getOtherNode(edge_min,node); - edgebla,tree_edge_incycle1,tree_edge = hybridEdges(other_min); - edgebla,tree_edge_incycle2,tree_edge = hybridEdges(other_maj); - if(approxEq(other_maj.gammaz,0.0) && approxEq(other_min.gammaz,0.0)) - edge_maj.gamma = 1.0 # γ and t could be anything if both gammaz are 0 - edge_min.gamma = 0.0 # will set t's to 0 and minor γ to 0. - newt = 0.0 +end + + +""" + getnodeheights(net, checkpreorder::Bool=true) + getnodeheights!(net, checkpreorder::Bool=true) + +Vector of node heights, that is: the distance of each node to the root. +An error is thrown if the network is not time-consistent. +A network is time-consistent if, for any node `v`, all paths from the root to `v` +have the same length. (It is sufficient to check this condition at hybrid nodes). +Ultrametricity is not assumed: tips need not all be at the same distance from the root. +If `checkpreorder=false`, assumes the network has already been preordered +with [`preorder!`](@ref). + +If a tree edge has a missing length (coded as -1), both functions throw an error. +In general, there may be an exponential number of ways to assign tree edge +lengths that make the network time-consistent. + +`getnodeheights` sends a warning upon finding a missing hybrid edge length, +otherwises proceeds as `getnodeheights!` but without modifying the network. +`getnodeheights!` will attempt to assign values to missing lengths, for hybrid +edges only, so as to make the network time-consistent. + +If a hybrid edge `e` has a missing length, `getnodeheights!` proceeds as follows +at its child hybrid node `h`: +- If all of `h`'s parent edges lack a length: the shortest non-negative lengths + are assigned to make the network time-consistent at `h`. In particular, one of + the partner edges is assigned length 0, and `h` is made as old as possible, + that is, as close to the root as possible: the reticulation is "zipped-up". +- Otherwise: the length of `e` is set to the unique value that makes the network + time-consistent at `h`, based on the partner edge's length. + If this value is negative, then an error is thrown. + +Output: vector of node heights, one per node, in the same order as in +`net.vec_node`. + +See also: [`istimeconsistent`](@ref) and [`getnodeheights_average`](@ref). + +Examples: + +```jldoctest +julia> net = readnewick("(((C:1,(A:1)#H1:1.5::0.7):1,(#H1:0.3::0.3,E:2.0):2.2):1.0,O:5.2)root;"); + +julia> # using PhyloPlots; plot(net, useedgelength=true, showedgelength=true, shownodenumber=true); # to see + +julia> nodeheight = getnodeheights(net) +9-element Vector{Float64}: + 0.0 + 5.2 + 1.0 + 3.2 + 5.2 + 2.0 + 3.5 + 4.5 + 3.0 + +julia> [node.number => (height, node.name) for (height,node) in zip(nodeheight, net.vec_node)] +9-element Vector{Pair{Int64, Tuple{Float64, String}}}: + -2 => (0.0, "root") + 5 => (5.2, "O") + -3 => (1.0, "") + -6 => (3.2, "") + 4 => (5.2, "E") + -4 => (2.0, "") + 3 => (3.5, "H1") + 2 => (4.5, "A") + 1 => (3.0, "C") + +``` +""" +getnodeheights(net::HybridNetwork, checkpreorder::Bool=true) = + _getnodeheights(net, false, timeinconsistency_error, checkpreorder)[2] +@doc (@doc getnodeheights) getnodeheights! +getnodeheights!(net::HybridNetwork, checkpreorder::Bool=true) = + _getnodeheights(net, true, timeinconsistency_error, checkpreorder)[2] + +""" + getnodeheights_average(net, checkpreorder::Bool=true; warn=true) + +Vector of average node heights, that is: the average distance from the root to +each node. The average is a weighted average with weights taken to be the +hybrid edges' inheritance values γ, if available. Equal weights are used at +hybrid nodes with some parents lacking a γ inheritance value (with a warning). + +missing edge lengths: +- An error is thrown if a tree edge has a missing edge length. +- If all parent hybrid edges have missing lengths at a given hybrid node, then + the hybrid node is assumed to be as close to the root as possible, that is, + the reticulation is assumed "zipped-up" with one of its hybrid edges of length 0. +- If some but not all parent hybrid edges have a missing length, then the + average node height is calculated based on the non-missing parents only. + If the hybrid node height turns out to be lower than one of the parent's height + (such that some missing length would need to be negative) then a warning is + issued. + +A warning is issued, unless `warn=false`, if the network is not time-consistent. + +See also: [`istimeconsistent`](@ref), [`getnodeheights`](@ref), and `getnodeheights_majortree`](@ref). +""" +function getnodeheights_average( + net::HybridNetwork, + checkpreorder::Bool=true; + warn::Bool=true +) + (isTC, nh) = _getnodeheights(net, false, timeinconsistency_average, checkpreorder) + warn && !isTC && @warn "the network is not time consistent" + return nh +end + +""" + getnodeheights_majortree(net, checkpreorder::Bool=true; warn=true) + +Vector of node heights from the major tree, that is: the distance from the root to +each node when considering the major tree for node heights. + +missing edge lengths: +- An error is thrown if a tree edge has a missing edge length. +- If all parent hybrid edges have missing lengths at a given hybrid node, then + the hybrid node is assumed to be as close to the root as possible, that is, + the reticulation is assumed "zipped-up" with one of its hybrid edges of length 0. +- If a major hybrid edge has a missing length, then the hybrid node height will + be calculated using the node height and edge length of the minor parent with + the largest inheritance γ (with a warning). If the major hybrid edge lacks a length and + all non-missing minor edges lack an inheritance γ or have the same value, + then an error is thrown. + +A warning is issued, unless `warn=false`, if the network is not time-consistent. + +See also: [`istimeconsistent`](@ref), [`getnodeheights`](@ref) and +[`getnodeheights_average`](@ref). + +```jldoctest +#node heights of time-consistent networks are the same +julia> consistent_net = readnewick("((A:2.5,#H1:1.5::0.4):0.25,(C:1.5,(B:1)#H1:0.5::0.6):1.25);"); + +julia> heights = getnodeheights(consistent_net) +7-element Vector{Float64}: + 0.0 + 1.25 + 2.75 + 0.25 + 1.75 + 2.75 + 2.75 + +julia> heights_average = getnodeheights_average(consistent_net); + +julia> heights_major = getnodeheights_majortree(consistent_net); + +julia> heights == heights_average == heights_major +true +``` + +```jldoctest +#inconsistent networks give different results +julia> inconsistent_net = readnewick("((A:2.5,#H1:1.5::0.4):0.25,(C:1.5,(B:1)#H1:2.5::0.6):1.25);"); + +julia> getnodeheights_average(inconsistent_net;warn=false) +7-element Vector{Float64}: + 0.0 + 1.25 + 2.75 + 0.25 + 2.95 + 3.95 + 2.75 + +julia> getnodeheights_majortree(inconsistent_net;warn=false) +7-element Vector{Float64}: + 0.0 + 1.25 + 2.75 + 0.25 + 3.75 + 4.75 + 2.75 + +``` +""" +function getnodeheights_majortree(net::HybridNetwork, checkpreorder::Bool=true; warn::Bool=true) + (isTC, nh) = _getnodeheights(net, false, timeinconsistency_majortree, checkpreorder) + warn && !isTC && @warn "the network is not time consistent" + return nh +end + +""" + istimeconsistent(net, checkpreorder::Bool=true) + +True (resp. false) if `net` network is (resp. is not) time-consistent. +A network is time-consistent if for any node `v`, all paths from the root to `v` +have the same length. +It is sufficient to check this condition at nodes `v` that are hybrid nodes. + +See also [`getnodeheights`](@ref) and [`getnodeheights_average`](@ref). +""" +istimeconsistent(net::HybridNetwork, checkpreorder::Bool=true) = + _getnodeheights(net, false, timeinconsistency_check, checkpreorder)[1] + + +""" + _getnodeheights(net::HybridNetwork, fixmissing::Bool, + inconsistencyhandler::Function, checkpreorder::Bool=true) + +Helper to determine time-consistency and calculate node heights +(distance from the root), used by [`getnodeheights`](@ref) for example. + +output: `(isconsistent, nodes_distance_from_root)` + +Arguments: + +- `fixmissing`: + * if `false`, any missing hybrid edge length will cause a warning, the network + is *not* modified, and the best-case is assumed to determine time-consistency + (as explained below) + * if `true`, will attempt to find values for missing lengths of *hybrid* edges, + if any, to make the network time-consistent, placing hybrid nodes as close + to the root as possible (as this gives most chances to find a time-consistent + assignment of all missing hybrid edge lengths). + If there is a time-consistent assignment, then the network is modified + (with missing hybrid edge lengths set to time-consistent values). + Otherwise, the network is not modified. + + This option is passed to `update_getnodeheights_hybrid!` that handles + 1 hybrid node at a time. + +- `inconsistencyhandler`: function to check & handle time-consistency as desired + as a given hybrid node `h`, and to decide if the traversal should continue. + It should take as input: + * a vector of ≥1 candicate heights for `h` from parent edges with non-missing + length, and + * a vector of ≥0 heights of parent nodes whose child edge to `h` has no length + * `isconsistent`: a boolean that is modified to `false` if the network is + not time-consistent at `h` (unless an error is thrown anyway!). + + This handler function decides what to do if the candidate heights are not + all equal (the network is time-inconsistent), and if the values to be + assigned to missing edge lengths would be negative. Its output should be: + `(keepgoing_boolean, hybrid_node_height)`. + + Examples: + [`timeinconsistency_error`](@ref) is conservative and throws an + error in both cases. + [`timeinconsistency_average`](@ref) is lenient: only throws warnings, + but keeps going and returns γ-weighted average node heights +""" +function _getnodeheights( + net::HybridNetwork, + fixmissing::Bool, + inconsistencyhandler::Function, + checkpreorder::Bool=true, +) + checkpreorder && preorder!(net) + missing_e = Tuple{Edge,Float64}[] # vector of (edge, fixed_length) for edges with missing length + isconsistent = Ref(true) + rootdistance = traversal_preorder( + net.vec_node, + getnodeheights_init, + traversalupdate_default!, # nothing to do at the root + update_getnodeheights_tree!, + update_getnodeheights_hybrid!, + missing_e, + isconsistent, + inconsistencyhandler) + # assign values to fix missing edge lengths: ! modifies net ! + if fixmissing + (x-> x[1].length=x[2]).(missing_e) else - ((approxEq(other_min.gammaz,0.0) || other_min.gammaz >= 0.0) && - (approxEq(other_maj.gammaz,0.0) || other_maj.gammaz >= 0.0) ) || - error("bad diamond I in node $(node.number) but missing (or <0) gammaz") - ztotal = other_maj.gammaz + other_min.gammaz - edge_maj.gamma = other_maj.gammaz / ztotal - edge_min.gamma = other_min.gammaz / ztotal - newt = -log(1-ztotal) + isempty(missing_e) || @warn "some hybrid edge length is missing" end - setLength!(tree_edge_incycle1,newt) - setLength!(tree_edge_incycle2,newt) + return (isconsistent[], rootdistance) +end + +function getnodeheights_init(nodes::Vector{Node}, params...) + n = length(nodes) + return zeros(Float64,n) +end + +function update_getnodeheights_tree!( + rootdistance::Vector{Float64}, + i::Int, + parind::Int, + paredge::Edge, + params... +) + if paredge.length == -1.0 # interpreted as missing + paredge.hybrid && @error("weird, hybrid edge at tree node") + error("Edge $(paredge.number) has a missing edge length: node height cannot be determined") + end + rootdistance[i] = rootdistance[parind] + paredge.length + return true +end + +function update_getnodeheights_hybrid!( + rootdistance::Vector{Float64}, + i::Int, + parinds::Vector{Int}, + paredges::Vector{Edge}, + missing_e::Vector{Tuple{Edge,Float64}}, + isconsistent::Ref{Bool}, + inconsistencyhandler::Function, +) + keepgoing = true + candidate_nodeheight = Float64[] + missingparent_height = Float64[] + missingparent_j = Int[] + nonmissingparent_j = Int[] + for (pj,pj_ind) in enumerate(parinds) + if paredges[pj].length == -1 # missing parent edge length + push!(missingparent_j, pj) + push!(missingparent_height, rootdistance[pj_ind]) + else + push!(nonmissingparent_j, pj) + push!(candidate_nodeheight, rootdistance[pj_ind] + paredges[pj].length) + end + end + if isempty(candidate_nodeheight) # all edge lengths are missing: then we can + # set them in a time-consistent way, zipped up: hybrid as close to the root as possible + nodehght = maximum(missingparent_height) + else # ≥1 length: check & handle time-consistency as desired (e.g. take average) + keepgoing, nodehght = inconsistencyhandler( + candidate_nodeheight, missingparent_height, + isconsistent, paredges, nonmissingparent_j) + end + rootdistance[i] = nodehght + for (pj, ph) in zip(missingparent_j, missingparent_height) + push!(missing_e, (paredges[pj], nodehght - ph)) + end + return keepgoing # stops the traversal early is not time-consistent +end + +""" + timeinconsistency_error( + candidate_nodeheights, + missingparent_heights, + args...; + atol::Real=1e-8, rtol::Real=√eps(Float64)) + timeinconsistency_check + +Check that all candidate node heights are approximately equal to one another, +and that this shared value `nodeheight` is higher (farther from the root) than the +height of parents connected by edge of missing length `missingparent_heights` +to ensure that these edge lengths would be assigned non-negative values. + +If any of these conditions is not met, `timeinconsistency_error` throws an error. +Otherwise, it returns `(true, nodeheight)` where `true` means that +the network is (or could be) time-consistent at the node being considered. +`timeinconsistency_check` returns `(is_timeconsistent, nodeheight)` but does +*not* throw an error the `is_timeconsistent` if false (for either reason). + +Assumption: `candidate_nodeheight` is not empty, that is, the node has at least +one parent edge with a non-missing length. + +See also [`_getnodeheights`](@ref PhyloNetworks._getnodeheights) +""" +function timeinconsistency_error( + candidate_nodeheight::AbstractVector{T}, + missingparent_height::AbstractVector{T}, + args...; + atol::Real=1e-8, # more lenient than default 0 in isapprox + rtol::Real=√eps(T), +) where T<:Real + min_nh, max_nh = extrema(candidate_nodeheight) + length(candidate_nodeheight) == 1 || + isapprox(min_nh, max_nh; atol=atol, rtol=rtol) || + error("the network is not time consistent. paths of different lengths: $candidate_nodeheight") + if any(missingparent_height .> max_nh) # may be empty vector + error("""a missing edge length would be need to be set to a negative value + to make the network time-consistent""") + end + return (true, max_nh) +end + +@doc (@doc timeinconsistency_error) timeinconsistency_check +function timeinconsistency_check( + candidate_nodeheight::AbstractVector{T}, + missingparent_height::AbstractVector{T}, + isconsistent::Ref{Bool}, + args...; + atol::Real=1e-8, # more lenient than default 0 in isapprox + rtol::Real=√eps(T), +) where T<:Real + min_nh, max_nh = extrema(candidate_nodeheight) + timecons = length(candidate_nodeheight) == 1 || + isapprox(min_nh, max_nh; atol=atol, rtol=rtol) + if any(missingparent_height .> max_nh) # may be empty vector + timecons = false + end + isconsistent[] &= timecons + return (timecons, max_nh) # stop the traversal if not time consistent +end + +""" + timeinconsistency_average( + candidate_nodeheights, + missingparent_heights, + isconsistent::Ref{Bool}, + parent_edges, + nonmissingparent_j; + atol::Real=1e-8, rtol::Real=√eps(Float64)) + +Calculate the γ-weighted average node height of a given hybrid node `h`, based +on the candidate node heights from its parents with non-missing edge lengths. +- If some of these parent edges have a missing γ, then equal weights are used + and a warning is issued. +- If the hybrid node's average height (calculate from non-missing lengths) + turns out to be lower than one of the parent's height with a missing length + (such that this parent edge would need to be assigned a negative value) + then a warning is issued. + +Outcome: +- update `isconsistent` to false if the candidate node heights are not all equal + or if some missing edge length would have to be assigned a negative value + to make the network time-consistent +- returns `(true, nodeheight)` + +Assumption: `candidate_nodeheight` is not empty, that is, the node has at least +one parent edge with a non-missing length. + +See also [`_getnodeheights`](@ref) and [`getnodeheights_average`](@ref) +""" +function timeinconsistency_average( + candidate_nodeheight::AbstractVector{T}, + missingparent_height::AbstractVector{T}, + isconsistent::Ref{Bool}, + paredges::Vector{Edge}, + nm_ind::AbstractVector; + atol::Real=1e-8, # more lenient than default 0 + rtol::Real=√eps(T), +) where T<:Real + min_nh, max_nh = extrema(candidate_nodeheight) + timecons = length(candidate_nodeheight) == 1 || + isapprox(min_nh, max_nh; atol=atol, rtol=rtol) + if timecons # if time-consistent: don't calculate the weighted average + nh = max_nh + else # weighted average, with equal weights if some γ's are missing + if any(j -> paredges[j].gamma == -1, nm_ind) # ≥ 1 missing γ + @warn "missing γ: will use equal weights" + nh = sum(candidate_nodeheight) / length(candidate_nodeheight) + else + nh = zero(T); gamma_sum = zero(T) + for (cnh, pj) in zip(candidate_nodeheight, nm_ind) + nh += cnh * paredges[pj].gamma + gamma_sum += paredges[pj].gamma + end + nh /= gamma_sum + end + end + if any(missingparent_height .> nh) # may be empty vector + @warn """a missing edge length would be need to be set to a negative value + for these average node heights""" + timecons = false + end + isconsistent[] &= timecons + return (true, nh) # keep going, even if the network is inconsistent +end + +""" + timeinconsistency_majortree( + candidate_nodeheights, + missingparent_heights, + isconsistent::Ref{Bool}, + parent_edges, + nonmissingparent_j; + atol::Real=1e-8, rtol::Real=√eps(Float64)) + +Calculate node height of a given hybrid node `h`, based on the its major parent +node height, if its major parent edge has a non-missing length. If missing, then +the non-missing edge length with the largest γ is used and a warning is issued. +If all parent edges have missing γ values then an error is thrown. + +Outcome: +- update `isconsistent` to false if the candidate node heights are not all equal + or if some missing edge length would have to be assigned a negative value + to make the network time-consistent +- returns `(true, nodeheight)` + +Assumption: `candidate_nodeheight` is not empty, that is, the node has at least +one parent edge with a non-missing length. + +See also [`_getnodeheights`](@ref) and [`getnodeheights_average`](@ref) +""" +function timeinconsistency_majortree( + candidate_nodeheight::AbstractVector{T}, + missingparent_height::AbstractVector{T}, + isconsistent::Ref{Bool}, + paredges::Vector{Edge}, + nm_ind::AbstractVector; + atol::Real=1e-8, # more lenient than default 0 + rtol::Real=√eps(T), +) where T<:Real + min_nh, max_nh = extrema(candidate_nodeheight) + timecons = length(candidate_nodeheight) == 1 || + isapprox(min_nh, max_nh; atol=atol, rtol=rtol) + maj_cantidate = findfirst(x->x.ismajor, paredges[nm_ind]) + if !isnothing(maj_cantidate) # the major edge is among candidates + nh = candidate_nodeheight[maj_cantidate] + else # find candidate with largest γ + @warn "major hybrid edge missing a length. Using non-missing minor edge with largest γ" + gammas = (x-> x.gamma).(paredges[nm_ind]) + max_gamma = maximum(gammas) + max_gamma == -1 && error("major edge lacks a length and all non-missing edges lack a γ") + cantidate_ind = findall(gammas .== max_gamma) + length(cantidate_ind) > 1 && error("major edge lacks a length and two alternative edges have the same γ") + nh = candidate_nodeheight[cantidate_ind[1]] + end + if any(missingparent_height .> nh) # may be empty vector + @warn """a missing edge length would be need to be set to a negative value + to use the cantidate node height of the major edge""" + timecons = false + end + isconsistent[] &= timecons + return (true, nh) # keep going, even if the network is inconsistent end function numTreeEdges(net::HybridNetwork) - 2*net.numTaxa - 3 + net.numHybrids + 2*net.numtaxa - 3 + net.numhybrids end function numIntTreeEdges(net::HybridNetwork) - 2*net.numTaxa - 3 + net.numHybrids - net.numTaxa + 2*net.numtaxa - 3 + net.numhybrids - net.numtaxa end @@ -1070,7 +1462,7 @@ end # cycle: is the number to look for partition on that cycle only function whichPartition(net::HybridNetwork,edge::Edge,cycle::Integer) !edge.hybrid || error("edge $(edge.number) is hybrid so it cannot be in any partition") - edge.inCycle == -1 || error("edge $(edge.number) is in cycle $(edge.inCycle) so it cannot be in any partition") + edge.inte1 == -1 || error("edge $(edge.number) is in cycle $(edge.inte1) so it cannot be in any partition") @debug "search partition for edge $(edge.number) in cycle $(cycle)" in(edge,net.edge) || error("edge $(edge.number) is not in net.edge") for i in 1:length(net.partition) @@ -1093,7 +1485,7 @@ end # to use splice and delete it from net.partition later on function whichPartition(net::HybridNetwork,edge::Edge) !edge.hybrid || error("edge $(edge.number) is hybrid so it cannot be in any partition") - edge.inCycle == -1 || error("edge $(edge.number) is in cycle $(edge.inCycle) so it cannot be in any partition") + edge.inte1 == -1 || error("edge $(edge.number) is in cycle $(edge.inte1) so it cannot be in any partition") @debug "search partition for edge $(edge.number) without knowing its cycle" in(edge,net.edge) || error("edge $(edge.number) is not in net.edge") for i in 1:length(net.partition) @@ -1127,171 +1519,6 @@ function isPartitionInNet(net::HybridNetwork,desc::Vector{Edge},cycle::Vector{In return false end -# function to check that everything matches in a network -# in particular, cycles, partitions and containRoot -# fixit: need to add check on identification of bad diamonds, triangles -# and correct computation of gammaz -# light=true: it will not collapse with nodes with 2 edges, will return a flag of true -# returns true if found egde with BL -1.0 (only when light=true, ow error) -# added checkPartition for undirectedOtherNetworks that do not need correct hybrid node number -function checkNet(net::HybridNetwork, light::Bool; checkPartition=true::Bool) - @debug "checking net" - net.numHybrids == length(net.hybrid) || error("discrepant number on net.numHybrids (net.numHybrids) and net.hybrid length $(length(net.hybrid))") - net.numTaxa == length(net.leaf) || error("discrepant number on net.numTaxa (net.numTaxa) and net.leaf length $(length(net.leaf))") - net.numNodes == length(net.node) || error("discrepant number on net.numNodes (net.numNodes) and net.node length $(length(net.node))") - net.numEdges == length(net.edge) || error("discrepant number on net.numEdges (net.numEdges) and net.edge length $(length(net.edge))") - if(isTree(net)) - all(x->x.containRoot,net.edge) || error("net is a tree, but not all edges can contain root") - all(x->x.isMajor,net.edge) || error("net is a tree, but not all edges are major") - all(x->!(x.hybrid),net.edge) || error("net is a tree, but not all edges are tree") - all(x->!(x.hybrid),net.node) || error("net is a tree, but not all nodes are tree") - all(x->!(x.hasHybEdge),net.node) || error("net is a tree, but not all nodes hasHybEdge=false") - all(x->(x.gamma == 1.0 ? true : false),net.edge) || error("net is a tree, but not all edges have gamma 1.0") - end - for h in net.hybrid - if(isBadTriangle(h)) - @debug "hybrid $(h.number) is very bad triangle" - net.hasVeryBadTriangle || error("hybrid node $(h.number) is very bad triangle, but net.hasVeryBadTriangle is $(net.hasVeryBadTriangle)") - h.isVeryBadTriangle || h.isExtBadTriangle || error("hybrid node $(h.number) is very bad triangle but it does not know it") - end - nocycle,edges,nodes = identifyInCycle(net,h) - for e in edges - e.inCycle == h.number || error("edge $(e.number) is in cycle of hybrid node $(h.number) but its inCycle attribute is $(e.inCycle)") - if(e.length == -1.0) - if(light) - return true - else - error("found edge with BL -1.0") - end - end - if(e.hybrid) - !e.containRoot || error("hybrid edge $(e.number) should not contain root") # fixit: disagree - o = getOtherNode(e,h) - o.hasHybEdge || error("found node $(o.number) attached to hybrid edge but hasHybEdge=$(o.hasHybEdge)") - end - end - for n in nodes - n.inCycle == h.number || error("node $(n.number) is in cycle of hybrid node $(h.number) but its inCycle attribute is $(n.inCycle)") - e1,e2,e3 = hybridEdges(n) - i = 0 - for e in [e1,e2,e3] - if(isa(e,Nothing) && h.k != 2) - error("edge found that is Nothing, and hybrid node $(h.number) k is $(h.k). edge as nothing can only happen when k=2") - elseif(!isa(e,Nothing)) - if(e.inCycle == -1) - i += 1 - desc = [e] - cycleNum = [h.number] - getDescendants!(getOtherNode(e,n),e,desc,cycleNum) - if(checkPartition && !isPartitionInNet(net,desc,cycleNum)) - printPartitions(net) - error("partition with cycle $(cycleNum) and edges $([e.number for e in desc]) not found in net.partition") - end - end - end - end - i == 1 || error("strange node $(n.number) incycle $(h.number) but with $(i) edges not in cycle, should be only one") - edgesRoot = identifyContainRoot(net,h) - for edge in edgesRoot - if edge.containRoot - @debug begin printEverything(net); "printed everything" end - error("edge $(edge.number) should not contain root") - end - end - end - end - for n in net.node - if(n.leaf) - length(n.edge) == 1 || error("leaf $(n.number) with $(length(n.edge)) edges instead of 1") - else - if(light) - if(length(n.edge) != 3) - @debug "warning: node $(n.number) with $(length(n.edge)) edges instead of 3" - return true - end - else - length(n.edge) == 3 || error("node $(n.number) with $(length(n.edge)) edges instead of 3") - end - end - end - for e in net.edge - if(e.length == -1.0) - if(light) - return true - else - error("edge found with BL -1.0") - end - end - end - @debug "no errors in checking net" - return false -end - -checkNet(net::HybridNetwork) = checkNet(net, false) - -# function to print everything for a given net -# this is used a lot inside snaq to debug, so need to use level1 attributes -# and not change the network: with writeTopologyLevel1 -function printEverything(net::HybridNetwork) - printEdges(net) - printNodes(net) - printPartitions(net) - println("$(writeTopologyLevel1(net))") -end - -# function to check if a node is very or ext bad triangle -function isBadTriangle(node::Node) - node.hybrid || error("cannot check if node $(node.number) is very bad triangle because it is not hybrid") - if(node.k == 3) - edgemaj, edgemin, treeedge = hybridEdges(node) - othermaj = getOtherNode(edgemaj,node) - othermin = getOtherNode(edgemin,node) - treenode = getOtherNode(treeedge,node) - edges1 = hybridEdges(othermaj) - o1 = getOtherNode(edges1[3],othermaj) - edges2 = hybridEdges(othermin) - o2 = getOtherNode(edges2[3],othermin) - leaves = sum([n.leaf ? 1 : 0 for n in [treenode,o1,o2]]) - if(leaves == 1 || leaves == 2) - return true - else - return false - end - else - return false - end -end - - -# function to check if a partition is already in net.partition -# used in updatePartition -function isPartitionInNet(net::HybridNetwork,partition::Partition) - if(isempty(net.partition)) - return false - end - for p in net.partition - cycle = isempty(setdiff(p.cycle,partition.cycle)) && isempty(setdiff(partition.cycle,p.cycle)) - edges = isempty(setdiff([n.number for n in p.edges],[n.number for n in partition.edges])) && isempty(setdiff([n.number for n in partition.edges],[n.number for n in p.edges])) - if(cycle && edges) - return true - end - end - return false -end - - -# function to switch a hybrid node in a network to another node in the cycle -function switchHybridNode!(net::HybridNetwork, hybrid::Node, newHybrid::Node) - hybrid.hybrid || error("node $(hybrid.number) has to be hybrid to switch to a different hybrid") - newHybrid.inCycle == hybrid.number || error("new hybrid needs to be in the cycle of old hybrid: $(hybrid.number)") - !newHybrid.hybrid || error("strange hybrid node $(newHybrid.number) in cycle of another hybrid $(hybrid.number)") - newHybrid.hybrid = true - newHybrid.hasHybEdge = true - newHybrid.name = hybrid.name - pushHybrid!(net,newHybrid) - makeNodeTree!(net,hybrid) -end - """ assignhybridnames!(net) @@ -1349,179 +1576,33 @@ function assignhybridnames!(net::HybridNetwork) end end -""" - sorttaxa!(DataFrame, columns) - -Reorder the 4 taxa and reorders the observed concordance factors accordingly, on each row of -the data frame. If `columns` is ommitted, taxon names are assumed to be in columns 1-4 and -CFs are assumed to be in columns 5-6 with quartets in this order: `12_34`, `13_24`, `14_23`. -Does **not** reorder credibility interval values, if present. - - sorttaxa!(DataCF) - sorttaxa!(Quartet, permutation_tax, permutation_cf) - -Reorder the 4 taxa in each element of the DataCF `quartet`. For a given Quartet, -reorder the 4 taxa in its fields `taxon` and `qnet.quartetTaxon` (if non-empty) -and reorder the 3 concordance values accordingly, in `obsCF` and `qnet.expCF`. - -`permutation_tax` and `permutation_cf` should be vectors of short integers (Int8) of length 4 and 3 -respectively, whose memory allocation gets reused. Their length is *not checked*. -`qnet.names` is unchanged: the order of taxon names here relates to the order of nodes in the network -(???) """ -function sorttaxa!(dat::DataCF) - ptax = Array{Int8}(undef, 4) # to hold the sort permutations - pCF = Array{Int8}(undef, 3) - for q in dat.quartet - sorttaxa!(q, ptax, pCF) - end -end + setlength!(edge::Edge, new_length) -function sorttaxa!(df::DataFrame, co=Int[]::Vector{Int}) - if length(co)==0 - co = collect(1:7) - end - length(co) > 6 || error("column vector must be of length 7 or more") - ptax = Array{Int8}(undef, 4) - pCF = Array{Int8}(undef, 3) - taxnam = Array{eltype(df[!,co[1]])}(undef, 4) - for i in 1:size(df,1) - for j=1:4 taxnam[j] = df[i,co[j]]; end - sortperm!(ptax, taxnam) - sorttaxaCFperm!(pCF, ptax) # update permutation pCF according to taxon permutation - df[i,co[1]], df[i,co[2]], df[i,co[3]], df[i,co[4]] = taxnam[ptax[1]], taxnam[ptax[2]], taxnam[ptax[3]], taxnam[ptax[4]] - df[i,co[5]], df[i,co[6]], df[i,co[7]] = df[i,co[pCF[1]+4]], df[i,co[pCF[2]+4]], df[i,co[pCF[3]+4]] - end - return df -end - -function sorttaxa!(qua::Quartet, ptax::Vector{Int8}, pCF::Vector{Int8}) - qt = qua.taxon - if length(qt)==4 - sortperm!(ptax, qt) - sorttaxaCFperm!(pCF, ptax) # update permutation pCF accordingly - qt[1], qt[2], qt[3], qt[4] = qt[ptax[1]], qt[ptax[2]], qt[ptax[3]], qt[ptax[4]] - qua.obsCF[1], qua.obsCF[2], qua.obsCF[3] = qua.obsCF[pCF[1]], qua.obsCF[pCF[2]], qua.obsCF[pCF[3]] - # do *NOT* modify qua.qnet.quartetTaxon: it points to the same array as qua.taxon - eCF = qua.qnet.expCF - if length(eCF)==3 - eCF[1], eCF[2], eCF[3] = eCF[pCF[1]], eCF[pCF[2]], eCF[pCF[3]] - end - elseif length(qt)!=0 - error("Quartet with $(length(qt)) taxa") - end - return qua -end - -# find permutation pCF of the 3 CF values: 12_34, 13_24, 14_23. 3!=6 possible permutations -# ptax = one of 4!=24 possible permutations on the 4 taxon names -# kernel: pCF = identity if ptax = 1234, 2143, 3412 or 4321 -# very long code, but to minimize equality checks at run time -function sorttaxaCFperm!(pcf::Vector{Int8}, ptax::Vector{Int8}) - if ptax[1]==1 - if ptax[2]==2 - pcf[1]=1 - if ptax[3]==3 # ptax = 1,2,3,4 - pcf[2]=2; pcf[3]=3 - else # ptax = 1,2,4,3 - pcf[2]=3; pcf[3]=2 - end - elseif ptax[2]==3 - pcf[1]=2 - if ptax[3]==2 # ptax = 1,3,2,4 - pcf[2]=1; pcf[3]=3 - else # ptax = 1,3,4,2 - pcf[2]=3; pcf[3]=1 - end - else # ptax[2]==4 - pcf[1]=3 - if ptax[3]==2 # ptax = 1,4,2,3 - pcf[2]=1; pcf[3]=2 - else # ptax = 1,4,3,2 - pcf[2]=2; pcf[3]=1 - end - end - elseif ptax[1]==2 - if ptax[2]==1 - pcf[1]=1 - if ptax[3]==4 # ptax = 2,1,4,3 - pcf[2]=2; pcf[3]=3 - else # ptax = 2,1,3,4 - pcf[2]=3; pcf[3]=2 - end - elseif ptax[2]==4 - pcf[1]=2 - if ptax[3]==1 # ptax = 2,4,1,3 - pcf[2]=1; pcf[3]=3 - else # ptax = 2,4,3,1 - pcf[2]=3; pcf[3]=1 - end - else # ptax[2]==3 - pcf[1]=3 - if ptax[3]==1 # ptax = 2,3,1,4 - pcf[2]=1; pcf[3]=2 - else # ptax = 2,3,4,1 - pcf[2]=2; pcf[3]=1 - end - end - elseif ptax[1]==3 - if ptax[2]==4 - pcf[1]=1 - if ptax[3]==1 # ptax = 3,4,1,2 - pcf[2]=2; pcf[3]=3 - else # ptax = 3,4,2,1 - pcf[2]=3; pcf[3]=2 - end - elseif ptax[2]==1 - pcf[1]=2 - if ptax[3]==4 # ptax = 3,1,4,2 - pcf[2]=1; pcf[3]=3 - else # ptax = 3,1,2,4 - pcf[2]=3; pcf[3]=1 - end - else # ptax[2]==2 - pcf[1]=3 - if ptax[3]==4 # ptax = 3,2,4,1 - pcf[2]=1; pcf[3]=2 - else # ptax = 3,2,1,4 - pcf[2]=2; pcf[3]=1 - end - end - else # ptax[1]==4 - if ptax[2]==3 - pcf[1]=1 - if ptax[3]==2 # ptax = 4,3,2,1 - pcf[2]=2; pcf[3]=3 - else # ptax = 4,3,1,2 - pcf[2]=3; pcf[3]=2 - end - elseif ptax[2]==2 - pcf[1]=2 - if ptax[3]==3 # ptax = 4,2,3,1 - pcf[2]=1; pcf[3]=3 - else # ptax = 4,2,1,3 - pcf[2]=3; pcf[3]=1 - end - else # ptax[2]==1 - pcf[1]=3 - if ptax[3]==3 # ptax = 4,1,3,2 - pcf[2]=1; pcf[3]=2 - else # ptax = 4,1,2,3 - pcf[2]=2; pcf[3]=1 - end - end +Assign new length to `edge`. `new_length` should be non-negative, +or `missing` (or -1, interpreted as missing). +""" +@inline function setlength!(edge::Edge, new_length) + if ismissing(new_length) || new_length == -1 + edge.length = -1 + else + new_length >= 0.0 || error("edge length must be non negative: $(new_length)") + edge.length = new_length end + return nothing end """ - setlengths!(edges::Vector{Edge}, lengths::Vector{Float64}) + setlengths!(edges::Vector{Edge}, lengths::AbstractVector) Assign new lengths to a vector of `edges`. +Checks that the new edge lengths are non-negative or `missing` (or -1 to be +interpreted as missing). """ -@inline function setlengths!(edges::Vector{Edge}, lengths::Vector{Float64}) +@inline function setlengths!(edges::Vector{Edge}, lengths::AbstractVector) for (e,l) in zip(edges, lengths) - e.length = l + setlength!(e, l) end end @@ -1553,11 +1634,11 @@ end shrinkedge!(net::HybridNetwork, edge::Edge) Delete `edge` from net, provided that it is a non-external tree edge. -Specifically: delete its child node (as determined by `isChild1`) and connect +Specifically: delete its child node (as determined by `ischild1`) and connect all edges formerly incident to this child node to the parent node of `edge`, thus creating a new polytomy, unless the child was of degree 2. -Warning: it's best for `isChild1` to be in sync with the root for this. If not, +Warning: it's best for `ischild1` to be in sync with the root for this. If not, the shrinking may fail (if `edge` is a tree edge but its "child" is a hybrid) or the root may change arbitrarily (if the child of `edge` is the root). @@ -1568,7 +1649,7 @@ created, or the new polytomy is below a tree node) function shrinkedge!(net::HybridNetwork, edge2shrink::Edge) edge2shrink.hybrid && error("cannot shrink hybrid edge number $(edge2shrink.number)") cn = getchild(edge2shrink) - cn.hybrid && error("cannot shrink tree edge number $(edge2shrink.number): its child node is a hybrid. run directEdges! ?") + cn.hybrid && error("cannot shrink tree edge number $(edge2shrink.number): its child node is a hybrid. run directedges! ?") pn = getparent(edge2shrink) isexternal(edge2shrink) && # (isleaf(cn) || isleaf(pn)) && error("won't shrink edge number $(edge2shrink.number): it is incident to a leaf") @@ -1577,15 +1658,15 @@ function shrinkedge!(net::HybridNetwork, edge2shrink::Edge) for ee in cn.edge ee !== edge2shrink || continue cn_index = findfirst(x -> x === cn, ee.node) - ee.node[cn_index] = pn # ee.isChild1 remains synchronized + ee.node[cn_index] = pn # ee.ischild1 remains synchronized push!(pn.edge, ee) end - pn.hasHybEdge = any(e -> e.hybrid, pn.edge) + pn.booln1 = any(e -> e.hybrid, pn.edge) empty!(cn.edge) # should help to garbage-collect cn deleteEdge!(net, edge2shrink; part=false) deleteNode!(net, cn) badpolytomy = false - if pn.hybrid # count the number of pn's children, without relying on isChild1 of tree edges + if pn.hybrid # count the number of pn's children, without relying on ischild1 of tree edges nc = sum((!e.hybrid || getchild(e) !== pn) for e in pn.edge) badpolytomy = (nc > 1) end @@ -1593,7 +1674,7 @@ function shrinkedge!(net::HybridNetwork, edge2shrink::Edge) end @doc raw""" - shrink2cycles!(net::HybridNetwork, unroot=false::Bool) + shrink2cycles!(net::HybridNetwork, unroot::Bool=false) If `net` contains a 2-cycle, collapse the cycle into one edge of length tA + γt1+(1-γ)t2 + tB (see below), and return true. @@ -1620,7 +1701,7 @@ is has degree 2 or more. If `unroot` is true and the root is up for deletion, it will be kept only if it has degree 3 or more. A root node with degree 1 will be deleted in both cases. """ -function shrink2cycles!(net::HybridNetwork, unroot=false::Bool) +function shrink2cycles!(net::HybridNetwork, unroot::Bool=false) foundcycle = false nh = length(net.hybrid) ih = nh # hybrids deleted from the end @@ -1664,7 +1745,7 @@ function shrink2cycleat!(net::HybridNetwork, minor::Edge, major::Edge, end """ - shrink3cycles!(net::HybridNetwork, unroot=false::Bool) + shrink3cycles!(net::HybridNetwork, unroot::Bool=false) Remove all 2- and 3-cycles from a network. @@ -1680,7 +1761,7 @@ deleted in both cases. See [`shrink3cycleat!`](@ref) for details on branch lengths and inheritance values. """ -function shrink3cycles!(net::HybridNetwork, unroot=false::Bool) +function shrink3cycles!(net::HybridNetwork, unroot::Bool=false) foundcycle = false nh = length(net.hybrid) ih = nh # hybrids deleted from the end @@ -1793,8 +1874,8 @@ function shrink3cycleat!(net::HybridNetwork, hybrid::Node, edge1::Edge, if g1tilde != -1.0 # else one of the γ is missing: do nothing with γs and ts edge1.gamma = g1tilde edge2.gamma = 1.0-g1tilde - edge1.isMajor = g1tilde >= 0.5 - edge2.isMajor = !edge1.isMajor + edge1.ismajor = g1tilde >= 0.5 + edge2.ismajor = !edge1.ismajor if edge1.length != -1.0 && edge2.length != -1.0 && edge3.length != -1.0 edge1.length = (edge1.length *g1 + (edge3.length + edge2.length)*g2g3)/g1tilde end diff --git a/src/bootstrap.jl b/src/bootstrap.jl index f330ecf21..4dc43eb3d 100644 --- a/src/bootstrap.jl +++ b/src/bootstrap.jl @@ -1,9 +1,5 @@ -# julia functions for bootstrap -# Claudia October 2015 -# Cecile April 2016 - """ - readBootstrapTrees(listfile; relative2listfile=true) + readmultinewick_files(listfile; relative2listfile=true) Read the list of file names in `listfile`, then read all the trees in each of these files. Output: vector of vectors of trees (networks with h>0 allowed). @@ -17,7 +13,7 @@ Otherwise, use option `relative2listfile=false`, in which case the file names are interpreted as usual: relative to the user's current directory if not given as absolute paths. """ -function readBootstrapTrees(filelist::AbstractString; relative2listfile=true::Bool) +function readmultinewick_files(filelist::AbstractString; relative2listfile::Bool=true) filelistdir = dirname(filelist) bootfiles = DataFrame(CSV.File(filelist, header=false, types=Dict(1=>String)); copycols=false) @@ -27,20 +23,20 @@ function readBootstrapTrees(filelist::AbstractString; relative2listfile=true::Bo bf = (relative2listfile ? joinpath.(filelistdir, bootfiles[!,1]) : bootfiles[!,1]) treelists = Array{Vector{HybridNetwork}}(undef, ngenes) for igene in 1:ngenes - treelists[igene] = readMultiTopology(bf[igene]) + treelists[igene] = readmultinewick(bf[igene]) print("read $igene/$ngenes bootstrap tree files\r") # using \r for better progress display end return treelists end """ - sampleBootstrapTrees(vector of tree lists; seed=0::Integer, generesampling=false, row=0) - sampleBootstrapTrees!(tree list, vector of tree lists; seed=0::Integer, generesampling=false, row=0) + samplebootstrap_multiloci(vector of tree lists; seed=0, generesampling=false, row=0) + samplebootstrap_multiloci!(tree list, vector of tree lists; seed=0, generesampling=false, row=0) Sample bootstrap gene trees, 1 tree per gene. Set the seed with keyword argument `seed`, which is 0 by default. When `seed=0`, the actual seed is set using the clock. -Assumes a vector of vectors of networks (see `readBootstrapTrees`), +Assumes a vector of vectors of networks (see `readmultinewick_files`), each one of length 1 or more (error if one vector is empty, tested in `bootsnaq`). - site resampling: always, from sampling one bootstrap tree from each given list. @@ -52,14 +48,23 @@ each one of length 1 or more (error if one vector is empty, tested in `bootsnaq` output: one vector of trees. the modifying function (!) modifies the input tree list and returns it. """ -function sampleBootstrapTrees(trees::Vector{Vector{HybridNetwork}}; - seed=0::Integer, generesampling=false::Bool, row=0::Integer) +function samplebootstrap_multiloci( + trees::Vector{Vector{HybridNetwork}}; + seed::Integer=0, + generesampling::Bool=false, + row::Integer=0 +) bootTrees = Array{HybridNetwork}(undef, length(trees)) - sampleBootstrapTrees!(bootTrees, trees, seed=seed, generesampling=generesampling, row=row) + samplebootstrap_multiloci!(bootTrees, trees, seed=seed, generesampling=generesampling, row=row) end -function sampleBootstrapTrees!(bootTrees::Vector{HybridNetwork}, trees::Vector{Vector{HybridNetwork}}; - seed=0::Integer, generesampling=false::Bool, row=0::Integer) +function samplebootstrap_multiloci!( + bootTrees::Vector{HybridNetwork}, + trees::Vector{Vector{HybridNetwork}}; + seed::Integer=0, + generesampling::Bool=false, + row::Integer=0 +) numgen = length(trees) ## number of genes numgen>0 || error("needs at least 1 array of trees") numgen <= length(bootTrees) || error("the input tree list needs to be of length $numgen at least") @@ -91,323 +96,11 @@ end """ - sampleCFfromCI(data frame, seed=0) - sampleCFfromCI!(data frame, seed=0) - -Read a data frame containing CFs and their credibility intervals, and -sample new obsCF uniformly within the CIs. -These CFs are then rescaled to sum up to 1 for each 4-taxon sets. -Return a data frame with taxon labels in first 4 columns, sampled obs CFs in columns 5-7 -and credibility intervals in columns 8-13. - -- The non-modifying function creates a new data frame (with re-ordered columns) and returns it. - If `seed=-1`, the new df is a deep copy of the input df, with no call to the random - number generator. Otherwise, `seed` is passed to the modifying function. -- The modifying function overwrites the input data frame with the sampled CFs and returns it. - If `seed=0`, the random generator is seeded from the clock. Otherwise the random generator - is seeded using `seed`. - -Warning: the modifying version does *not* check the data frame: assumes correct columns. - -optional argument: `delim=','` by default: how columns are delimited. -""" -function sampleCFfromCI(df::DataFrame, seed=0::Integer) - @debug "order of columns should be: t1,t2,t3,t4,cf1234,cf1324,cf1423,cf1234LO,cf1234HI,..." - size(df,2) == 13 || size(df,2) == 14 || @warn "sampleCFfromCI function assumes table from TICR: CF, CFlo, CFhi" - obsCFcol = [findfirst(isequal(:CF12_34), DataFrames.propertynames(df)), - findfirst(isequal(:CF13_24), DataFrames.propertynames(df)), - findfirst(isequal(:CF14_23), DataFrames.propertynames(df))] - nothing ∉ obsCFcol || error("""CF columns were not found: should be named like 'CF12_34'""") - obsCFcol == [5,8,11] || - @warn """CF columns were found, but not in the expected columns. - Lower/upper bounds of credibility intervals assumed in columns 6,7, 9,10 and 12,13.""" - colsTa = [1,2,3,4] # column numbers for taxon names - colsCI = [6,7,9,10,12,13] # for lower/upper CI bounds - length(findall(in(obsCFcol), colsTa)) ==0 || - error("CFs found in columns 1-4 where taxon labels are expected") - length(findall(in(obsCFcol), colsCI)) ==0 || - error("CFs found in columns where credibility intervals are expected") - newdf = df[:, [colsTa; obsCFcol; colsCI] ] - if seed==-1 - return newdf - else - return sampleCFfromCI!(newdf::DataFrame, seed) - end -end - -function sampleCFfromCI!(df::DataFrame, seed=0::Integer) - if seed == 0 - t = time()/1e9 - a = split(string(t),".") - seed = parse(Int,a[2][end-4:end]) #better seed based on clock - println("using seed $(seed) for bootstrap table") - end - Random.seed!(seed) - for i in 1:size(df,1) - c1 = (df[i, 9]-df[i, 8])*rand()+df[i, 8] - c2 = (df[i,11]-df[i,10])*rand()+df[i,10] - c3 = (df[i,13]-df[i,12])*rand()+df[i,12] - suma = c1+c2+c3 - df[i,5] = c1/suma - df[i,6] = c2/suma - df[i,7] = c3/suma - end - return df -end - -sampleCFfromCI(file::AbstractString; delim=','::Char,seed=0::Integer) = - sampleCFfromCI(DataFrame(CSV.File(file, delim=delim); copycols=false),seed) - -# function that will do bootstrap of snaq estimation in series -# it repeats optTopRuns nrep times -# it has the same arguments as optTopRuns except for: -# - need data table of CF with conf intervals (instead of d DataCF), -# or vector of vector of HybridNetworks -# - new argument nrep: number of bootstrap replicates (default 10) -# - new argument runs2: percentage of bootstrap replicates to start in the best network, by default 0.25 -# - new argument bestNet: to start the optimization. if prcnet>0.0 and bestNet is not input as argument from a previous run, it will estimate it inside -# - quartetfile if it was used in original data ("none" if all quartets used) -# recall: optTopRuns! does *not* modify its input starting network -function optTopRunsBoot(currT0::HybridNetwork, data::Union{DataFrame,Vector{Vector{HybridNetwork}}}, - hmax::Integer, liktolAbs::Float64, Nfail::Integer, ftolRel::Float64,ftolAbs::Float64,xtolRel::Float64,xtolAbs::Float64, - verbose::Bool, closeN::Bool, Nmov0::Vector{Int}, - runs1::Integer, outgroup::AbstractString, filename::AbstractString, seed::Integer, probST::Float64, - nrep::Integer, runs2::Integer, bestNet::HybridNetwork, quartetfile::AbstractString) - println("BOOTSTRAP OF SNAQ ESTIMATION") - writelog = true - if filename != "" - logfile = open(string(filename,".log"),"w") - write(logfile, "BOOTSTRAP OF SNAQ ESTIMATION \n") - else - writelog = false - logfile = stdout - end - - inputastrees = isa(data, Vector{Vector{HybridNetwork}}) - inputastrees || isa(data, DataFrame) || - error("Input data not recognized: $(typeof(data))") - - if runs1>0 && runs2>0 - str = """Will use this network as starting topology for $runs1 run(s) for each bootstrap replicate: - $(writeTopologyLevel1(currT0)) - and this other network for $runs2 run(s): - $(writeTopologyLevel1(bestNet)) - """ - writelog && write(logfile, str) - print(str) - end - - if inputastrees # allocate memory, to be re-used later - newtrees = sampleBootstrapTrees(data, row=1) - newd = readTrees2CF(newtrees, quartetfile=quartetfile, writeTab=false, writeSummary=false) - taxa = unionTaxa(newtrees) - else - newdf = sampleCFfromCI(data, -1) # column names check, newdf has obsCF in columns 5-7 - # seed=-1: deep copy only, no rand() - newd = readTableCF!(newdf, collect(1:7)) # allocate memory for DataCF object - end - if runs1>0 && isTree(currT0) # get rough first estimate of branch lengths in startnet - updateBL!(currT0, newd) - end - - if seed == 0 - t = time()/1e9 - a = split(string(t),".") - seed = parse(Int,a[2][end-4:end]) #better seed based on clock - end - println("main seed $(seed)") - writelog && write(logfile,"\nmain seed $(seed)\n") - writelog && flush(logfile) - Random.seed!(seed) - seedsData = round.(Int,floor.(rand(nrep)*100000)) # seeds to sample bootstrap data - if runs1>0 - seeds = round.(Int,floor.(rand(nrep)*100000)) # seeds for all optimizations from currT0 - end - if runs2>0 - seedsOtherNet = round.(Int,floor.(rand(nrep)*100000)) # for runs starting from other net - end - - bootNet = HybridNetwork[] - - writelog && write(logfile,"\nBEGIN: $(nrep) replicates\n$(Libc.strftime(time()))\n") - writelog && flush(logfile) - for i in 1:nrep - str = "\nbegin replicate $(i)\nbootstrap data simulation: seed $(seedsData[i])\n" - writelog && write(logfile, str) - print(str) - if !inputastrees - sampleCFfromCI!(newdf, seedsData[i]) - readTableCF!(newd, newdf, [5,6,7]) - else - sampleBootstrapTrees!(newtrees, data, seed=seedsData[i]) - calculateObsCFAll!(newd,taxa) # do not use readTrees2CF: to save memory and gc time - end - if runs1>0 - str = "estimation, $runs1 run" * (runs1>1 ? "s" : "") * ": seed $(seeds[i])\n" - writelog && write(logfile, str) - print(str) - rootname = "" - @debug begin rootname = string(filename,"_",i); - "rootname set to $rootname"; end - net1 = optTopRuns!(currT0, liktolAbs, Nfail, newd, hmax,ftolRel, ftolAbs, xtolRel, xtolAbs, verbose, closeN, Nmov0, runs1, outgroup, - rootname,seeds[i],probST) - if runs2==0 - net = net1 - end - end - if runs2>0 - str = "estimation, $runs2 run" * (runs2>1 ? "s" : "") * " starting from other net: seed $(seedsOtherNet[i])\n" - writelog && write(logfile, str) - print(str) - rootname = "" - @debug begin rootname = string(filename,"_",i,"_startNet2"); - "rootname set to $rootname"; end - net2 = optTopRuns!(bestNet, liktolAbs, Nfail, newd, hmax,ftolRel, ftolAbs, xtolRel, xtolAbs, verbose, closeN, Nmov0, runs2, outgroup, - rootname,seedsOtherNet[i],probST) - if runs1==0 - net = net2 - end - end - if runs1>0 && runs2>0 - net = (net1.loglik < net2.loglik ? net1 : net2) - end - writelog && flush(logfile) - - push!(bootNet, net) - str = (outgroup=="none" ? writeTopologyLevel1(net) : writeTopologyLevel1(net,outgroup)) - if writelog - write(logfile, str) - write(logfile,"\n") - flush(logfile) - end - println(str) # net also printed by each optTopRuns! but separately from the 2 starting points - end # of the nrep bootstrap replicates - writelog && close(logfile) - - if writelog - s = open(string(filename,".out"),"w") - for n in bootNet - if outgroup == "none" - write(s,"$(writeTopologyLevel1(n))\n") - else - write(s,"$(writeTopologyLevel1(n,outgroup))\n") - end - # "with -loglik $(n.loglik)" not printed: not comparable across bootstrap networks - end - close(s) - end - return bootNet -end - -# like snaq, only calls optTopRunsBoot -# undocumented arguments: closeN, Nmov0 -""" - bootsnaq(T::HybridNetwork, df::DataFrame) - bootsnaq(T::HybridNetwork, vector of tree lists) - -Bootstrap analysis for SNaQ. -Bootstrap data can be quartet concordance factors (CF), -drawn from sampling uniformly in their credibility intervals, -as given in the data frame `df`. -Alternatively, bootstrap data can be gene trees sampled from -a vector of tree lists: one list of bootstrap trees per locus -(see `readBootstrapTrees` to generate this, -from a file containing a list of bootstrap files: one per locus). - -From each bootstrap replicate, a network -is estimated with snaq!, with a search starting from topology `T`. -Optional arguments include the following, with default values in parentheses: - -- `hmax` (1): max number of reticulations in the estimated networks -- `nrep` (10): number of bootstrap replicates. -- `runs` (10): number of independent optimization runs for each replicate -- `filename` ("bootsnaq"): root name for output files. No output files if "". -- `seed` (0 to get a random seed from the clock): seed for random number generator -- `otherNet` (empty): another starting topology so that each replicate will start prcnet% runs on otherNet and (1-prcnet)% runs on `T` -- `prcnet` (0): percentage of runs starting on `otherNet`; error if different than 0.0, and otherNet not specified. -- `ftolRel`, `ftolAbs`, `xtolRel`, `xtolAbs`, `liktolAbs`, `Nfail`, - `probST`, `verbose`, `outgroup`: see `snaq!`, same defaults. - -If `T` is a tree, its branch lengths are first optimized roughly with [`updateBL!`](@ref) -(by using the average CF of all quartets defining each branch and calculating the coalescent units -corresponding to this quartet CF). -If `T` has one or more reticulations, its branch lengths are taken as is to start the search. -The branch lengths of `otherNet` are always taken as is to start the search. -""" -function bootsnaq(startnet::HybridNetwork, data::Union{DataFrame,Vector{Vector{HybridNetwork}}}; - hmax=1::Integer, liktolAbs=likAbs::Float64, Nfail=numFails::Integer, - ftolRel=fRel::Float64, ftolAbs=fAbs::Float64, xtolRel=xRel::Float64, xtolAbs=xAbs::Float64, - verbose=false::Bool, closeN=true::Bool, Nmov0=numMoves::Vector{Int}, - runs=10::Integer, outgroup="none"::AbstractString, filename="bootsnaq"::AbstractString, - seed=0::Integer, probST=0.3::Float64, nrep=10::Integer, prcnet=0.0::Float64, - otherNet=HybridNetwork()::HybridNetwork, quartetfile="none"::AbstractString) - - inputastrees = isa(data, Vector{Vector{HybridNetwork}}) - inputastrees || isa(data, DataFrame) || - error("Input data not recognized: $(typeof(data))") - - if !inputastrees - (DataFrames.propertynames(data)[[6,7,9,10,12,13]] == [:CF12_34_lo,:CF12_34_hi,:CF13_24_lo,:CF13_24_hi,:CF14_23_lo,:CF14_23_hi]) || - @warn """assume table with CI from TICR: CFlo, CFhi in columns 6,7; 9,10; and 12,13. - Found different column names: $(DataFrames.names(data)[[6,7,9,10,12,13]])""" - else # check 1+ genes, each with 1+ trees, all with h=0. - ngenes = length(data) - ngenes > 0 || error("empty list of bootstrap trees (0 genes)") - for igene in 1:ngenes - btr = data[igene] - length(btr) > 0 || error("no bootstrap trees for $(igene)th gene") - for itree in 1:length(btr) - btr[itree].numHybrids == 0 || error("network $itree is not a tree for $(igene)th gene") - end - end - end - prcnet >= 0 || error("percentage of times to use the best network as starting topology should be positive: $(prcnet)") - prcnet = (prcnet <= 1.0) ? prcnet : prcnet/100 - runs2 = round(Int, runs*prcnet) # runs starting from otherNet - runs1 = runs - runs2 # runs starting from startnet - - if runs1>0 - startnet=readTopologyLevel1(writeTopologyLevel1(startnet)) # does not modify startnet outside - flag = checkNet(startnet,true) # light checking only - flag && error("starting topology suspected not level-1") - try - checkNet(startnet) - catch err - println("starting topology is not of level 1:") - rethrow(err) - end - end - runs2 == 0 || otherNet.numTaxa > 0 || - error("""otherNet not given and prcnet>0. Please set prcnet to 0 to start optimizations - from the same network always, or else provide an other network "otherNet" - to start the optimization from this other network in pcrnet % of runs.""") - if runs2 > 0 - otherNet=readTopologyLevel1(writeTopologyLevel1(otherNet)) - flag = checkNet(otherNet,true) # light checking only - flag && error("starting topology 'otherNet' suspected not level-1") - try - checkNet(otherNet) - catch err - println("starting topology 'otherNet' not a level 1 network:") - rethrow(err) - end - end - - # for multiple alleles: expand into two leaves quartets like sp1 sp1 sp2 sp3. - if (@isdefined originald) && !isempty(originald.repSpecies) ## not defined if treefile empty, but not needed - expandLeaves!(originald.repSpecies,startnet) - end - - optTopRunsBoot(startnet,data,hmax, liktolAbs, Nfail,ftolRel, ftolAbs, xtolRel, xtolAbs, - verbose, closeN, Nmov0, runs1, outgroup, filename, - seed, probST, nrep, runs2, otherNet, quartetfile) -end - -""" -`treeEdgesBootstrap(boot_net::Vector{HybridNetwork}, ref_net::HybridNetwork)` + treeedges_support(sample_net::Vector{HybridNetwork}, ref_net::HybridNetwork)` -Read a list of bootstrap networks (`boot_net`) and a reference network (`ref_net`), -and calculate the bootstrap support of the tree edges in the reference network. +Read a sample of networks `sample_net` (such as a bootstrap sample or a +posterior sample) and a reference network (`ref_net`), +and calculate the support for the tree edges in the reference network. All minor hybrid edges (γ<0.5) are removed to extract the major tree from each network. All remaining edges are tree edges, each associated with a bipartition. @@ -418,16 +111,16 @@ output: - the major tree from the reference network, where minor hybrid edges (with γ<0.5) have been removed. """ -function treeEdgesBootstrap(net::Vector{HybridNetwork}, net0::HybridNetwork) +function treeedges_support(net::Vector{HybridNetwork}, net0::HybridNetwork) # estimated network, major tree and matrix - S = tipLabels(net0) - tree0 =majorTree(net0, unroot=true) + S = tiplabels(net0) + tree0 = majortree(net0, unroot=true) M0 = tree2Matrix(tree0,S, rooted=false) M = Matrix[] tree = HybridNetwork[] for n in net - t = majorTree(n, unroot=true) + t = majortree(n, unroot=true) push!(tree,t) mm = tree2Matrix(t,S, rooted=false) push!(M,mm) @@ -435,10 +128,10 @@ function treeEdgesBootstrap(net::Vector{HybridNetwork}, net0::HybridNetwork) df = DataFrame(edgeNumber=Int[], proportion=Float64[]) - for i in 1:size(M0,1) #rows in M0: internal edges - cnt = 0 #count - for j in 1:length(M) #for every M - for k in 1:size(M[j],1) #check every row in M + for i in axes(M0, 1) # rows in M0: internal edges + cnt = 0 # count + for j in eachindex(M) # for every M + for k in axes(M[j],1) # check every row in M if M0[i,2:end] == M[j][k,2:end] || M0[i,2:end] == map(x->(x+1)%2,M[j][k,2:end]) #same row #println("found same row: $(M0[i,2:end]) and $(M[j][k,2:end])") cnt += 1 @@ -447,8 +140,8 @@ function treeEdgesBootstrap(net::Vector{HybridNetwork}, net0::HybridNetwork) end end push!(df,[M0[i,1] cnt*100/length(M)]) - # fixit later, when edges have an attribute for bootstrap support: - # set BS to cnt/length(M) for the edge numbered M0[i,1]. + # if edges had an attribute for bootstrap/posterior support, we could + # set it to cnt/length(M) for the edge numbered M0[i,1]. end @info """edge numbers in the data frame correspond to the current edge numbers in the network. If the network is modified, the edge numbers in the (modified) network might not correspond @@ -459,104 +152,10 @@ end """ - hybridDetection(net::Vector{HybridNetwork}, net1::HybridNetwork, outgroup::AbstractString) - -function can only compare hybrid nodes in networks that have the same underlying major tree -also, need to root all networks in the same place, and the root has to be compatible with the -direction of the hybrid edges - -it computes the rooted hardwired distance between networks, the root matters. -input: vector of bootstrap networks (net), estimated network (net1), outgroup - -returns - -- a matrix with one row per bootstrap network, and 2*number of hybrids in net1, - column i corresponds to whether hybrid i (`net1.hybrid[i]`) is found in the bootstrap network, - column 2i+1 corresponds to the estimated gamma on the bootstrap network - (0.0 if hybrid not found). - To know the order of hybrids, print `net1.hybrid` or `h.name for h in net1.hybrid` -- list of discrepant trees (trees not matching the main tree in net1) -""" -function hybridDetection(net::Vector{HybridNetwork}, net1::HybridNetwork, outgroup::AbstractString) - tree1 = majorTree(net1, unroot=true) - rootnet1 = deepcopy(net1) - rootatnode!(rootnet1,outgroup) - - # HF for "hybrid found?" - HFmat = zeros(length(net),net1.numHybrids*2) - - # discrepant trees - discTrees = HybridNetwork[] - # major trees - majorTrees = HybridNetwork[] - - i = 1 - for n in net - tree = majorTree(n, unroot=true) - push!(majorTrees,tree) - RFmajor = hardwiredClusterDistance(tree, tree1, false) - if RFmajor != 0 - push!(discTrees,tree) - i+=1 - continue # skip replicate if major tree is *not* correct - end - - found = zeros(Bool, net1.numHybrids) # repeats false - gamma = zeros(Float64,net1.numHybrids) # repeats 0.0 - # re-root estimated network if not rooted correctly - reroot = true - if length(n.node[n.root].edge) == 2 # check if root connects to correct outgroup - for e in n.node[n.root].edge - for node in e.node - if node.name == outgroup - reroot = false - break - end - end - if (!reroot) break end - end - end - !reroot || println("Will need to reroot the estimated network...") - for trueh = 1:net1.numHybrids - netT = deepcopy(rootnet1) - displayedNetworkAt!(netT, netT.hybrid[trueh]) # bug: need correct attributes to re-root later... - for esth = 1:n.numHybrids - netE = deepcopy(n) - displayedNetworkAt!(netE, netE.hybrid[esth]) - if reroot - rootatnode!(netE, outgroup) # if re-rooting is not possible, - end # then the hybridization doesn't match. - if hardwiredClusterDistance(netT, netE, true) == 0 # true: rooted - found[trueh] = true - node = netE.hybrid[1] - edges = hybridEdges(node) - edges[2]. hybrid || error("edge should be hybrid") - !edges[2]. isMajor || error("edge should be minor hybrid") - edges[2].gamma <= 0.5 || error("gamma should be less than 0.5") - gamma[trueh] = edges[2].gamma - break # to exit loop over esth - end - end - end - HFmat[i,1:net1.numHybrids] = found - HFmat[i,(net1.numHybrids+1):end] = gamma - i+=1 - end - treeMatch=size(HFmat[sum(HFmat,2).>0,:],1) #number of bootstrap trees that match tree1 - println("$(treeMatch) out of $(length(net)) bootstrap major trees match with the major tree in the estimated network") - println("order of hybrids:") - for h in net1.hybrid - println("$(h.name)") - end - return HFmat,discTrees -end - - -""" -`hybridBootstrapSupport(boot_net::Vector{HybridNetwork}, ref_net::HybridNetwork; rooted=false)` + hybridclades_support(boot_net::Vector{HybridNetwork}, ref_net::HybridNetwork; rooted=false) Match hybrid nodes in a reference network with those in an array of networks, -like bootstrap networks. +like bootstrap networks or in a posterior sample of networks. All networks must be fully resolved, and on the same taxon set. If `rooted=true`, all networks are assumed to have been properly rooted beforehand. Otherwise, the origin of each hybrid edge is considered as an unrooted bipartition (default). @@ -582,10 +181,11 @@ Output: clade and contain true/false values. `true` means that a given taxon belongs in a given clade. For a clade named `H1`, for instance, and if the data frame was named `cla`, the list of taxa in this clade can be obtained with `cla[:taxa][cla[:H1]]`. -4. an array of gamma values, with one row for each bootstrap network and two columns (major/minor) - for each hybrid edge in the reference network. If this hybrid edge was found in the bootstrap network +4. an array of gamma values, with one row for each network in the sample and + two columns (major/minor) for each hybrid edge in the reference network. + If this hybrid edge was found in the sampled network (i.e. same hybrid and sister clades, after removal of all other hybrid nodes), - its bootstrap gamma value is recorded here. Otherwise, the gamma entry is 0.0. + its inheritcance gamma value is recorded here. Otherwise, the gamma entry is 0.0. 5. a vector with the number of each hybrid edge in the reference network, in the same order as for the columns in the array of gamma values above. @@ -598,14 +198,16 @@ The "node" data frame has one row per clade and 9 columns giving: reference network. For those, the hybrid node number is listed here. - `:edge`: number of the parent edge, parent to the node in column 2, if found in the ref network. missing otherwise. - - `:BS_hybrid`: percentage of bootstrap networks in which the clade is found to be a hybrid clade. - - `:BS_sister`: percentage of bootstrap networks in which the clade is found to be sister to - some hybrid clade (sum of the next 2 columns) - - `:BS_major_sister`: percentage of bootstrap networks in which the clade is found to be the - major sister to some hybrid clade + - `:BS_hybrid`: percentage of sample networks in which the clade is found to + be a hybrid clade. + - `:BS_sister`: percentage of sample networks in which the clade is found to + be sister to some hybrid clade (sum of the next 2 columns) + - `:BS_major_sister`: percentage of sample networks in which the clade is + found to be the major sister to some hybrid clade - `:BS_minor_sister`: same as previous, but minor - - `:BS_hybrid_samesisters`: percentage of bootstrap networks in which the clade is found to be - a hybrid and with the same set of sister clades as in the reference network. + - `:BS_hybrid_samesisters`: percentage of sample networks in which the clade + is found to be a hybrid and with the same set of sister clades as in the + reference network. Applies to hybrid clades found in the reference network only, missing for all other clades. The "edge" data frame has one row for each pair of clades, and 8 columns: @@ -615,28 +217,31 @@ The "edge" data frame has one row for each pair of clades, and 8 columns: - `:hybrid`: node number of that clade, if it appears in the reference network. missing otherwise. - `:sister_clade`: name of the clade that is sister to 'edge', i.e. be sister to a hybrid - `:sister`: node number of that clade, if in the ref network. - - `:BS_hybrid_edge`: percentage of bootstrap networks in which 'edge' is found to be a hybrid + - `:BS_hybrid_edge`: percentage of sample networks in which 'edge' is found to be a hybrid edge, i.e. when the clade in the 'hybrid' column is found to be a hybrid and the clade in the 'sister' column is one of its sisters. - - `:BS_major`: percentage of bootstrap networks in which 'edge' is found to be a major hybrid + - `:BS_major`: percentage of sample networks in which 'edge' is found to be a major hybrid edge, i.e. when 'hybrid' is found to be a hybrid clade and 'sister' is found to be its major sister. - `:BS_minor`: same as previous, but minor """ -function hybridBootstrapSupport(nets::Vector{HybridNetwork}, refnet::HybridNetwork; - rooted=false::Bool) +function hybridclades_support( + nets::Vector{HybridNetwork}, + refnet::HybridNetwork; + rooted::Bool=false +) numNets = length(nets) - numNets>0 || error("there aren't any test (bootstrap) networks") - numHybs = refnet.numHybrids + numNets>0 || error("there aren't any networks in the sample") + numHybs = refnet.numhybrids numHybs>0 || error("there aren't any hybrid in reference network") - try directEdges!(refnet) + try directedges!(refnet) catch err if isa(err, RootMismatch) err.msg *= "\nPlease change the root in reference network (see rootatnode! or rootonedge!)" end rethrow(err) end - taxa = tipLabels(refnet) + taxa = tiplabels(refnet) ntax = length(taxa) # extract hardwired clusters of each tree edge in major tree of reference net, @@ -654,16 +259,16 @@ function hybridBootstrapSupport(nets::Vector{HybridNetwork}, refnet::HybridNetwo minsisind = Int[] # minor # hybind, hybnode, majsis*, minsis*: same size = number of hybrid nodes in reference network - if !rooted && length(refnet.node[refnet.root].edge)==2 && any(e -> e.hybrid, refnet.node[refnet.root].edge) + if !rooted && length(refnet.node[refnet.rooti].edge)==2 && any(e -> e.hybrid, refnet.node[refnet.rooti].edge) refnet = deepcopy(refnet) # new binding inside function - fuseedgesat!(refnet.root, refnet) + fuseedgesat!(refnet.rooti, refnet) end # issues otherwise: correct tree edge for root bipartitions, find sister clades, ... - reftre = majorTree(refnet, unroot=true) - skipone = (!rooted && length(reftre.node[reftre.root].edge)<3) # not count same bipartition twice + reftre = majortree(refnet, unroot=true) + skipone = (!rooted && length(reftre.node[reftre.rooti].edge)<3) # not count same bipartition twice for pe in reftre.edge - hwc = hardwiredCluster(pe,taxa) # not very efficient, but human readable - if skipone && refnet.node[refnet.root] ≡ getparent(pe) && sum(hwc)>1 + hwc = hardwiredcluster(pe,taxa) # not very efficient, but human readable + if skipone && refnet.node[refnet.rooti] ≡ getparent(pe) && sum(hwc)>1 skipone = false # wrong algo for trivial 2-taxon rooted tree (A,B); println("skip edge $(pe.number)") else @@ -677,11 +282,11 @@ function hybridBootstrapSupport(nets::Vector{HybridNetwork}, refnet::HybridNetwo hybparent = zeros(Int,length(clade)) # 0 if has no hybrid parent node. Index in hybnode otherwise. for trueh = 1:numHybs net0 = deepcopy(refnet) - displayedNetworkAt!(net0, net0.hybrid[trueh]) # removes all minor hybrid edges but one + displayednetworkat!(net0, net0.hybrid[trueh]) # removes all minor hybrid edges but one hn = net0.hybrid[1] hemaj, hemin, ce = hybridEdges(hn) # assumes no polytomy at hybrid nodes and correct node.hybrid - (hemin.hybrid && !hemin.isMajor) || error("edge should be hybrid and minor") - (hemaj.hybrid && hemaj.isMajor) || error("edge should be hybrid and major") + (hemin.hybrid && !hemin.ismajor) || error("edge should be hybrid and minor") + (hemaj.hybrid && hemaj.ismajor) || error("edge should be hybrid and major") ic = findfirst(isequal(ce.number), treeedge) ic !== nothing || error("hybrid node $(hn.number): child edge not found in major tree") hybparent[ic] = trueh @@ -692,11 +297,11 @@ function hybridBootstrapSupport(nets::Vector{HybridNetwork}, refnet::HybridNetwo for sis in ["min","maj"] he = (sis=="min" ? hemin : hemaj) pn = getparent(he) # parent node of sister (origin of gene flow if minor) - atroot = (!rooted && pn ≡ net0.node[net0.root]) # polytomy at root pn of degree 3: will exclude one child edge + atroot = (!rooted && pn ≡ net0.node[net0.rooti]) # polytomy at root pn of degree 3: will exclude one child edge hwc = zeros(Bool,ntax) # new binding each time. pushed to clade below. for ce in pn.edge # important if polytomy if ce ≢ he && pn ≡ getparent(ce) - hw = hardwiredCluster(ce,taxa) + hw = hardwiredcluster(ce,taxa) if atroot && any(hw .& clade[ic]) # sister clade intersects child clade (hw .& clade[ic]) == clade[ic] || @warn "weird clusters at the root in reference, hybrid node $(hn.number)" @@ -722,7 +327,7 @@ function hybridBootstrapSupport(nets::Vector{HybridNetwork}, refnet::HybridNetwo # pe == nothing if minor hybrid is at root and rooted=true. Will just miss edge and node number # for that clade, but in that case, the minor sister might have been assigned that edge anyway... if pe != nothing - hwc = hardwiredCluster(pe,taxa) + hwc = hardwiredcluster(pe,taxa) i = findfirst(isequal(hwc), clade) # i>0: (hybrid + minor sister) can be in main tree if # hybrid origin is ancestral, i.e. hybrid clade is nested within minor sister. if i===nothing @@ -768,50 +373,50 @@ function hybridBootstrapSupport(nets::Vector{HybridNetwork}, refnet::HybridNetwo for i = 1:numNets net = nets[i] - length(tipLabels(net))==ntax || error("networks have non-matching taxon sets") - try directEdges!(net) # make sure the root is admissible + length(tiplabels(net))==ntax || error("networks have non-matching taxon sets") + try directedges!(net) # make sure the root is admissible catch err if isa(err, RootMismatch) err.msg *= "\nPlease change the root in test network (see rootatnode! or rootatedge!)" end rethrow(err) end - for esth = 1:net.numHybrids # try to match estimated hybrid edge + for esth = 1:net.numhybrids # try to match estimated hybrid edge hwcPar = zeros(Bool,ntax) # minor sister clade hwcChi = zeros(Bool,ntax) # child clade hwcSib = zeros(Bool,ntax) # major sister clade net1 = deepcopy(net) - displayedNetworkAt!(net1, net1.hybrid[esth]) + displayednetworkat!(net1, net1.hybrid[esth]) hn = net1.hybrid[1] - if !rooted && length(net1.node[net1.root].edge)==2 && any(e -> e.hybrid, net1.node[net1.root].edge) - fuseedgesat!(net1.root, net1) + if !rooted && length(net1.node[net1.rooti].edge)==2 && any(e -> e.hybrid, net1.node[net1.rooti].edge) + fuseedgesat!(net1.rooti, net1) end hemaj, hemin, ce = hybridEdges(hn) # assumes no polytomy at hybrid node - (hemin.hybrid && !hemin.isMajor) || error("edge should be hybrid and minor") - (hemaj.hybrid && hemaj.isMajor) || error("edge should be hybrid and major") - hardwiredCluster!(hwcChi,hemin,taxa) + (hemin.hybrid && !hemin.ismajor) || error("edge should be hybrid and minor") + (hemaj.hybrid && hemaj.ismajor) || error("edge should be hybrid and major") + hardwiredcluster!(hwcChi,hemin,taxa) for sis in ["min","maj"] he = (sis=="min" ? hemin : hemaj) pn = getparent(he) # parent of hybrid edge - atroot = (!rooted && pn ≡ net1.node[net1.root]) + atroot = (!rooted && pn ≡ net1.node[net1.rooti]) # if at root: exclude the child edge in the same cycle as he. # its cluster includes hwcChi. all other child edges do not interest hwcChi. # if (atroot) @show i; @warn "$(sis)or edge is at the root!"; end for ce in pn.edge if ce ≢ he && pn ≡ getparent(ce) - hwc = hardwiredCluster(ce,taxa) + hwc = hardwiredcluster(ce,taxa) if !atroot || sum(hwc .& hwcChi) == 0 # empty intersection if (sis=="maj") hwcSib .|= hwc; else hwcPar .|= hwc; end elseif (hwc .& hwcChi) != hwcChi - @warn "weird clusters at the root. bootstrap net i=$i, hybrid $(net.hybrid[esth].name)" + @warn "weird clusters at the root. net i=$i in the sample, hybrid $(net.hybrid[esth].name)" end end end # will use complement too: test network may be rooted differently end # @show taxa[hwcChi]; @show taxa[hwcPar] if all(hwcPar) || all(hwcSib) || all(.!hwcPar) || all(.!hwcSib) - @warn "parent or sibling cluster is full or empty. bootstrap net i=$i, hybrid $(net.hybrid[esth].name)" + @warn "parent or sibling cluster is full or empty. net i=$i in the sample, hybrid $(net.hybrid[esth].name)" end ihyb = findfirst(isequal(hwcChi), clade) @@ -980,41 +585,3 @@ function hybridBootstrapSupport(nets::Vector{HybridNetwork}, refnet::HybridNetwo o = [1:nedges; sortperm(resEdge[nedges+1:length(hybcladei),:BS_hybrid_edge],rev=true) .+ nedges] return resNode, resEdge[o,:], resCluster, gamma, edgenum end - -""" - summarizeHFdf(HFmat::Matrix) - -Summarize data frame output from [`hybridDetection`](@ref). -Output: dataframe with one row per hybrid, and 5 columns: - -- hybrid index (order from estimated network, see [`hybridDetection`](@ref), -- number of bootstrap trees that match the - underlying tree of estimated network -- number of bootstrap networks that have the hybrid -- mean estimated gamma in the bootstrap networks that have the hybrid -- sd estimated gamma in the bootstrap networks that have the hybrid also - -last row has index -1, and the third column has the number of networks -that have all hybrids (hybrid index, mean gamma, sd gamma are -meaningless in this last row) -""" -function summarizeHFdf(HFmat::Matrix) - HFmat2 = HFmat[sum(HFmat,2) .>0,:] - gt = size(HFmat2,1) - total = size(HFmat,1) - numH = round(Int,size(HFmat,2)/2) - df = DataFrame(hybrid=Int[],goodTrees=Float64[],netWithHybrid=Float64[],meanGamma=Float64[], sdGamma=Float64[]) - for i in 1:numH - mat = HFmat2[HFmat2[:,i] .> 0, :] - n = size(mat,1) - g = mean(mat[:,round(Int,numH+i)]) - s = std(mat[:,round(Int,numH+i)]) - push!(df,[i gt n g s]) - end - which = Bool[] - for i in 1:size(HFmat2,1) - push!(which,sum(HFmat2[i,1:numH]) == numH) - end - push!(df, [-1 gt sum(which) -1.0 -1.0]) - return df -end diff --git a/src/compareNetworks.jl b/src/compareNetworks.jl index 881f6a88c..8feada303 100644 --- a/src/compareNetworks.jl +++ b/src/compareNetworks.jl @@ -30,23 +30,27 @@ end # Mij=1 if species j is descendant of edge i, 0 ow. # allows for missing taxa: # Mij=0 if species not present in tree. This is handled in calculateObsCFAll with sameTaxa function -function tree2Matrix(T::HybridNetwork, S::Union{Vector{String},Vector{Int}}; rooted=true::Bool) - length(T.hybrid)==0 || error("tree2Matrix only works on trees. Network has $(T.numHybrids) hybrid nodes.") +function tree2Matrix( + T::HybridNetwork, + S::Union{Vector{String},Vector{Int}}; + rooted::Bool=true +) + length(T.hybrid)==0 || error("tree2Matrix only works on trees. Network has $(T.numhybrids) hybrid nodes.") # sort!(S) # why sort 'taxa', again and again for each tree? Benefits? - ne = length(T.edge)-T.numTaxa # number of internal branch lengths - if (T.node[T.root].leaf) # the root is a leaf: the 1 edge stemming from the root is an external edge + ne = length(T.edge)-T.numtaxa # number of internal branch lengths + if (T.node[T.rooti].leaf) # the root is a leaf: the 1 edge stemming from the root is an external edge ne += 1 # and will need to get a row in the matrix, to be deleted later. end M = zeros(Int,ne,length(S)+1) # M[:,1] = sort!([e.number for e in T.edge]) ie = [1] # index of next edge to be documented: row index in M - for e in T.node[T.root].edge - child = getOtherNode(e,T.node[T.root]) + for e in T.node[T.rooti].edge + child = getOtherNode(e,T.node[T.rooti]) if !isleaf(child) - traverseTree2Matrix!(T.node[T.root],e,ie,M,S) + traverseTree2Matrix!(T.node[T.rooti],e,ie,M,S) end end - if (!rooted && length(T.node[T.root].edge)<3) + if (!rooted && length(T.node[T.rooti].edge)<3) # remove first row of M: 1st edge at the root, duplicated edge # if the tree is to be considered as unrooted, or just leaf. M = M[2:size(M,1),:] # makes a copy, too bad. @@ -55,7 +59,7 @@ function tree2Matrix(T::HybridNetwork, S::Union{Vector{String},Vector{Int}}; roo end """ - hardwiredClusters(net::HybridNetwork, taxon_labels) + hardwiredclusters(net::HybridNetwork, taxon_labels) Returns a matrix describing all the hardwired clusters in a network, with @@ -74,36 +78,36 @@ Both parent hybrid edges to a given hybrid node only contribute a single row (th - next columns: 0/1. 1=descendant of edge, 0=not a descendant, or missing taxon. - last column: 10/11 values. 10=tree edge, 11=hybrid edge -See also [`hardwiredClusterDistance`](@ref) and [`hardwiredCluster`](@ref). +See also [`hardwiredclusterdistance`](@ref) and [`hardwiredcluster`](@ref). """ -function hardwiredClusters(net::HybridNetwork, S::Union{AbstractVector{String},AbstractVector{Int}}) - ne = length(net.edge)-net.numTaxa # number of internal branch lengths +function hardwiredclusters(net::HybridNetwork, S::Union{AbstractVector{String},AbstractVector{Int}}) + ne = length(net.edge)-net.numtaxa # number of internal branch lengths ne -= length(net.hybrid) # to remove duplicate rows for the 2 parent edges of each hybrid - if (net.node[net.root].leaf) # root is leaf: the 1 edge stemming from the root is an external edge + if (net.node[net.rooti].leaf) # root is leaf: the 1 edge stemming from the root is an external edge ne += 1 # but needs to be included still (rooted clusters). end M = zeros(Int,ne,length(S)+2) ie = [1] # index of next edge to be documented: row index in M - for e in net.node[net.root].edge - hardwiredClusters!(net.node[net.root],e,ie,M,S) + for e in net.node[net.rooti].edge + hardwiredclusters!(net.node[net.rooti],e,ie,M,S) end return M end -function hardwiredClusters!(node::Node, edge::Edge, ie::AbstractVector{Int}, M::Matrix{Int}, +function hardwiredclusters!(node::Node, edge::Edge, ie::AbstractVector{Int}, M::Matrix{Int}, S::Union{AbstractVector{String},AbstractVector{Int}}) child = getOtherNode(edge,node) !child.leaf || return 0 # do nothing if child is a leaf. if (edge.hybrid) # edge is a hybrid. Need to find its partner. - (edge.isChild1 ? edge.node[1] == child : edge.node[2] == child) || error( - "inconsistency during network traversal: node $(child.number) supposed to be child of hybrid edge $(edge.number), inconsistent with isChild1.") + (edge.ischild1 ? edge.node[1] == child : edge.node[2] == child) || error( + "inconsistency during network traversal: node $(child.number) supposed to be child of hybrid edge $(edge.number), inconsistent with ischild1.") partner = nothing partnerVisited = true indpartner = 0 for e in child.edge - if (e.hybrid && e != edge && (e.isChild1 ? e.node[1] == child : e.node[2] == child)) + if (e.hybrid && e != edge && (e.ischild1 ? e.node[1] == child : e.node[2] == child)) partner = e indpartner = findfirst(isequal(partner.number), M[:,1]) if isnothing(indpartner) @@ -129,7 +133,7 @@ function hardwiredClusters!(node::Node, edge::Edge, ie::AbstractVector{Int}, M:: indsp != nothing || error("leaf $(grandchild.name) not in species list $(S)") M[indedge,indsp+1] = 1 #indsp+1 because first column is edge numbers else - inde = hardwiredClusters!(child,e,ie,M,S) + inde = hardwiredclusters!(child,e,ie,M,S) M[indedge,2:end-1] .|= M[inde,2:end-1] end end @@ -139,24 +143,24 @@ end """ - hardwiredCluster(edge::Edge, taxa::Union{AbstractVector{String},AbstractVector{Int}}) - hardwiredCluster!(v::Vector{Bool}, edge::Edge, taxa) - hardwiredCluster!(v::Vector{Bool}, edge::Edge, taxa, visited::Vector{Int}) + hardwiredcluster(edge::Edge, taxa::Union{AbstractVector{String},AbstractVector{Int}}) + hardwiredcluster!(v::Vector{Bool}, edge::Edge, taxa) + hardwiredcluster!(v::Vector{Bool}, edge::Edge, taxa, visited::Vector{Int}) Calculate the hardwired cluster of `edge`, coded as a vector of booleans: true for taxa that are descendent of the edge, false for other taxa (including missing taxa). -The edge should belong in a rooted network for which `isChild1` is up-to-date. -Run `directEdges!` beforehand. This is very important, otherwise one might enter an infinite loop, +The edge should belong in a rooted network for which `ischild1` is up-to-date. +Run `directedges!` beforehand. This is very important, otherwise one might enter an infinite loop, and the function does not test for this. visited: vector of node numbers, of all visited nodes. # Examples: ```jldoctest -julia> net5 = "(A,((B,#H1),(((C,(E)#H2),(#H2,F)),(D)#H1)));" |> readTopology |> directEdges! ; +julia> net5 = "(A,((B,#H1),(((C,(E)#H2),(#H2,F)),(D)#H1)));" |> readnewick |> directedges! ; -julia> taxa = net5 |> tipLabels # ABC EF D +julia> taxa = net5 |> tiplabels # ABC EF D 6-element Vector{String}: "A" "B" @@ -165,7 +169,7 @@ julia> taxa = net5 |> tipLabels # ABC EF D "F" "D" -julia> hardwiredCluster(net5.edge[12], taxa) # descendants of 12th edge = CEF +julia> hardwiredcluster(net5.edge[12], taxa) # descendants of 12th edge = CEF 6-element Vector{Bool}: 0 0 @@ -175,19 +179,26 @@ julia> hardwiredCluster(net5.edge[12], taxa) # descendants of 12th edge = CEF 0 ``` -See also [`hardwiredClusterDistance`](@ref) and [`hardwiredClusters`](@ref) +See also [`hardwiredclusterdistance`](@ref) and [`hardwiredclusters`](@ref) """ -function hardwiredCluster(edge::Edge,taxa::Union{AbstractVector{String},AbstractVector{Int}}) +function hardwiredcluster( + edge::Edge, + taxa::Union{AbstractVector{String},AbstractVector{Int}} +) v = zeros(Bool,length(taxa)) - hardwiredCluster!(v,edge,taxa) + hardwiredcluster!(v,edge,taxa) return v end -hardwiredCluster!(v::Vector{Bool},edge::Edge,taxa::Union{AbstractVector{String},AbstractVector{Int}}) = - hardwiredCluster!(v,edge,taxa,Int[]) +hardwiredcluster!(v::Vector{Bool},edge::Edge,taxa::Union{AbstractVector{String},AbstractVector{Int}}) = + hardwiredcluster!(v,edge,taxa,Int[]) -function hardwiredCluster!(v::Vector{Bool},edge::Edge,taxa::Union{AbstractVector{String},AbstractVector{Int}}, - visited::Vector{Int}) +function hardwiredcluster!( + v::Vector{Bool}, + edge::Edge, + taxa::Union{AbstractVector{String},AbstractVector{Int}}, + visited::Vector{Int} +) n = getchild(edge) if n.leaf j = findall(isequal(n.name), taxa) @@ -196,12 +207,12 @@ function hardwiredCluster!(v::Vector{Bool},edge::Edge,taxa::Union{AbstractVector return nothing end if n.number in visited - return nothing # n was already visited: exit. avoid infinite loop is isChild1 was bad. + return nothing # n was already visited: exit. avoid infinite loop is ischild1 was bad. end push!(visited, n.number) for ce in n.edge if n === getparent(ce) - hardwiredCluster!(v,ce,taxa,visited) + hardwiredcluster!(v,ce,taxa,visited) end end return nothing @@ -215,13 +226,13 @@ Return the node numbers of the descendants of a given edge: all descendant nodes if `internal` is true (internal nodes and tips), or descendant tips only otherwise (defaults). -`edge` should belong in a rooted network for which `isChild1` is up-to-date. -Run `directEdges!` beforehand. This is very important, otherwise one might enter an infinite loop, +`edge` should belong in a rooted network for which `ischild1` is up-to-date. +Run `directedges!` beforehand. This is very important, otherwise one might enter an infinite loop, and the function does not test for this. ## Examples ```jldoctest -julia> net5 = "(A,((B,#H1),(((C,(E)#H2),(#H2,F)),(D)#H1)));" |> readTopology |> directEdges! ; +julia> net5 = "(A,((B,#H1),(((C,(E)#H2),(#H2,F)),(D)#H1)));" |> readnewick |> directedges! ; julia> PhyloNetworks.descendants(net5.edge[12], true) # descendants of 12th edge: all of them 7-element Vector{Int64}: @@ -267,9 +278,9 @@ end """ isdescendant(des:Node, anc::Node) -Return true if `des` is a strict descendant of `anc`, using `isChild1` fields +Return true if `des` is a strict descendant of `anc`, using `ischild1` fields to determine the direction of edges. See [`isdescendant_undirected`](@ref) -for a version that does not use `isChild1`. +for a version that does not use `ischild1`. """ function isdescendant(des::Node, anc::Node) visited = Int[] @@ -305,14 +316,14 @@ end Return `true` if `des` is a strict descendant of `ancestor` when starting from edge `parentedge` and going towards `ancestor` onward, regardless -of the field `isChild1` of tree edges; `false` otherwise. +of the field `ischild1` of tree edges; `false` otherwise. This is useful to know how descendant relationships would change as a result of reverting the direction of a tree edge, without actually -modifying the direction (`isChild1`) of any edge. +modifying the direction (`ischild1`) of any edge. `parentedge` should be connected to `ancestor` (not checked). -The direction of hybrid edges is respected (via `isChild1`), that is, +The direction of hybrid edges is respected (via `ischild1`), that is, the traversal does not go from the child to the parent of a hybrid edge. """ function isdescendant_undirected(des::Node, anc::Node, parentedge::Edge) @@ -353,29 +364,29 @@ for the right child of the node (unless the node is of degree 2 or is a polytomy WARNING: assumes that 1. node numbers and edge numbers can be used as indices, that is, be all distinct, positive, covering exactly 1:#nodes and 1:#edges. -2. edges are corrected directed (`isChild1` is up-to-date) and - nodes have been pre-ordered already (field `nodes_changed` up-to-date). +2. edges are corrected directed (`ischild1` is up-to-date) and + nodes have been pre-ordered already (field `vec_node` up-to-date). # examples ```jldoctest -julia> tree = readTopology("(O,A,((B1,B2),(E,(C,D))));"); - -julia> PhyloNetworks.resetNodeNumbers!(tree; checkPreorder=true, type=:postorder) - -julia> printNodes(tree) -node leaf hybrid hasHybEdge name inCycle edges'numbers -1 true false false O -1 1 -2 true false false A -1 2 -3 true false false B1 -1 3 -4 true false false B2 -1 4 -8 false false false -1 3 4 5 -5 true false false E -1 6 -6 true false false C -1 7 -7 true false false D -1 8 -9 false false false -1 7 8 9 -10 false false false -1 6 9 10 -11 false false false -1 5 10 11 -12 false false false -1 1 2 11 +julia> tree = readnewick("(O,A,((B1,B2),(E,(C,D))));"); + +julia> PhyloNetworks.resetnodenumbers!(tree; checkpreorder=true, type=:postorder) + +julia> printnodes(tree) +node leaf hybrid name i_cycle edges'numbers +1 true false O -1 1 +2 true false A -1 2 +3 true false B1 -1 3 +4 true false B2 -1 4 +8 false false -1 3 4 5 +5 true false E -1 6 +6 true false C -1 7 +7 true false D -1 8 +9 false false -1 7 8 9 +10 false false -1 6 9 10 +11 false false -1 5 10 11 +12 false false -1 1 2 11 julia> below, above = PhyloNetworks.ladderpartition(tree); @@ -422,7 +433,7 @@ function ladderpartition(net::HybridNetwork) below = Vector{Vector{Vector{Int}}}(undef, nnodes) above = Vector{Vector{Vector{Int}}}(undef, nnodes) for nni in nnodes:-1:1 # post-order (not pre-order) traversal - nn = net.nodes_changed[nni] + nn = net.vec_node[nni] above[nn.number] = Vector{Vector{Int}}(undef,0) # initialize if nn.leaf below[nn.number] = [[nn.number]] @@ -444,7 +455,7 @@ function ladderpartition(net::HybridNetwork) # so far: above[n] contains the clades *sister* to node number n, only. # add those above = any above n's parent, using pre-order this time. for nni in 2:nnodes # avoid 1: it's the root, no parent, nothing to update - nn = net.nodes_changed[nni] + nn = net.vec_node[nni] pn = getparent(nn).number # major parent number for clade in above[pn] push!(above[nn.number], clade); end end @@ -452,7 +463,7 @@ function ladderpartition(net::HybridNetwork) end """ - deleteHybridThreshold!(net::HybridNetwork, threshold::Float64, + deletehybridthreshold!(net::HybridNetwork, threshold::Float64, nofuse=false, unroot=false, multgammas=false, keeporiginalroot=false) @@ -475,18 +486,23 @@ Warnings: - by default, `nofuse` is false, partner hybrid edges are fused with their child edge and have their γ changed to 1.0. If `nofuse` is true: the γ's of partner hybrid edges are unchanged. -- assumes correct `isMajor` fields, and correct `isChild1` fields to update `containRoot`. +- assumes correct `ismajor` fields, and correct `ischild1` fields to update `containroot`. """ -function deleteHybridThreshold!(net::HybridNetwork, gamma::Float64, - nofuse=false::Bool, unroot=false::Bool, - multgammas=false::Bool, keeporiginalroot=false::Bool) - gamma <= 0.5 || error("deleteHybridThreshold! called with gamma = $(gamma)>0.5") - for i = net.numHybrids:-1:1 +function deletehybridthreshold!( + net::HybridNetwork, + gamma::Float64, + nofuse::Bool=false, + unroot::Bool=false, + multgammas::Bool=false, + keeporiginalroot::Bool=false +) + gamma <= 0.5 || error("deletehybridthreshold! called with gamma = $(gamma)>0.5") + for i = net.numhybrids:-1:1 # starting from last because net.hybrid changes as hybrids are removed. Empty range if 0 hybrids. i > lastindex(net.hybrid) && continue # removing 1 hybrid could remove several, if non-tree child net e = getparentedgeminor(net.hybrid[i]) # remove minor edge e if γ < threshold OR threshold=0.5 - # warning: no check if γ and isMajor are in conflict + # warning: no check if γ and ismajor are in conflict if e.gamma < gamma || gamma == 0.5 # note: γ=-1 if missing, so < gamma threshold # deleteHybrid!(net.hybrid[i],net,true,false) # requires non-missing edge lengths # deleteHybridizationUpdate! requires level-1 network with corresponding attributes @@ -497,7 +513,7 @@ function deleteHybridThreshold!(net::HybridNetwork, gamma::Float64, end """ - displayedNetworks!(net::HybridNetwork, node::Node, keepNode=false, + displayednetworks!(net::HybridNetwork, node::Node, keepNode=false, unroot=false, multgammas=false, keeporiginalroot=false) Extracts the two networks that simplify a given network at a given hybrid node: @@ -510,9 +526,14 @@ If `keeporiginalroot` is true, the root is retained even if it is of degree 1. - the original network is modified: the minor edge removed. - returns one HybridNetwork object: the network with the major edge removed """ -function displayedNetworks!(net::HybridNetwork, node::Node, - nofuse=false::Bool, unroot=false::Bool, - multgammas=false::Bool, keeporiginalroot=false::Bool) +function displayednetworks!( + net::HybridNetwork, + node::Node, + nofuse::Bool=false, + unroot::Bool=false, + multgammas::Bool=false, + keeporiginalroot::Bool=false +) node.hybrid || error("will not extract networks from tree node $(node.number)") ind = findfirst(x -> x===node, net.node) ind !== nothing || error("node $(node.number) was not found in net") @@ -525,9 +546,9 @@ function displayedNetworks!(net::HybridNetwork, node::Node, end """ - displayedTrees(net::HybridNetwork, gamma::Float64; nofuse=false::Bool, - unroot=false::Bool, multgammas=false::Bool, - keeporiginalroot=false::Bool) + displayedtrees(net::HybridNetwork, gamma::Float64; nofuse::Bool=false, + unroot::Bool=false, multgammas::Bool=false, + keeporiginalroot::Bool=false) Extracts all trees displayed in a network, following hybrid edges with heritability >= γ threshold (or >0.5 if threshold=0.5) @@ -548,24 +569,29 @@ Returns an array of trees, as HybridNetwork objects. Warnings: - if `nofuse` is true: the retained partner hybrid edges have - their γ values unchanged, but their `isMajor` is changed to true -- assume correct `isMajor` attributes. + their γ values unchanged, but their `ismajor` is changed to true +- assume correct `ismajor` attributes. """ -function displayedTrees(net0::HybridNetwork, gamma::Float64; - nofuse=false::Bool, unroot=false::Bool, - multgammas=false::Bool, keeporiginalroot=false::Bool) +function displayedtrees( + net0::HybridNetwork, + gamma::Float64; + nofuse::Bool=false, + unroot::Bool=false, + multgammas::Bool=false, + keeporiginalroot::Bool=false +) trees = HybridNetwork[] net = deepcopy(net0) - deleteHybridThreshold!(net,gamma,nofuse,unroot, multgammas, keeporiginalroot) - displayedTrees!(trees,net,nofuse,unroot, multgammas, keeporiginalroot) - return trees # should have length 2^net.numHybrids + deletehybridthreshold!(net,gamma,nofuse,unroot, multgammas, keeporiginalroot) + displayedtrees!(trees,net,nofuse,unroot, multgammas, keeporiginalroot) + return trees # should have length 2^net.numhybrids end """ - inheritanceWeight(tree::HybridNetwork) + inheritanceweight(tree::HybridNetwork) Return the *log* inheritance weight of a network or tree -(as provided by [`displayedTrees`](@ref) with `nofuse` = true for instance). +(as provided by [`displayedtrees`](@ref) with `nofuse` = true for instance). For a tree displayed in a network, its inheritance weight is the log of the product of γ's of all edges retained in the tree. To avoid underflow, the log is calculated: i.e. sum of log(γ) across retained edges. @@ -576,17 +602,17 @@ and the function returns `missing`. # Example ```julia-repl -julia> net = readTopology("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);"); +julia> net = readnewick("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);"); -julia> trees = displayedTrees(net,0.0; nofuse=true); +julia> trees = displayedtrees(net,0.0; nofuse=true); -julia> PhyloNetworks.inheritanceWeight.(trees) +julia> PhyloNetworks.inheritanceweight.(trees) 2-element Vector{Float64}: -0.105361 -2.30259 ``` """ -function inheritanceWeight(tree::HybridNetwork) +function inheritanceweight(tree::HybridNetwork) ltw = 0.0 for e in tree.edge e.gamma != 1.0 || continue @@ -597,8 +623,8 @@ function inheritanceWeight(tree::HybridNetwork) end """ - majorTree(net::HybridNetwork; nofuse=false::Bool, unroot=false::Bool, - keeporiginalroot=false::Bool) + majortree(net::HybridNetwork; nofuse::Bool=false, unroot::Bool=false, + keeporiginalroot::Bool=false) Extract the major tree displayed in a network, keeping the major edge and dropping the minor edge at each hybrid node. @@ -614,31 +640,39 @@ is retained: the major hybrid edge is fused with it. Warnings: - if `nofuse` is true: the hybrid edges that are retained (without fusing) - have their γ values unchanged, but their `isMajor` is changed to true -- assume correct `isMajor` attributes. + have their γ values unchanged, but their `ismajor` is changed to true +- assume correct `ismajor` attributes. """ -majorTree(net::HybridNetwork; nofuse=false::Bool, unroot=false::Bool, - keeporiginalroot=false::Bool) = - displayedTrees(net,0.5; nofuse=nofuse, unroot=unroot, +majortree( + net::HybridNetwork; + nofuse::Bool=false, + unroot::Bool=false, + keeporiginalroot::Bool=false +) = displayedtrees(net,0.5; nofuse=nofuse, unroot=unroot, keeporiginalroot=keeporiginalroot)[1] # expands current list of trees, with trees displayed in a given network -function displayedTrees!(trees::Array{HybridNetwork,1}, net::HybridNetwork, - nofuse=false::Bool, unroot=false::Bool, - multgammas=false::Bool, keeporiginalroot=false::Bool) +function displayedtrees!( + trees::Array{HybridNetwork,1}, + net::HybridNetwork, + nofuse::Bool=false, + unroot::Bool=false, + multgammas::Bool=false, + keeporiginalroot::Bool=false +) if isTree(net) - # warning: no update of edges' containRoot (true) or edges' and nodes' inCycle (-1) + # warning: no update of edges containroot (true) or boole1 and booln1 (-1) for cycle number push!(trees, net) else - netmin = displayedNetworks!(net, net.hybrid[1], nofuse, unroot, multgammas, keeporiginalroot) - displayedTrees!(trees, net, nofuse, unroot, multgammas, keeporiginalroot) - displayedTrees!(trees, netmin, nofuse, unroot, multgammas, keeporiginalroot) + netmin = displayednetworks!(net, net.hybrid[1], nofuse, unroot, multgammas, keeporiginalroot) + displayedtrees!(trees, net, nofuse, unroot, multgammas, keeporiginalroot) + displayedtrees!(trees, netmin, nofuse, unroot, multgammas, keeporiginalroot) end end """ - minorTreeAt(net::HybridNetwork, hybindex::Integer, nofuse=false, unroot=false::Bool) + minortreeat(net::HybridNetwork, hybindex::Integer, nofuse=false, unroot::Bool=false) Extract the tree displayed in the network, following the major hybrid edge at each hybrid node, except at the ith hybrid node (i=`hybindex`), @@ -646,32 +680,40 @@ where the minor hybrid edge is kept instead of the major hybrid edge. If `nofuse` is true, edges are not fused (degree-2 nodes are kept). If `unroot` is true, the root will be deleted if it becomes of degree 2. -Warning: assume correct `isMajor` fields. +Warning: assume correct `ismajor` fields. """ -function minorTreeAt(net::HybridNetwork, hybindex::Integer, - nofuse=false::Bool, unroot=false::Bool) +function minortreeat( + net::HybridNetwork, + hybindex::Integer, + nofuse::Bool=false, + unroot::Bool=false +) hybindex <= length(net.hybrid) || error("network has fewer hybrid nodes than index $(hybindex).") tree = deepcopy(net) hybedge = getparentedge(tree.hybrid[hybindex]) # major parent deletehybridedge!(tree, hybedge, nofuse, unroot) # delete major hybrid edge at reticulation of interest - return majorTree(tree; nofuse=nofuse, unroot=unroot) # all remaining minor edges removed: now it's a tree. + return majortree(tree; nofuse=nofuse, unroot=unroot) # all remaining minor edges removed: now it's a tree. end """ - displayedNetworkAt!(net::HybridNetwork, node::Node, nofuse=false, + displayednetworkat!(net::HybridNetwork, node::Node, nofuse=false, unroot=false, multgammas=false) Delete all the minor hybrid edges, except at input node. The network is left with a single hybridization, and otherwise displays the same major tree as before. If `nofuse` is true, edges are not fused (degree-2 nodes are kept). -Warning: assume correct `isMajor` fields. +Warning: assume correct `ismajor` fields. """ -function displayedNetworkAt!(net::HybridNetwork, node::Node, - nofuse=false::Bool, unroot=false::Bool, - multgammas=false::Bool) +function displayednetworkat!( + net::HybridNetwork, + node::Node, + nofuse::Bool=false, + unroot::Bool=false, + multgammas::Bool=false +) node.hybrid || error("will not extract network from tree node $(node.number)") - for i = net.numHybrids:-1:1 + for i = net.numhybrids:-1:1 # starting from last because net.hybrid changes as hybrids are removed. Empty range if 0 hybrids. net.hybrid[i] != node || continue emin = getparentedgeminor(net.hybrid[i]) @@ -681,7 +723,7 @@ end """ - hardwiredClusterDistance(net1::HybridNetwork, net2::HybridNetwork, rooted::Bool) + hardwiredclusterdistance(net1::HybridNetwork, net2::HybridNetwork, rooted::Bool) Hardwired cluster distance between the topologies of `net1` and `net2`, that is, the number of hardwired clusters found in one network and not in the other @@ -707,15 +749,15 @@ and [Huson, Rupp, Scornavacca (2010)](https://doi.org/10.1017/CBO9780511974076). ## Example ```jldoctest -julia> net1 = readTopology("(t6,(t5,((t4,(t3,((t2,t1))#H1)),#H1)));"); +julia> net1 = readnewick("(t6,(t5,((t4,(t3,((t2,t1))#H1)),#H1)));"); -julia> taxa = sort(tipLabels(net1)); # t1 through t6, sorted alphabetically +julia> taxa = sort(tiplabels(net1)); # t1 through t6, sorted alphabetically julia> # using PhyloPlots; plot(net1, showedgenumber=true); julia> # in matrix below: column 1: edge number. last column: tree (10) vs hybrid (11) edge # middle columns: for 'taxa': t1,...t6. 1=descendant, 0=not descendant - hardwiredClusters(net1, taxa) + hardwiredclusters(net1, taxa) 6×8 Matrix{Int64}: 13 1 1 1 1 1 0 10 12 1 1 1 1 0 0 10 @@ -724,9 +766,9 @@ julia> # in matrix below: column 1: edge number. last column: tree (10) vs hybri 8 1 1 0 0 0 0 11 7 1 1 0 0 0 0 10 -julia> net2 = readTopology("(t6,(t5,((t4,(t3)#H1),(#H1,(t1,t2)))));"); +julia> net2 = readnewick("(t6,(t5,((t4,(t3)#H1),(#H1,(t1,t2)))));"); -julia> hardwiredClusters(net2, taxa) +julia> hardwiredclusters(net2, taxa) 6×8 Matrix{Int64}: 13 1 1 1 1 1 0 10 12 1 1 1 1 0 0 10 @@ -735,7 +777,7 @@ julia> hardwiredClusters(net2, taxa) 11 1 1 1 0 0 0 10 10 1 1 0 0 0 0 10 -julia> hardwiredClusterDistance(net1, net2, true) # true: as rooted networks +julia> hardwiredclusterdistance(net1, net2, true) # true: as rooted networks 4 ``` @@ -781,22 +823,22 @@ then all degree-2 nodes are removed before comparing the hardwired clusters, and the minimum distance is returned over all possible ways to root the networks at internal nodes. -See also: [`hardwiredClusters`](@ref), [`hardwiredCluster`](@ref) +See also: [`hardwiredclusters`](@ref), [`hardwiredcluster`](@ref) """ -function hardwiredClusterDistance(net1::HybridNetwork, net2::HybridNetwork, rooted::Bool) - bothtrees = (net1.numHybrids == 0 && net2.numHybrids == 0) +function hardwiredclusterdistance(net1::HybridNetwork, net2::HybridNetwork, rooted::Bool) + bothtrees = (net1.numhybrids == 0 && net2.numhybrids == 0) rooted || bothtrees || - return hardwiredClusterDistance_unrooted(net1, net2) # tries all roots, but removes degree-2 nodes - taxa = sort!(String[net1.leaf[i].name for i in 1:net1.numTaxa]) - length(setdiff(taxa, String[net2.leaf[i].name for i in 1:net2.numTaxa])) == 0 || + return hardwiredclusterdistance_unrooted(net1, net2) # tries all roots, but removes degree-2 nodes + taxa = sort!(String[net1.leaf[i].name for i in 1:net1.numtaxa]) + length(setdiff(taxa, String[net2.leaf[i].name for i in 1:net2.numtaxa])) == 0 || error("net1 and net2 do not share the same taxon set. Please prune networks first.") nTax = length(taxa) if bothtrees # even if rooted, different treatment at the root if root=leaf M1 = tree2Matrix(net1, taxa, rooted=rooted) M2 = tree2Matrix(net2, taxa, rooted=rooted) else - M1 = hardwiredClusters(net1, taxa) # last row: 10/11 if tree/hybrid edge. - M2 = hardwiredClusters(net2, taxa) + M1 = hardwiredclusters(net1, taxa) # last row: 10/11 if tree/hybrid edge. + M2 = hardwiredclusters(net2, taxa) #println("M1="); print(M1); println("\nM2="); print(M2); println("\n"); end dis = 0 @@ -824,25 +866,25 @@ end """ - hardwiredClusterDistance_unrooted(net1::HybridNetwork, net2::HybridNetwork) + hardwiredclusterdistance_unrooted(net1::HybridNetwork, net2::HybridNetwork) Miminum hardwired cluster dissimilarity between the two networks, considered as unrooted (or semi-directed). This dissimilarity is defined as the minimum rooted distance, over all root positions that are compatible with the direction of hybrid edges. -Called by [`hardwiredClusterDistance`](@ref). +Called by [`hardwiredclusterdistance`](@ref). To avoid repeating identical clusters, all degree-2 nodes are deleted before starting the comparison. Since rooting the network at a leaf creates a root node of degree 2 and an extra cluster, leaves are excluded from possible rooting positions. """ -function hardwiredClusterDistance_unrooted(net1::HybridNetwork, net2::HybridNetwork) - return hardwiredClusterDistance_unrooted!(deepcopy(net1), deepcopy(net2)) +function hardwiredclusterdistance_unrooted(net1::HybridNetwork, net2::HybridNetwork) + return hardwiredclusterdistance_unrooted!(deepcopy(net1), deepcopy(net2)) end -function hardwiredClusterDistance_unrooted!(net1::HybridNetwork, net2::HybridNetwork) +function hardwiredclusterdistance_unrooted!(net1::HybridNetwork, net2::HybridNetwork) #= fixit: inefficient function, because r1 * r2 "M" matrices of - hardwiredClusters() are calculated, where ri = # root positions in neti. + hardwiredclusters() are calculated, where ri = # root positions in neti. Rewrite to calculate only r1 + r2 M's. =# removedegree2nodes!(net1) # because re-rooting would remove them in an @@ -877,7 +919,7 @@ function hardwiredClusterDistance_unrooted!(net1::HybridNetwork, net2::HybridNet rootatnode!(net1, n1) for n2 in net2roots rootatnode!(net2, n2) - diss = hardwiredClusterDistance(net1, net2, true) # rooted = true now + diss = hardwiredclusterdistance(net1, net2, true) # rooted = true now if diss < bestdissimilarity bestns = (n1, n2) bestdissimilarity = diss diff --git a/src/deleteHybrid.jl b/src/deleteHybrid.jl deleted file mode 100644 index b65c17df3..000000000 --- a/src/deleteHybrid.jl +++ /dev/null @@ -1,458 +0,0 @@ -# functions to delete hybridization -# originally in functions.jl -# Claudia MArch 2015 - -# --------------------------------- delete hybridization ------------------------------- - -# function to identify inCycle (with priority queue) -# based on updateInCycle as it is the exact same code -# only without changing the incycle attribute -# only returning array of edges/nodes affected by the hybrid -# used when attempting to delete -# input: hybrid node around which we want to identify inCycle -# returns tuple: nocycle, array of edges changed, array of nodes changed -# check: is this traversal much faster than a simple loop over -# all edges/nodes and check if incycle==hybrid.number? -function identifyInCycle(net::Network,node::Node) - node.hybrid || error("node $(node.number) is not hybrid, cannot identifyInCycle") - start = node; - hybedge = getparentedgeminor(node) - lastnode = getOtherNode(hybedge,node) - dist = 0; - queue = PriorityQueue(); - path = Node[]; - net.edges_changed = Edge[]; - net.nodes_changed = Node[]; - push!(net.edges_changed,hybedge); - push!(net.nodes_changed,node); - found = false; - net.visited = [false for i = 1:size(net.node,1)]; - enqueue!(queue,node,dist); - while(!found) - if(isempty(queue)) - return true, net.edges_changed, net.nodes_changed - else - curr = dequeue!(queue); - if isEqual(curr,lastnode) - found = true; - push!(path,curr); - elseif !net.visited[getIndex(curr,net)] - net.visited[getIndex(curr,net)] = true - atstart = isEqual(curr,start) - for e in curr.edge - e.isMajor || continue - other = getOtherNode(e,curr) - if atstart || (!other.leaf && !net.visited[getIndex(other,net)]) - other.prev = curr - dist = dist+1 - enqueue!(queue,other,dist) - end - end - end - end - end # end while - curr = pop!(path); - while(!isEqual(curr, start)) - if(curr.inCycle == start.number) - push!(net.nodes_changed, curr); - edge = getConnectingEdge(curr,curr.prev); - if(edge.inCycle == start.number) - push!(net.edges_changed, edge); - end - curr = curr.prev; - end - end - return false, net.edges_changed, net.nodes_changed -end - - - -# aux function to traverse the network -# similar to traverseContainRoot but only -# identifying the edges that would be changed by a given -# hybridization -# warning: it does not go accross hybrid node/edge, -# nor tree node with minor hybrid edge -function traverseIdentifyRoot(node::Node, edge::Edge, edges_changed::Array{Edge,1}) - if(!node.leaf && !node.hybrid) - for e in node.edge - if(!isEqual(edge,e) && e.isMajor && !e.hybrid) - other = getOtherNode(e,node); - push!(edges_changed, e); - if(!other.hybrid) - #if(!other.hasHybEdge) - traverseIdentifyRoot(other,e, edges_changed); - #else - # if(hybridEdges(other)[1].isMajor) - # traverseIdentifyRoot(other,e, edges_changed); - # end - #end - end - end - end - end -end - - -# function to identify containRoot -# depending on a hybrid node on the network -# input: hybrid node (can come from searchHybridNode) -# return array of edges affected by the hybrid node -function identifyContainRoot(net::HybridNetwork, node::Node) - node.hybrid || error("node $(node.number) is not hybrid, cannot identify containRoot") - net.edges_changed = Edge[]; - for e in node.edge - if(!e.hybrid) - other = getOtherNode(e,node); - push!(net.edges_changed,e); - traverseIdentifyRoot(other,e, net.edges_changed); - end - end - return net.edges_changed -end - -# function to undo the effect of a hybridization -# and then delete it -# input: network, hybrid node, random flag -# random = true, deletes one hybrid egde at random -# (minor with prob 1-gamma, major with prob gamma) -# random = false, deletes the minor edge always -# warning: it uses the gamma of the hybrid edges even if -# it is not identifiable like in bad diamond I (assumes undone by now) -# blacklist = true: add the edge as a bad choice to put a hybridization (not fully tested) -function deleteHybridizationUpdate!(net::HybridNetwork, hybrid::Node, random::Bool, blacklist::Bool) - hybrid.hybrid || error("node $(hybrid.number) is not hybrid, so we cannot delete hybridization event around it") - @debug "MOVE: delete hybridization on hybrid node $(hybrid.number)" - nocycle, edgesInCycle, nodesInCycle = identifyInCycle(net,hybrid); - !nocycle || error("the hybrid node $(hybrid.number) does not create a cycle") - edgesRoot = identifyContainRoot(net,hybrid); - edges = hybridEdges(hybrid); - undoGammaz!(hybrid,net); - othermaj = getOtherNode(edges[1],hybrid) - edgesmaj = hybridEdges(othermaj) - @debug "edgesmaj[3] $(edgesmaj[3].number) is the one to check if containRoot=false already: $(edgesmaj[3].containRoot)" - if(edgesmaj[3].containRoot) #if containRoot=true, then we need to undo - push!(edgesRoot, edges[1]) ## add hybrid edges to edgesRoot to undo containRoot - push!(edgesRoot, edges[2]) - undoContainRoot!(edgesRoot); - end - limit = edges[1].gamma - @debug (limit < 0.5 ? "strange major hybrid edge $(edges[1].number) with γ $limit < 0.5" : - (limit == 1.0 ? "strange major hybrid edge $(edges[1].number) with γ = $limit" : "")) - if(random) - minor = rand() < limit ? false : true - else - minor = true; - end - deleteHybrid!(hybrid,net,minor, blacklist) - undoInCycle!(edgesInCycle, nodesInCycle); #moved after deleteHybrid to mantain who is incycle when deleteEdge and look for partition - undoPartition!(net,hybrid, edgesInCycle) -end - -deleteHybridizationUpdate!(net::HybridNetwork, hybrid::Node) = deleteHybridizationUpdate!(net, hybrid, true, false) - -# function to delete a hybridization event -# input: hybrid node and network -# minor: true (deletes minor edge), false (deletes major) -# warning: it is meant after undoing the effect of the -# hybridization in deleteHybridizationUpdate! -# by itself, it leaves things as is -# branch lengths of -1.0 are interpreted as missing. -function deleteHybrid!(node::Node,net::HybridNetwork,minor::Bool, blacklist::Bool) - node.hybrid || error("node $(node.number) has to be hybrid for deleteHybrid") - if(minor) - hybedge1,hybedge2,treeedge1 = hybridEdges(node); - other1 = getOtherNode(hybedge1,node); - other2 = getOtherNode(hybedge2,node); - other3 = getOtherNode(treeedge1,node); - if(hybedge1.number > treeedge1.number) - setLength!(treeedge1, addBL(treeedge1.length, hybedge1.length)); - removeNode!(node,treeedge1); - setNode!(treeedge1,other1); - setEdge!(other1,treeedge1); - removeEdge!(other1, hybedge1); - deleteEdge!(net,hybedge1); - #treeedge1.containRoot = (!treeedge1.containRoot || !hybedge1.containRoot) ? false : true #causes problems if hybrid.CR=false - if(blacklist) - println("put in blacklist edge $(treeedge1.number)") - push!(net.blacklist, treeedge1.number) - end - else - makeEdgeTree!(hybedge1,node) - other1.hasHybEdge = false; - setLength!(hybedge1, addBL(hybedge1.length, treeedge1.length)); - removeNode!(node,hybedge1); - setNode!(hybedge1,other3); - setEdge!(other3,hybedge1); - removeEdge!(other3,treeedge1); - deleteEdge!(net,treeedge1); - hybedge1.containRoot = (!treeedge1.containRoot || !hybedge1.containRoot) ? false : true - if(blacklist) - println("put in blacklist edge $(hybedge1.number)") - push!(net.blacklist, hybedge1.number) - end - end - hybindex = findfirst([e.hybrid for e in other2.edge]); - isnothing(hybindex) && error("didn't find hybrid edge in other2") - if(hybindex == 1) - treeedge1 = other2.edge[2]; - treeedge2 = other2.edge[3]; - elseif(hybindex == 2) - treeedge1 = other2.edge[1]; - treeedge2 = other2.edge[3]; - elseif(hybindex == 3) - treeedge1 = other2.edge[1]; - treeedge2 = other2.edge[2]; - else - error("strange node has more than three edges") - end - treenode1 = getOtherNode(treeedge1,other2); - treenode2 = getOtherNode(treeedge2,other2); - if(abs(treeedge1.number) > abs(treeedge2.number)) - setLength!(treeedge2, addBL(treeedge2.length, treeedge1.length)); - removeNode!(other2,treeedge2); - setNode!(treeedge2,treenode1); - setEdge!(treenode1,treeedge2); - removeEdge!(treenode1,treeedge1); - deleteEdge!(net,treeedge1); - treeedge2.containRoot = (!treeedge1.containRoot || !treeedge2.containRoot) ? false : true - if(blacklist) - println("put in blacklist edge $(treeedge2.number)") - push!(net.blacklist, treeedge2.number) - end - else - setLength!(treeedge1, addBL(treeedge2.length, treeedge1.length)); - removeNode!(other2,treeedge1); - setNode!(treeedge1,treenode2); - setEdge!(treenode2,treeedge1); - removeEdge!(treenode2,treeedge2); - deleteEdge!(net,treeedge2); - treeedge1.containRoot = (!treeedge1.containRoot || !treeedge2.containRoot) ? false : true - if(blacklist) - println("put in blacklist edge $(treeedge1.number)") - push!(net.blacklist, treeedge1.number) - end - end - #removeHybrid!(net,node); - deleteNode!(net,node); - deleteNode!(net,other2); - deleteEdge!(net,hybedge2); - else - hybedge1,hybedge2,treeedge1 = hybridEdges(node); - other1 = getOtherNode(hybedge1,node); - other2 = getOtherNode(hybedge2,node); - setLength!(treeedge1, addBL(treeedge1.length, hybedge2.length)) - removeEdge!(other2,hybedge2) - removeNode!(node,treeedge1) - setEdge!(other2,treeedge1) - setNode!(treeedge1,other2) - #removeHybrid!(net,node) - deleteNode!(net,node) - deleteEdge!(net,hybedge1) - deleteEdge!(net,hybedge2) - removeEdge!(other1,hybedge1) - size(other1.edge,1) == 2 || error("strange node $(other1.number) had 4 edges") - if(abs(other1.edge[1].number) < abs(other1.edge[2].number)) - edge = other1.edge[1] - otheredge = other1.edge[2] - else - edge = other1.edge[2] - otheredge = other1.edge[1] - end - setLength!(other1.edge[1], addBL(other1.edge[1].length, other1.edge[2].length)) - other3 = getOtherNode(otheredge,other1); - removeNode!(other1,edge) - removeEdge!(other3,otheredge) - setEdge!(other3,edge) - setNode!(edge,other3) - deleteNode!(net,other1) - deleteEdge!(net,otheredge) - end -end - -deleteHybrid!(node::Node,net::HybridNetwork,minor::Bool) = deleteHybrid!(node,net,minor, false) - -""" - deletehybridedge!(net::HybridNetwork, edge::Edge, - nofuse=false, unroot=false, - multgammas=false, simplify=true, keeporiginalroot=false) - -Delete a hybrid `edge` from `net` and return the network. -The network does not have to be of level 1 and may contain polytomies, -although each hybrid node must have exactly 2 parents. -Branch lengths are updated, allowing for missing values. - -If `nofuse` is false, when `edge` is removed, its child (hybrid) node is removed -and its partner hybrid edge is removed. -Its child edge is retained (below the hybrid node), fused with the former partner, -with new length: old length + length of `edge`'s old partner. -Any 2-cycle is simplified into a single edge, unless `simplify` is false. - -If `nofuse` is true, edges with descendant leaves are kept as is, -and are not fused. Nodes are retained during edge removal, -provided that they have at least one descendant leaf. -The hybrid edge that is partner to `edge` becomes a tree edge, -but has its γ value unchanged (it is not set to 1), since it is not merged -with its child edge after removal of the reticulation. -Also, 2-cycles are not simplified if `nofuse` is true. -That is, if we get 2 hybrid edges both from the same parent to the same child, -these hybrid edges are retained without being fused into a single tree edge. - -If `unroot` is false and if the root is up for deletion during the process, -it will be kept if it's of degree 2 or more. -A root node of degree 1 will be deleted unless `keeporiginalroot` is true. - -If `multgammas` is true: inheritance weights are kept by multiplying together -the inheritance γ's of edges that are merged. For example, -if there is a hybrid ladder, the partner hybrid edge remains a hybrid edge -(with a new partner), and its γ is the product of the two hybrid edges -that have been fused. So it won't add up to 1 with its new partner's γ. - -If `keeporiginalroot` is true, a root of degree one will not be deleted. - -Warnings: - -- `containRoot` is updated, but this requires correct `isChild1` fields -- if the parent of `edge` is the root and if `nofuse` is false, the root - is moved to keep the network unrooted with a root of degree two. -- does *not* update attributes needed for snaq! (like inCycle, edge.z, edge.y etc.) -""" -function deletehybridedge!(net::HybridNetwork, edge::Edge, - nofuse=false::Bool, unroot=false::Bool, - multgammas=false::Bool, - simplify=true::Bool, keeporiginalroot=false::Bool) - edge.hybrid || error("edge $(edge.number) has to be hybrid for deletehybridedge!") - n1 = getchild(edge) # child of edge, to be deleted unless nofuse - n1.hybrid || error("child node $(n1.number) of hybrid edge $(edge.number) should be a hybrid.") - n1degree = length(n1.edge) - n2 = getparent(edge) # parent of edge, to be deleted too - n2degree = length(n2.edge) - # next: keep hybrid node n1 if it has 4+ edges or if keepNode. - # otherwise: detach n1, then delete recursively - delete_n1_recursively = false - if n1degree < 3 - error("node $(n1.number) has $(length(n1.edge)) edges instead of 3+"); - # alternatively: error if degree < 2 or leaf, - # warning if degree=2 and internal node, then - # delete_n1_recursively = true # n1 doesn't need to be detached first - elseif n1degree == 3 && !nofuse # then fuse 2 of the edges and detach n1 - delete_n1_recursively = true - pe = nothing # will be other parent (hybrid) edge of n1 - ce = nothing # will be child edge of n1, to be merged with pe - for e in n1.edge - if e.hybrid && e!==edge && n1===getchild(e) pe = e; end - if !e.hybrid || n1===getparent(e) ce = e; end # does *not* assume correct isChild1 for tree edges :) - end - pn = getparent(pe); # parent node of n1, other than n2 - atRoot = (net.node[net.root] ≡ n1) # n1 should not be root, but if so, pn will be new root - # if pe may contain the root, then allow the root on ce and below - if pe.containRoot - allowrootbelow!(ce) # warning: assumes correct `isChild1` for ce and below - end - # next: replace ce by pe+ce, detach n1 from pe & ce, remove pe from network. - ce.length = addBL(ce.length, pe.length) - if multgammas - ce.gamma = multiplygammas(ce.gamma, pe.gamma) - end - removeNode!(n1,ce) # ce now has 1 single node cn - setNode!(ce,pn) # ce now has 2 nodes in this order: cn, pn - ce.isChild1 = true - setEdge!(pn,ce) - removeEdge!(pn,pe) - # if (pe.number x===pn, net.node) - i !== nothing || error("node $(pn.number) not in net!") - net.root = i - end - # below: we will need to delete n1 recursively (hence edge) - else # n1 has 4+ edges (polytomy) or 3 edges but we want to keep it anyway: - # keep n1 but detach it from 'edge', set its remaining parent to major tree edge - pe = getpartneredge(edge, n1) # partner edge: keep it this time - if !pe.isMajor pe.isMajor=true; end - pe.hybrid = false - # note: pe.gamma *not* set to 1.0 here - removeEdge!(n1,edge) # does not update n1.hybrid at this time - removeHybrid!(net,n1) # removes n1 from net.hybrid, updates net.numHybrids - n1.hybrid = false - if pe.containRoot - allowrootbelow!(pe) # warning: assumes correct `isChild1` for pe and below - end - # below: won't delete n1, delete edge instead - end - - formernumhyb = net.numHybrids - # next: delete n1 recursively, or delete edge and delete n2 recursively. - # keep n2 if it has 4+ edges (or if nofuse). 1 edge should never occur. - # If root, would have no parent: treat network as unrooted and change the root. - if delete_n1_recursively - deleteleaf!(net, n1.number; index=false, nofuse=nofuse, - simplify=simplify, unroot=unroot, multgammas=multgammas, - keeporiginalroot=keeporiginalroot) - # else: delete "edge" then n2 as appropriate - elseif n2degree == 1 - error("node $(n2.number) (parent of hybrid edge $(edge.number) to be deleted) has 1 edge only!") - else - # fixit: if n2degree == 2 && n2 === net.node[net.root] and - # if we want to keep original root: then delete edge but keep n2 - # detach n2 from edge, remove hybrid 'edge' from network - removeEdge!(n2,edge) - deleteEdge!(net,edge,part=false) - # remove n2 as appropriate later (recursively) - deleteleaf!(net, n2.number; index=false, nofuse=nofuse, - simplify=simplify, unroot=unroot, multgammas=multgammas, - keeporiginalroot=keeporiginalroot) - end - if net.numHybrids != formernumhyb # deleteleaf! does not update containRoot - allowrootbelow!(net) - end - return net -end - -# function to update net.partition after deleting a hybrid node -# needs a list of the edges in cycle -function undoPartition!(net::HybridNetwork, hybrid::Node, edgesInCycle::Vector{Edge}) - hybrid.hybrid || error("node $(hybrid.number) is not hybrid, and we need hybrid node inside deleteHybUpdate for undoPartition") - if(net.numHybrids == 0) - net.partition = Partition[] - else - cycles = Int[] - edges = Edge[] - N = length(net.partition) - i = 1 - while(i <= N) - @debug "hybrid number is $(hybrid.number) and partition is $([e.number for e in net.partition[i].edges]), with cycle $(net.partition[i].cycle)" - if(in(hybrid.number,net.partition[i].cycle)) - @debug "hybrid number matches with partition.cycle" - p = splice!(net.partition,i) - @debug "after splice, p partition has edges $([e.number for e in p.edges]) and cycle $(p.cycle)" - ind = findfirst(isequal(hybrid.number), p.cycle) - isnothing(ind) && error("hybrid not found in p.cycle") - deleteat!(p.cycle,ind) #get rid of that hybrid number - cycles = vcat(cycles,p.cycle) - edges = vcat(edges,p.edges) - @debug "edges is $([e.number for e in edges]) and cycles is $(cycles)" - N = length(net.partition) - else - i += 1 - end - end - for e in edgesInCycle - @debug "edge in cycle is $(e.number)" - if(isEdgeNumIn(e,net.edge)) #only include edge if still in net - @debug "edge is in net still" - push!(edges,e) - end - end - newPartition = Partition(unique(cycles),edges) - @debug "new partition with cycle $(newPartition.cycle), edges $([e.number for e in newPartition.edges])" - push!(net.partition,newPartition) - end -end - diff --git a/src/deprecated.jl b/src/deprecated.jl index 4fbc4bdf7..e41c1b511 100644 --- a/src/deprecated.jl +++ b/src/deprecated.jl @@ -1,36 +1,32 @@ -@deprecate readNexusTrees readnexus_treeblock - -@deprecate getChild getchild false -@deprecate getChildren getchildren false -@deprecate getChildEdge getchildedge false -@deprecate getParents getparents false -@deprecate getParent getparent false -@deprecate getMajorParent getparent false -@deprecate getMinorParent getparentminor false -@deprecate getMajorParentEdge getparentedge false -@deprecate getMinorParentEdge getparentedgeminor false -@deprecate getPartner getpartneredge false - -function Base.getproperty(mm::PhyloNetworkLinearModel, f::Symbol) - if f === :model - Base.depwarn("""accessing the 'model' field of PhyloNetworkLinearModel's is - deprecated, as they are no longer wrapped in a TableRegressionModel. - They can be used directly now.""", - :getproperty) # force=true to show warning. currently silent by default - return mm - elseif f === :mf - Base.depwarn("""accessing the 'mf' field of PhyloNetworkLinearModel's is - deprecated, as they are no longer wrapped in a TableRegressionModel. - Use `formula(m)` to access the model formula.""", :getproperty) - form = formula(mm) - return ModelFrame{Nothing, typeof(mm)}(form, nothing, nothing, typeof(mm)) - elseif f === :mm - Base.depwarn("""accessing the 'mm' field of PhyloNetworkLinearModel's is - deprecated, as they are no longer wrapped in a TableRegressionModel. - Use `modelmatrix(m)` to access the model matrix.""", :getproperty) - modmatr = modelmatrix(mm) - return ModelMatrix{typeof(modmatr)}(modmatr, Int[]) - else - return getfield(mm, f) - end -end \ No newline at end of file +@deprecate getHeights getnodeheights false +@deprecate recursion_preorder traversal_preorder false +@deprecate recursion_postorder traversal_postorder false +@deprecate readTopology readnewick +@deprecate readMultiTopology readmultinewick +@deprecate readBootstrapTrees readmultinewick_files +@deprecate writeTopology writenewick +@deprecate writeMultiTopology writemultinewick +# minor name changes: camelCase to smallcase +@deprecate printEdges printedges +@deprecate printNodes printnodes +@deprecate tipLabels tiplabels +@deprecate setGamma! setgamma! +@deprecate directEdges! directedges! +@deprecate hardwiredClusters hardwiredclusters +@deprecate hardwiredCluster hardwiredcluster +@deprecate hardwiredCluster! hardwiredcluster! +@deprecate hardwiredClusterDistance hardwiredclusterdistance +@deprecate biconnectedComponents biconnectedcomponents +@deprecate blobDecomposition! blobdecomposition! +@deprecate blobDecomposition blobdecomposition +@deprecate deleteHybridThreshold! deletehybridthreshold! +@deprecate displayedNetworkAt! displayednetworkat! +@deprecate displayedTrees displayedtrees +@deprecate minorTreeAt minortreeat +@deprecate majorTree majortree +@deprecate pairwiseTaxonDistanceMatrix pairwisetaxondistancematrix! +@deprecate sharedPathMatrix sharedpathmatrix +@deprecate descendenceMatrix descendencematrix +@deprecate getNodeAges getnodeages +@deprecate calibrateFromPairwiseDistances! calibratefrompairwisedistances! +@deprecate parsimonySoftwired parsimonysoftwired diff --git a/src/descriptive.jl b/src/descriptive.jl index a3d89f50a..d32e5d32b 100644 --- a/src/descriptive.jl +++ b/src/descriptive.jl @@ -2,161 +2,49 @@ # Claudia August 2015 """ - tipLabels(x) + tiplabels(x) - -Return a vector of taxon names at the leaves, for objects of various types: +Vector of taxon names at the leaves, defined for objects of various types: `HybridNetwork`, -Vector of `HybridNetwork`s (in which case the union is taken then sorted), -Vector of `Quartet`s, `DataCF`, -`TraitSimulation`, `MatrixTopologicalOrder`. +`MatrixTopologicalOrder`. For a network, the taxon names are coerced to strings. """ -function tipLabels(net::HybridNetwork) +function tiplabels(net::HybridNetwork) return String[l.name for l in net.leaf] # AbstractString does not work for use by tree2Matrix end - - -""" -`fittedQuartetCF(d::DataCF, format::Symbol)` - -return a data frame with the observed and expected quartet concordance factors -after estimation of a network with snaq(T,d). -The format can be :wide (default) or :long. - -- if wide, the output has one row per 4-taxon set, and each row has 10 columns: 4 columns - for the taxon names, 3 columns for the observed CFs and 3 columns for the expected CF. -- if long, the output has one row per quartet, i.e. 3 rows per 4-taxon sets, and 7 columns: - 4 columns for the taxon names, one column to give the quartet resolution, one column for - the observed CF and the last column for the expected CF. - -see also: `topologyQPseudolik!` and `topologyMaxQPseudolik!` to update the fitted CF expected -under a specific network, inside the DataCF object `d`. -""" -function fittedQuartetCF(d::DataCF, format=:wide::Symbol) - if format == :wide - df=DataFrame( - tx1 = [q.taxon[1] for q in d.quartet], - tx2 = [q.taxon[2] for q in d.quartet], - tx3 = [q.taxon[3] for q in d.quartet], - tx4 = [q.taxon[4] for q in d.quartet], - obsCF12=[q.obsCF[1] for q in d.quartet], - obsCF13=[q.obsCF[2] for q in d.quartet], - obsCF14=[q.obsCF[3] for q in d.quartet], - expCF12=[q.qnet.expCF[1] for q in d.quartet], - expCF13=[q.qnet.expCF[2] for q in d.quartet], - expCF14=[q.qnet.expCF[3] for q in d.quartet]) - elseif format == :long - nQ = length(d.quartet) - df = DataFrame( - tx1 = repeat([q.taxon[1] for q in d.quartet], inner=[3]), - tx2 = repeat([q.taxon[2] for q in d.quartet], inner=[3]), - tx3 = repeat([q.taxon[3] for q in d.quartet], inner=[3]), - tx4 = repeat([q.taxon[4] for q in d.quartet], inner=[3]), - quartet = repeat(["12_34","13_24","14_23"], outer=[nQ]), - obsCF = Array{Float64}(undef, 3*nQ), - expCF = Array{Float64}(undef, 3*nQ) ) - row = 1 - for i in 1:nQ - for j in 1:3 - df[row, 6] = d.quartet[i].obsCF[j] - df[row, 7] = d.quartet[i].qnet.expCF[j] - row += 1 - end - end - else - error("format $(format) was not recognized. Should be :wide or :long.") - end - return df -end - -""" -`setNonIdBL!(net)` - -Set non-identifiable edge branch lengths to -1.0 (i.e. missing) for a level-1 network `net`, -except for edges in - -- a good triangle: the edge below the hybrid is constrained to 0. -- a bad diamond II: the edge below the hybrid is constrained to 0 -- a bad diamond I: the edges across from the hybrid node have non identifiable lengths - but are kept, because the two γ*(1-exp(-t)) values are identifiable. - -will break if `inCycle` attributes are not initialized (at -1) or giving a correct node number. - -see [`Node`](@ref) for the meaning of boolean attributes -`isBadTriangle` (which corresponds to a "good" triangle above), -`isBadDiamondI` and `isBadDiamondII`. -""" -function setNonIdBL!(net::HybridNetwork) - for e in net.edge - if !e.istIdentifiable - keeplength = any(n -> (n.isBadDiamondII || n.isBadTriangle), e.node) - # if below 'bad' hybrid node, length=0 by constraint. If above, length estimated. - # next: keep length if edge across from hybrid node in bad diamond I. - if !keeplength && e.inCycle != -1 - hyb = net.node[getIndexNode(e.inCycle, net)] - if hyb.isBadDiamondI - keeplength |= !any(n -> (n==hyb), e.node) # only if e across hyb: no touching it - end - end - if !keeplength - e.length = -1.0 # not setLength, which does not allow too negative BLs - end - end - end -end - -""" -setBLGammaParsimony!(net::HybridNetwork) - -Maximum parsimony function does not provide estimates for branch lengths, or gamma. -But since the `maxParsimonyNet` function is using snaq move functions, branch lengths -and gamma values are set randomly (to initialize optimization). -We need to remove these random values before returning the maximum parsimony network. -""" -function setBLGammaParsimony!(net::HybridNetwork) - for e in net.edge - e.length = -1.0 - if e.hybrid - e.gamma = -1.0 - end - end -end - - # function that we need to overwrite to avoid printing useless scary # output for HybridNetworks -# PROBLEM: writeTopology changes the network and thus show changes the network +# PROBLEM: writenewick changes the network and thus show changes the network function Base.show(io::IO, obj::HybridNetwork) disp = "$(typeof(obj)), " - if obj.isRooted + if obj.isrooted disp = disp * "Rooted Network" else - disp = disp * "Un-rooted Network" + disp = disp * "Semidirected Network" end - disp = disp * "\n$(obj.numEdges) edges\n" - disp = disp * "$(obj.numNodes) nodes: $(obj.numTaxa) tips, " - disp = disp * "$(obj.numHybrids) hybrid nodes, " - disp = disp * "$(obj.numNodes - obj.numTaxa - obj.numHybrids) internal tree nodes.\n" + disp = disp * "\n$(obj.numedges) edges\n" + disp = disp * "$(obj.numnodes) nodes: $(obj.numtaxa) tips, " + disp = disp * "$(obj.numhybrids) hybrid nodes, " + disp = disp * "$(obj.numnodes - obj.numtaxa - obj.numhybrids) internal tree nodes.\n" tipslabels = [n.name for n in obj.leaf] if length(tipslabels) > 1 || !all(tipslabels .== "") disptipslabels = "$(tipslabels[1])" - for i in 2:min(obj.numTaxa, 4) + for i in 2:min(obj.numtaxa, 4) disptipslabels = disptipslabels * ", $(tipslabels[i])" end - if obj.numTaxa > 4 disptipslabels = disptipslabels * ", ..." end + if obj.numtaxa > 4 disptipslabels = disptipslabels * ", ..." end disp *= "tip labels: " * disptipslabels end par = "" try - # par = writeTopology(obj,round=true) # but writeTopology changes the network, not good + # par = writenewick(obj,round=true) # but writenewick changes the network, not good s = IOBuffer() - writeSubTree!(s, obj, false,true, true,3,true) + writesubtree!(s, obj, false,true, true,3,true) par = String(take!(s)) catch err - println("ERROR with writeSubTree!:") + println("ERROR with writesubtree!:") showerror(stdout, err) println("Trying writeTopologyLevel1") par = writeTopologyLevel1(obj) @@ -165,33 +53,7 @@ function Base.show(io::IO, obj::HybridNetwork) println(io, disp) end -# and QuartetNetworks (which cannot be just written because they do not have root) -function Base.show(io::IO, net::QuartetNetwork) - print(io,"taxa: $(net.quartetTaxon)\n") - print(io,"number of hybrid nodes: $(net.numHybrids)\n") - if(net.split != [-1,-1,-1,-1]) - print(io,"split: $(net.split)\n") - end -end -function Base.show(io::IO,d::DataCF) - print(io,"Object DataCF\n") - print(io,"number of quartets: $(d.numQuartets)\n") - if(d.numTrees != -1) - print(io,"number of trees: $(d.numTrees)\n") - end -end - -function Base.show(io::IO,q::Quartet) - print(io,"number: $(q.number)\n") - print(io,"taxon names: $(q.taxon)\n") - print(io,"observed CF: $(q.obsCF)\n") - print(io,"pseudo-deviance under last used network: $(q.logPseudoLik) (meaningless before estimation)\n") - print(io,"expected CF under last used network: $(q.qnet.expCF) (meaningless before estimation)\n") - if(q.ngenes != -1) - print(io,"number of genes used to compute observed CF: $(q.ngenes)\n") - end -end function Base.show(io::IO, obj::Node) disp = "$(typeof(obj)):" @@ -209,16 +71,16 @@ function Base.show(io::IO, obj::Edge) disp *= "\n number:$(obj.number)" disp *= "\n length:$(obj.length)" if (obj.hybrid) - disp *= "\n " * (obj.isMajor ? "major" : "minor") + disp *= "\n " * (obj.ismajor ? "major" : "minor") disp *= " hybrid edge with gamma=$(obj.gamma)" - elseif (!obj.isMajor) + elseif (!obj.ismajor) disp *= "\n minor tree edge" end disp *= "\n attached to $(length(obj.node)) node(s) (parent first):" if (length(obj.node)==1) disp *= " $(obj.node[1].number)"; elseif (length(obj.node)==2) - disp *= " $(obj.node[obj.isChild1 ? 2 : 1].number)" - disp *= " $(obj.node[obj.isChild1 ? 1 : 2].number)" + disp *= " $(obj.node[obj.ischild1 ? 2 : 1].number)" + disp *= " $(obj.node[obj.ischild1 ? 1 : 2].number)" end println(io, disp) end diff --git a/src/generate_topology.jl b/src/generate_topology.jl index 809efbdf7..24442ddf9 100644 --- a/src/generate_topology.jl +++ b/src/generate_topology.jl @@ -13,9 +13,9 @@ end String for the Newick parenthetical description of a symmetric tree with 2^n tips, numbered from i to i+2^n-1. All branch lengths are set equal to `ell`. -The tree can be created later by reading the string with [`readTopology`](@ref). +The tree can be created later by reading the string with [`readnewick`](@ref). """ -function symmetrictree_newick(n::Int, ell::Real, i=1::Int) +function symmetrictree_newick(n::Int, ell::Real, i::Int=1) tree = "A$(i-1+2^n):$(ell)" if n==0 return("("*"A$(i-1+2^n):0"*");") end for k in 1:(n-1) @@ -73,7 +73,7 @@ with a symmetric major tree, whose branch lengths are all equal. 2^(n-h) hybrids are added from level h to h-1 "symmetrically". The network is time-consistent and ultrametric, with a total height of 1. """ -function symmetricnet_newick(n::Int, h::Int, gamma::Real, i=1::Int) +function symmetricnet_newick(n::Int, h::Int, gamma::Real, i::Int=1) (n < h || h < 2) && error("must have n >= h > 1.") # length of branch ell = 1.0/n diff --git a/src/graph_components.jl b/src/graph_components.jl index 0e38044a6..f09e70444 100644 --- a/src/graph_components.jl +++ b/src/graph_components.jl @@ -1,5 +1,5 @@ """ - biconnectedComponents(network, ignoreTrivial=false) + biconnectedcomponents(network, ignoreTrivial=false) Calculate biconnected components (aka "blobs") using Tarjan's algorithm. @@ -13,11 +13,11 @@ If `ignoreTrivial` is true, trivial components (of a single edge) are not returned. The network is assumed to be connected. -*Warnings*: for nodes, fields `k` and `inCycle` +*Warnings*: for nodes, fields `k` and `intn1` are modified during the algorithm. They are used to store the node's "index" (time of visitation), "lowpoint", and the node's "parent", as defined by the order in which nodes are visited. -For edges, field `fromBadDiamondI` is modified, to store whether +For edges, field `boole2` is modified, to store whether the edge has been already been visited or not. References: @@ -32,57 +32,57 @@ References: - nice explanation at this [url](https://www.cs.cmu.edu/~avrim/451f12/lectures/biconnected.pdf) """ -function biconnectedComponents(net, ignoreTrivial=false::Bool) +function biconnectedcomponents(net, ignoreTrivial::Bool=false) for n in net.node - n.inCycle = -1 # inCycle = lowpoint. -1 for missing, until the node is visited - n.k = -1 # k = index, order of visit during depth-first search + n.intn1 = -1 # intn1 = lowpoint. -1 for missing, until the node is visited + n.intn2 = -1 # k = index, order of visit during depth-first search end for e in net.edge - e.fromBadDiamondI = false # true after edge is visited, during depth-first search + e.boole2 = false # true after edge is visited, during depth-first search end S = Edge[] # temporary stack blobs = Vector{Edge}[] # will contain the blobs - biconnectedComponents(net.node[net.root], [0], S, blobs, ignoreTrivial) + biconnectedcomponents(net.node[net.rooti], [0], S, blobs, ignoreTrivial) # if stack not empty: create last connected component length(S) == 0 || @error("stack of edges not empty at the end: $S") return blobs end """ - biconnectedComponents(node, index, S, blobs, ignoreTrivial) + biconnectedcomponents(node, index, S, blobs, ignoreTrivial) Helper recursive function starting at a node (not a network). `index` is an array containing a single integer, thus mutable: order in which nodes are visited. """ -function biconnectedComponents(node, index, S, blobs, ignoreTrivial) +function biconnectedcomponents(node, index, S, blobs, ignoreTrivial) #println("\nentering biconnect, index=$(index[1])") children = 0 # set depth index for v to the smallest unused index - node.k = index[1] # index / disc - node.inCycle = index[1] # lowpoint / lowlink - #println(" for node $(node.number): k=$(node.k), low=$(node.inCycle)") + node.intn2 = index[1] # index / disc + node.intn1 = index[1] # lowpoint / lowlink + #println(" for node $(node.number): k=$(node.intn2), low=$(node.intn1)") index[1] += 1 #print(" stack: "); @show [e.number for e in S] for e in node.edge # each (v, w) in E do w = (e.node[1] == node) ? e.node[2] : e.node[1] #println(" w: $(w.number) along edge $(e.number)") - if w.k == -1 # w not yet visited, therefore e not yet visited either + if w.intn2 == -1 # w not yet visited, therefore e not yet visited either #println(" w's parent = $(node.number)") - e.fromBadDiamondI = true + e.boole2 = true children += 1 push!(S, e) #println(" edge $(e.number) on stack, intermediate step for node=$(node.number)") - biconnectedComponents(w, index, S, blobs, ignoreTrivial) + biconnectedcomponents(w, index, S, blobs, ignoreTrivial) # check if subtree rooted at w has connection to # one of the ancestors of node # Case 1 -- per Strongly Connected Components Article - node.inCycle = min(node.inCycle, w.inCycle) # lowpoint - #print(" case 1, low=$(node.inCycle) for node $(node.number); ") - #println("low=$(w.inCycle) for w $(w.number)") + node.intn1 = min(node.intn1, w.intn1) # lowpoint + #print(" case 1, low=$(node.intn1) for node $(node.number); ") + #println("low=$(w.intn1) for w $(w.number)") # if node is an articulation point: pop until e - if w.inCycle >= node.k + if w.intn1 >= node.intn2 # @info "found root or articulation: node number $(node.number), entry to new blob." # start a new strongly connected component bb = Edge[] @@ -96,11 +96,11 @@ function biconnectedComponents(node, index, S, blobs, ignoreTrivial) push!(blobs, bb) end end - elseif !e.fromBadDiamondI && node.k > w.k + elseif !e.boole2 && node.intn2 > w.intn2 # e is a back edge, not cross edge. Case 2 in article. - e.fromBadDiamondI = true - node.inCycle = min(node.inCycle, w.k) - #println(" case 2, node $(node.number): low=$(node.inCycle)") + e.boole2 = true + node.intn1 = min(node.intn1, w.intn2) + #println(" case 2, node $(node.number): low=$(node.intn1)") push!(S, e) #println(" edge $(e.number) now on stack, final step for node $(node.number)") else @@ -115,15 +115,15 @@ end Array containing the entry node of the each biconnected component in `bcc`. `bcc` is supposed to contain the biconnected components as output by -[`biconnectedComponents`](@ref), that is, an array of array of edges. +[`biconnectedcomponents`](@ref), that is, an array of array of edges. These entry nodes depend on the rooting (whereas the BCC only depend on the unrooted graph). They are either the root of the network or cut node (articulation points). """ -function biconnectedcomponent_entrynodes(net, bcc, preorder=true::Bool) +function biconnectedcomponent_entrynodes(net, bcc, preorder::Bool=true) if preorder - directEdges!(net) + directedges!(net) preorder!(net) end entrynode = Node[] # one entry node for each blob: cut node or root @@ -131,11 +131,11 @@ function biconnectedcomponent_entrynodes(net, bcc, preorder=true::Bool) jmin = length(net.node) for edge in bicomp n = getparent(edge) - j = findfirst(x -> x===n, net.nodes_changed) - isnothing(j) && error("node not found in net's pre-ordering 'nodes_changed'") + j = findfirst(x -> x===n, net.vec_node) + isnothing(j) && error("node not found in net's pre-ordering 'vec_node'") jmin = min(j, jmin) end - push!(entrynode, net.nodes_changed[jmin]) + push!(entrynode, net.vec_node[jmin]) end return entrynode end @@ -145,36 +145,36 @@ end Array containing an array of the exit node(s) of the each biconnected component in `bcc`. `bcc` is supposed to contain the biconnected components as output by -[`biconnectedComponents`](@ref), that is, an array of array of edges. +[`biconnectedcomponents`](@ref), that is, an array of array of edges. These exit nodes depend on the rooting (whereas the BCC only depend on the unrooted graph). The degree of a blob is the number of exit nodes + 1 if the blob doesn't contain the root (its entry node is a cut node), or + 0 if the blob contains the root (which enters into the blob but isn't a cut node). -*Warning* (or positive side effect?): the edge `.inCycle` attribute is modified. +*Warning* (or positive side effect?): the edge `.inte1` attribute is modified. It stores the index (in `bcc`) of the biconnected component that an edge belongs to. If an edge doesn't belong in any (e.g. if trivial blobs are ignored), -then its `.inCycle` is set to -1. +then its `.inte1` is set to -1. """ -function biconnectedcomponent_exitnodes(net, bcc, preorder=true::Bool) +function biconnectedcomponent_exitnodes(net, bcc, preorder::Bool=true) if preorder - directEdges!(net) + directedges!(net) preorder!(net) end exitnode = Vector{Node}[] # one array of exit cut nodes for each blob - for edge in net.edge edge.inCycle = -1; end # in case trivial blobs are ignored + for edge in net.edge edge.inte1 = -1; end # in case trivial blobs are ignored for (i,bicomp) in enumerate(bcc) - for edge in bicomp edge.inCycle = i; end + for edge in bicomp edge.inte1 = i; end end for (i,bicomp) in enumerate(bcc) exitnode_blobi = Node[] for edge in bicomp - edge.isMajor || continue # skip minor edges to avoid duplicating exit node + edge.ismajor || continue # skip minor edges to avoid duplicating exit node n = getchild(edge) for e in n.edge e !== edge || continue - if e.inCycle != i # then n is a cut point, incident to another blob + if e.inte1 != i # then n is a cut point, incident to another blob push!(exitnode_blobi, n) break end @@ -186,11 +186,11 @@ function biconnectedcomponent_exitnodes(net, bcc, preorder=true::Bool) end """ - blobInfo(network, ignoreTrivial=true) + blobinfo(network, ignoreTrivial=true) Calculate the biconnected components (blobs) using function -[`biconnectedComponents`](@ref) then: -- set node field `isExtBadTriangle` to true at the root of each +[`biconnectedcomponents`](@ref) then: +- set node field `booln4` to true at the root of each non-trivial blob (and at the network root), false otherwise. (a better name for the field would be something like "isBlobRoot".) - output: @@ -207,20 +207,23 @@ Blobs are ordered in reverse topological ordering (aka post order). If `ignoreTrivial` is true, trivial components are ignored. -keyword argument: `checkPreorder`, true by default. If false, -the `isChild1` edge field and the `net.nodes_changed` network field +keyword argument: `checkpreorder`, true by default. If false, +the `ischild1` edge field and the `net.vec_node` network field are supposed to be correct. -**warning**: see [`biconnectedComponents`](@ref) for node +**warning**: see [`biconnectedcomponents`](@ref) for node attributes modified during the algorithm. """ -function blobInfo(net, ignoreTrivial=true::Bool; - checkPreorder=true::Bool) - if checkPreorder - directEdges!(net) # update isChild1, needed for preorder - preorder!(net) # creates / updates net.nodes_changed +function blobinfo( + net, + ignoreTrivial::Bool=true; + checkpreorder::Bool=true +) + if checkpreorder + directedges!(net) # update ischild1, needed for preorder + preorder!(net) # creates / updates net.vec_node end - bcc = biconnectedComponents(net, ignoreTrivial) + bcc = biconnectedcomponents(net, ignoreTrivial) bccRoots = biconnectedcomponent_entrynodes(net, bcc, false) # 1 entry node for each blob bccMajor = Vector{Edge}[] # one array for each blob bccMinor = Vector{Edge}[] @@ -228,10 +231,10 @@ function blobInfo(net, ignoreTrivial=true::Bool; bccMa = Edge[] bccmi = Edge[] # find minor hybrid edges, in same order for edge in bicomp - if edge.hybrid && edge.isMajor + if edge.hybrid && edge.ismajor push!(bccMa, edge) e = getpartneredge(edge) - !e.isMajor || @warn "major edge $(edge.number) has a major partner: edge $(e.number)" + !e.ismajor || @warn "major edge $(edge.number) has a major partner: edge $(e.number)" push!(bccmi, e) end end @@ -245,19 +248,19 @@ function blobInfo(net, ignoreTrivial=true::Bool; push!(bccMajor, Edge[]) push!(bccMinor, Edge[]) end - # update `isExtBadTriangle` to mark nodes that are blob roots: + # update `booln4` to mark nodes that are blob roots: # these nodes will serve as dummy leaves when reached from other blobs - for n in net.node n.isExtBadTriangle = false; end - for r in bccRoots r.isExtBadTriangle = true; end + for n in net.node n.booln4 = false; end + for r in bccRoots r.booln4 = true; end return(bccRoots, bccMajor, bccMinor) end """ - blobDecomposition!(network) - blobDecomposition(network) + blobdecomposition!(network) + blobdecomposition(network) -Find blobs using [`biconnectedComponents`](@ref); find their roots -using [`blobInfo`](@ref); create a forest in the form of a +Find blobs using [`biconnectedcomponents`](@ref); find their roots +using [`blobinfo`](@ref); create a forest in the form of a disconnected network (for efficiency), by deconnecting the root of each non-trivial blob from its parent. The root of each blob corresponds to a new leaf @@ -270,23 +273,23 @@ then returns a tuple: the forest and the array of blob roots. Warnings: - the forest is represented by a single HybridNetwork object, - on which most functions don't work (like `writeTopology`, plotting etc.) + on which most functions don't work (like `writenewick`, plotting etc.) because the network is disconnected (to make the forest). - Revert back to low-level functions, e.g. `printEdges` and `printNodes`. -- see [`biconnectedComponents`](@ref) for node + Revert back to low-level functions, e.g. `printedges` and `printnodes`. +- see [`biconnectedcomponents`](@ref) for node attributes modified during the algorithm. """ -function blobDecomposition(net) +function blobdecomposition(net) net2 = deepcopy(net) - blobR = blobDecomposition!(net2) + blobR = blobdecomposition!(net2) return net2, blobR end -function blobDecomposition!(net) +function blobdecomposition!(net) nextnumber = maximum([n.number for n in net.node])+1 - blobR, tmp, tmp = blobInfo(net, true) # true: ignore trivial single-edge blobs + blobR, tmp, tmp = blobinfo(net, true) # true: ignore trivial single-edge blobs for r in blobR for e in r.edge - r == e.node[e.isChild1 ? 1 : 2] || continue + r == e.node[e.ischild1 ? 1 : 2] || continue removeEdge!(r,e) # detach edge e from root r removeNode!(r,e) # detach root r from edge e dummyleaf = Node(nextnumber, true) # true: leaf @@ -294,7 +297,7 @@ function blobDecomposition!(net) dummyleaf.name = string("dummy ", r.number) setEdge!(dummyleaf, e) # attach e to new dummy leaf setNode!(e,dummyleaf) # attach new leaf to edge e - e.isChild1 = false + e.ischild1 = false pushNode!(net, dummyleaf) break end @@ -303,10 +306,10 @@ function blobDecomposition!(net) end """ - leaststableancestor(net, preorder=true::Bool) + leaststableancestor(net, preorder=true) Return `(lsa, lsa_index)` where `lsa` is the least stable ancestor node (LSA) -in `net`, and `lsa_index` is the index of `lsa` in `net.nodes_changed`. +in `net`, and `lsa_index` is the index of `lsa` in `net.vec_node`. The LSA the lowest node `n` with the following property: *any* path between *any* leaf and the root must go through `n`. All such nodes with this property are ancestral to the LSA (and therefore must have an index that is @@ -316,23 +319,23 @@ Exception: if the network has a single leaf, the output `lsa` is the leaf's parent node, to maintain one external edge between the root and the leaf. *Warning*: -uses [`biconnectedComponents`](@ref) and [`biconnectedcomponent_exitnodes`](@ref), +uses [`biconnectedcomponents`](@ref) and [`biconnectedcomponent_exitnodes`](@ref), therefore share the same caveats regarding the use of -fields `.inCycle` (for edges and nodes), `.k` (for nodes) etc. +fields `.inte1` and `.intn1` (for edges and nodes), `.intn2` (for nodes) etc. As a positivie side effect, the biconnected components can be recovered -via the edges' `.inCycle` field --including the trivial blobs (cut edges). +via the edges' `.inte1` field --including the trivial blobs (cut edges). See also: [`deleteaboveLSA!`](@ref) """ -function leaststableancestor(net, preorder=true::Bool) - net.node[net.root].leaf && error("The root can't be a leaf to find the LSA.") +function leaststableancestor(net, preorder::Bool=true) + net.node[net.rooti].leaf && error("The root can't be a leaf to find the LSA.") if preorder - directEdges!(net) + directedges!(net) preorder!(net) end - bcc = biconnectedComponents(net, false) + bcc = biconnectedcomponents(net, false) entry = biconnectedcomponent_entrynodes(net, bcc, false) - entryindex = indexin(entry, net.nodes_changed) + entryindex = indexin(entry, net.vec_node) exitnodes = biconnectedcomponent_exitnodes(net, bcc, false) bloborder = sortperm(entryindex) # pre-ordering for blobs in their own blob tree function atlsa(ib) # is bcc[ib] below the LSA? @@ -426,13 +429,13 @@ end checkroot!(net) checkroot!(net::HybridNetwork, membership::Dict{Node, Int}) -Set the root of `net` to an appropriate node and update the edges `containRoot` +Set the root of `net` to an appropriate node and update the edges `containroot` field appropriately, using the `membership` output by [`treeedgecomponents`](@ref). A node is appropriate to serve as root if it belongs in the root tree-edge component, that is, the root of the tree-edge component graph. - If the current root is appropriate, it is left as is. The direction of - edges (via `isChild1`) is also left as is, assuming it was in synch with + edges (via `ischild1`) is also left as is, assuming it was in synch with the existing root. - Otherwise, the root is set to the first appropriate node in `net.node`, that is not a leaf. Then edges are directed away from this root. @@ -447,7 +450,7 @@ Warning: only use the output component ID after calling the second version `checkroot!(net, membership)`. ```jldoctest -julia> net = readTopology("(#H1:::0.1,#H2:::0.2,(((b)#H1)#H2,a));"); +julia> net = readnewick("(#H1:::0.1,#H2:::0.2,(((b)#H1)#H2,a));"); julia> membership = treeedgecomponents(net); @@ -478,7 +481,7 @@ function checkroot!(net::HybridNetwork, membership::Dict{Node,Int}) noparent = trues(ncomp) # will stay true for TECs with no parent for e in net.edge e.hybrid || continue # skip tree edges - up, down = e.isChild1 ? (e.node[2], e.node[1]) : (e.node[1], e.node[2]) + up, down = e.ischild1 ? (e.node[2], e.node[1]) : (e.node[1], e.node[2]) uc_up, uc_down = membership[up], membership[down] noparent[uc_down] = false push!(tecG[uc_up], uc_down) @@ -519,20 +522,20 @@ function checkroot!(net::HybridNetwork, membership::Dict{Node,Int}) """Semidirected cycle exists, starting at TEC containing node number $(nodes[findfirst(n -> membership[n] == cyclehead, nodes)].number)""")) # 4. original network: reset the network root if needed, - # and update the edges' containRoot accordingly. + # and update the edges' containroot accordingly. # NOT done: build the root component to return it. Instead: return tec_root # Set(node for node = nodes if membership[node] == tec_root) # Set(node for (node,comp) in membership if comp == tec_root) #rootcomp = keys(filter(p -> p.second == tec_root, membership)) - curroot = nodes[net.root] + curroot = nodes[net.rooti] if membership[curroot] == tec_root - # update containRoot only: true for edges in or out of the root TEC + # update containroot only: true for edges in or out of the root TEC for e in net.edge - e.containRoot = (membership[getparent(e)] == tec_root) + e.containroot = (membership[getparent(e)] == tec_root) end else - net.root = findfirst(n -> (!n.leaf && membership[n] == tec_root), nodes) - directEdges!(net) # also updates containRoot of all edges + net.rooti = findfirst(n -> (!n.leaf && membership[n] == tec_root), nodes) + directedges!(net) # also updates containroot of all edges end return tec_root # return rootcomp end diff --git a/src/interop.jl b/src/interop.jl index ef0800a41..031e19798 100644 --- a/src/interop.jl +++ b/src/interop.jl @@ -9,7 +9,7 @@ Used for branch lengths and γs. `x` needs to accept missing values. If not, this can be done with `allowmissing(x)`. """ @inline function makemissing!(x::AbstractVector) - for i in 1:length(x) + for i in eachindex(x) if x[i] == -1.0 x[i] = missing end @@ -21,14 +21,14 @@ end Matrix of major edges from `net` where edge[i,1] is the number of the parent node of edge i and edge[i,2] is the number of the child node of edge i. -Assume `nodes_changed` was updated, to list nodes in pre-order. +Assume `vec_node` was updated, to list nodes in pre-order. # Examples ```jldoctest -julia> net = readTopology("(A,(B,(C,D)));"); +julia> net = readnewick("(A,(B,(C,D)));"); -julia> PhyloNetworks.resetNodeNumbers!(net); +julia> PhyloNetworks.resetnodenumbers!(net); julia> PhyloNetworks.majoredgematrix(net) 6×2 Matrix{Int64}: @@ -43,13 +43,13 @@ julia> PhyloNetworks.majoredgematrix(net) function majoredgematrix(net::HybridNetwork) edge = Matrix{Int}(undef, length(net.edge)-length(net.hybrid), 2) # major edges i = 1 #row index for edge matrix - for n in net.nodes_changed # topological pre-order + for n in net.vec_node # topological pre-order !n.leaf || continue # skip leaves: associate node with children edges for e in n.edge - if e.node[e.isChild1 ? 2 : 1] == n && e.isMajor + if e.node[e.ischild1 ? 2 : 1] == n && e.ismajor #exclude parent edge and minor hybrid edges edge[i,1] = n.number # parent - edge[i,2] = e.node[e.isChild1 ? 1 : 2].number # child + edge[i,2] = e.node[e.ischild1 ? 1 : 2].number # child i += 1 end end @@ -65,14 +65,14 @@ as the `edge` matrix created via `majoredgematrix`. Considers values of `-1.0` a missing values, recognized as NA in `R`. Output: vector allowing for missing values. -Assume `nodes_changed` was updated, to list nodes in pre-order. +Assume `vec_node` was updated, to list nodes in pre-order. # Examples ```jldoctest -julia> net = readTopology("(((A:3.1,(B:0.2)#H1:0.3::0.9),(C,#H1:0.3::0.1):1.1),D:0.7);"); +julia> net = readnewick("(((A:3.1,(B:0.2)#H1:0.3::0.9),(C,#H1:0.3::0.1):1.1),D:0.7);"); -julia> directEdges!(net); preorder!(net); +julia> directedges!(net); preorder!(net); julia> PhyloNetworks.majoredgelength(net) 8-element Vector{Union{Missing, Float64}}: @@ -89,10 +89,10 @@ julia> PhyloNetworks.majoredgelength(net) function majoredgelength(net::HybridNetwork) edgeLength = Array{Union{Float64,Missing}}(undef, length(net.edge)-length(net.hybrid)) i=1 - for n in net.nodes_changed # topological pre-order + for n in net.vec_node # topological pre-order if !n.leaf for e in n.edge # for parent major edge below - if e.node[e.isChild1 ? 2 : 1] == n && e.isMajor + if e.node[e.ischild1 ? 2 : 1] == n && e.ismajor edgeLength[i] = e.length i=i+1 end @@ -110,13 +110,13 @@ end Matrix of integers, representing the minor hybrid edges in `net`. edge[i,1] is the number of the parent node of the ith minor hybrid edge, and edge[i,2] is the number of its child node. -Node numbers may be negative, unless they were modified by `resetNodeNumbers!`. -Assumes correct `isChild1` fields. +Node numbers may be negative, unless they were modified by `resetnodenumbers!`. +Assumes correct `ischild1` fields. # Examples ```julia-repl -julia> net = readTopology("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);"); +julia> net = readnewick("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);"); julia> PhyloNetworks.minorreticulationmatrix(net) 1×2 Matrix{Int64}: -6 3 @@ -126,7 +126,7 @@ function minorreticulationmatrix(net::HybridNetwork) reticulation = Matrix{Int}(undef, length(net.hybrid), 2) # initialize j = 1 # row index, row = reticulate edge for e in net.edge - if !e.isMajor # minor (hybrid) edges only + if !e.ismajor # minor (hybrid) edges only reticulation[j,1] = getparent(e).number reticulation[j,2] = getchild(e).number j += 1 @@ -146,7 +146,7 @@ Output: vector allowing for missing values. # Examples ```jldoctest -julia> net = readTopology("(((A:3.1,(B:0.2)#H1:0.4::0.9),(C,#H1:0.3::0.1):1.1),D:0.7);"); +julia> net = readnewick("(((A:3.1,(B:0.2)#H1:0.4::0.9),(C,#H1:0.3::0.1):1.1),D:0.7);"); julia> PhyloNetworks.minorreticulationlength(net) 1-element Vector{Union{Missing, Float64}}: @@ -156,7 +156,7 @@ julia> PhyloNetworks.minorreticulationlength(net) function minorreticulationlength(net::HybridNetwork) reticulationLength = Vector{Union{Float64,Missing}}(undef, 0) # initialize for e in net.edge - if !e.isMajor #find minor hybrid edge + if !e.ismajor #find minor hybrid edge push!(reticulationLength, e.length) end end @@ -175,7 +175,7 @@ Output: vector allowing for missing values. # Examples ```julia-repl -julia> net = readTopology("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);"); +julia> net = readnewick("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);"); julia> PhyloNetworks.minorreticulationgamma(net) 1-element Vector{Union{Float64, Missings.Missing}}: @@ -185,7 +185,7 @@ julia> PhyloNetworks.minorreticulationgamma(net) function minorreticulationgamma(net::HybridNetwork) reticulationGamma = Vector{Union{Float64,Missing}}(undef, 0) #initialize for e in net.edge - if !e.isMajor # minor hybrid edges only + if !e.ismajor # minor hybrid edges only push!(reticulationGamma, e.gamma) end end diff --git a/src/manipulateNet.jl b/src/manipulateNet.jl index 6be9578b5..5eeadec3a 100644 --- a/src/manipulateNet.jl +++ b/src/manipulateNet.jl @@ -1,242 +1,14 @@ -""" - undirectedOtherNetworks(net::HybridNetwork) - -Return a vector of HybridNetwork objects, obtained by switching the placement -of each hybrid node to other nodes inside its cycle. This amounts to changing -the direction of a gene flow event (recursively to move around the whole cycle -of each reticulation). - -Optional argument: `outgroup`, as a String. If an outgroup is specified, -then networks conflicting with the placement of the root are avoided. - -Assumptions: `net` is assumed to be of level 1, that is, each blob has a -single cycle with a single reticulation. -All level-1 fields of `net` are assumed up-to-date. -# Example -```julia -julia> net = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); -julia> vnet = undirectedOtherNetworks(net) -``` -""" -function undirectedOtherNetworks(net0::HybridNetwork; outgroup="none"::AbstractString, insideSnaq=false::Bool) -# extra optional argument: "insideSnaq". When true, all level1-attributes are assumed up-to-date -# So far, undirectedOtherNetworks is called inside optTopRuns only -# Potential bug: if new node is -1, then inCycle will become meaningless: changed in readSubTree here -# WARNING: does not update partition, because only thing to change is hybrid node number - if !insideSnaq - net0 = readTopologyLevel1(writeTopologyLevel1(net0)) - end - otherNet = HybridNetwork[] - for i in 1:net0.numHybrids #need to do for by number, not node - net = deepcopy(net0) # to avoid redoing attributes after each cycle is finished - ## undo attributes at current hybrid node: - hybrid = net.hybrid[i] - nocycle, edgesInCycle, nodesInCycle = identifyInCycle(net,hybrid); - @debug "nodesInCycle are: $([n.number for n in nodesInCycle])" - !nocycle || error("the hybrid node $(hybrid.number) does not create a cycle") - edgesRoot = identifyContainRoot(net,hybrid); - edges = hybridEdges(hybrid); - undoGammaz!(hybrid,net); - othermaj = getOtherNode(edges[1],hybrid) - edgesmaj = hybridEdges(othermaj) - if edgesmaj[3].containRoot #if containRoot=true, then we need to undo - undoContainRoot!(edgesRoot); - end - ## changes to new hybrid node: - for newn in nodesInCycle - if newn.number != hybrid.number # nodesInCycle contains the hybrid too - newnet = deepcopy(net) - newnocycle, newedgesInCycle, newnodesInCycle = identifyInCycle(newnet,newnet.hybrid[i]); - !newnocycle || error("the hybrid node $(newnet.hybrid[i].number) does not create a cycle") - ind = getIndexNode(newn.number,newnet) # find the newn node in the new network - @debug "moving hybrid to node $(newnet.node[ind].number)" - hybridatnode!(newnet, newnet.hybrid[i], newnet.node[ind]) - @debug begin printEdges(newnet); "printed edges" end - @debug begin printNodes(newnet); "printed nodes" end - undoInCycle!(newedgesInCycle, newnodesInCycle); - @debug begin printEdges(newnet); "printed edges" end - @debug begin printNodes(newnet); "printed nodes" end - ##undoPartition!(net,hybrid, edgesInCycle) - success, hybrid0, flag, nocycle, flag2, flag3 = updateAllNewHybrid!(newnet.node[ind], newnet, false,false,false) - if success - @debug "successfully added new network: $(writeTopologyLevel1(newnet))" - push!(otherNet,newnet) - else - println("the network obtained by putting the new hybrid in node $(newnet.node[ind].number) is not good, inCycle,gammaz,containRoot: $([flag,flag2,flag3]), we will skip it") - end - end - end - end - # check root in good position - if outgroup == "none" - for n in otherNet - !isTree(n) && checkRootPlace!(n, verbose=false) - end - return otherNet - else ## root already in good place - @debug "we will remove networks contradicting the outgroup in undirectedOtherNetworks" - whichKeep = ones(Bool,length(otherNet)) # repeats 'true' - i = 1 - for n in otherNet - if !isTree(n) - try - checkRootPlace!(n, verbose=true, outgroup=outgroup) - catch - @debug "found one network incompatible with outgroup" - @debug "$(writeTopologyLevel1(n))" - whichKeep[i] = false - end - end - i = i+1; - end - return otherNet[whichKeep] - end -end - -""" - hybridatnode!(net::HybridNetwork, nodeNumber::Integer) - -Change the direction and status of edges in network `net`, -to move the hybrid node in a cycle to the node with number `nodeNumber`. -This node must be in one (and only one) cycle, otherwise an error will be thrown. -Check and update the nodes' field `inCycle`. - -Output: `net` after hybrid modification. - -Assumption: `net` must be of level 1, that is, each blob has a -single cycle with a single reticulation. - -# example - -```julia -net = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); -using PhyloPlots -plot(net, shownodenumber=true); # to locate nodes and their numbers. D of hybrid origin -hybridatnode!(net, -4) -plot(net, shownodenumber=true); # hybrid direction reversed: now 2B of hybrid origin -``` -""" -function hybridatnode!(net::HybridNetwork, nodeNumber::Integer) - undoInCycle!(net.edge, net.node) - for n in net.hybrid - flag, nocycle, edgesInCycle, nodesInCycle = updateInCycle!(net,n); - flag || error("not level1 network, hybrid $(n.number) cycle intersects another cycle") - !nocycle || error("strange network without cycle for hybrid $(n.number)") - end - ind = 0 - try - ind = getIndexNode(nodeNumber,net) - catch - error("cannot set node $(nodeNumber) as hybrid because it is not part of net") - end - net.node[ind].inCycle != -1 || error("node $(nodeNumber) is not part of any cycle, so we cannot make it hybrid") - indhyb = 0 - try - indhyb = getIndexNode(net.node[ind].inCycle,net) - catch - error("cannot find the hybrid node with number $(net.node[ind].inCycle)") - end - hybrid = net.node[indhyb] - hybridatnode!(net,hybrid,net.node[ind]) - return net -end -""" - hybridatnode!(net::HybridNetwork, hybrid::Node, newNode::Node) -Move the reticulation from `hybrid` to `newNode`, -which must in the same cycle. `net` is assumed to be of level 1, -but **no checks** are made and fields are supposed up-to-date. -Called by `hybridatnode!(net, nodenumber)`, which is itself -called by [`undirectedOtherNetworks`](@ref). """ -function hybridatnode!(net::HybridNetwork, hybrid::Node, newNode::Node) - hybrid.hybrid || error("node $(hybrid.number) should be hybrid, but it is not") - hybedges = hybridEdges(hybrid) - makeEdgeTree!(hybedges[1],hybrid) - makeEdgeTree!(hybedges[2],hybrid) - hybedges[1].inCycle = hybrid.number #just to keep attributes ok - hybedges[2].inCycle = hybrid.number - switchHybridNode!(net,hybrid,newNode) - found = false - for e in newNode.edge - if e.inCycle == hybrid.number - if !found - found = true - makeEdgeHybrid!(e,newNode, 0.51, switchHyb=true) #first found, major edge, need to optimize gamma anyway - ##e.gamma = -1 - ##e.containRoot = true ## need attributes like in snaq - else - makeEdgeHybrid!(e,newNode, 0.49, switchHyb=true) #second found, minor edge - ##e.gamma = -1 - ##e.containRoot = true - end - end - end -end - -# Not used anywhere, but tested -# does not call hybridatnode! but repeats its code: oops! violates DRY principle -# nodeNumber should correspond to the number assigned by readTopologyLevel1, -# and the node numbers in `net` are irrelevant. -""" - hybridatnode(net::HybridNetwork, nodeNumber::Integer) - -Move the hybrid node in a cycle to make node number `nodeNumber` a hybrid node -Compared to [`hybridatnode!`], this method checks that `net` is of level 1 -(required) and does not modify it. -""" -function hybridatnode(net0::HybridNetwork, nodeNumber::Integer) - net = readTopologyLevel1(writeTopologyLevel1(net0)) # we need inCycle attributes - ind = 0 - try - ind = getIndexNode(nodeNumber,net) - catch - error("cannot set node $(nodeNumber) as hybrid because it is not part of net") - end - net.node[ind].inCycle != -1 || error("node $(nodeNumber) is not part of any cycle, so we cannot make it hybrid") - indhyb = 0 - try - indhyb = getIndexNode(net.node[ind].inCycle,net) - catch - error("cannot find the hybrid node with number $(net.node[ind].inCycle)") - end - hybrid = net.node[indhyb] - hybrid.hybrid || error("node $(hybrid.number) should be hybrid, but it is not") - hybedges = hybridEdges(hybrid) - makeEdgeTree!(hybedges[1],hybrid) - makeEdgeTree!(hybedges[2],hybrid) - hybedges[1].inCycle = hybrid.number #just to keep attributes ok - hybedges[2].inCycle = hybrid.number - switchHybridNode!(net,hybrid,net.node[ind]) - found = false - for e in net.node[ind].edge - if e.inCycle == hybrid.number - if !found - found = true - makeEdgeHybrid!(e,net.node[ind], 0.51, switchHyb=true) #first found, major edge, need to optimize gamma anyway - e.gamma = -1 - e.containRoot = true - else - makeEdgeHybrid!(e,net.node[ind], 0.49, switchHyb=true) #second found, minor edge - e.gamma = -1 - e.containRoot = true - end - end - end - return net -end - - -""" - rootatnode!(HybridNetwork, nodeNumber::Integer; index=false::Bool) + rootatnode!(HybridNetwork, nodeNumber::Integer; index::Bool=false) rootatnode!(HybridNetwork, Node) rootatnode!(HybridNetwork, nodeName::AbstractString) Root the network/tree object at the node with name 'nodeName' or number 'nodeNumber' (by default) or with index 'nodeNumber' if index=true. -Attributes isChild1 and containRoot are updated along the way. +Attributes ischild1 and containroot are updated along the way. Use `plot(net, shownodenumber=true, showedgelength=false)` to visualize and identify a node of interest. (see package [PhyloPlots](https://github.com/juliaphylo/PhyloPlots.jl)) @@ -268,7 +40,7 @@ function rootatnode!(net::HybridNetwork, nodeName::AbstractString; kwargs...) rootatnode!(net, tmp[1]; kwargs..., index=true) end -function rootatnode!(net::HybridNetwork, nodeNumber::Integer; index=false::Bool) +function rootatnode!(net::HybridNetwork, nodeNumber::Integer; index::Bool=false) ind = nodeNumber # good if index=true if !index try @@ -289,19 +61,19 @@ function rootatnode!(net::HybridNetwork, nodeNumber::Integer; index=false::Bool) rootonedge!(net,net.node[ind].edge[1]) end else - rootsaved = net.root - net.root = ind + rootsaved = net.rooti + net.rooti = ind try - directEdges!(net) + directedges!(net) catch e if isa(e, RootMismatch) # new root incompatible with hybrid directions: revert back - net.root = rootsaved - directEdges!(net) + net.rooti = rootsaved + directedges!(net) end throw(RootMismatch("""the desired root is below a reticulation, reverting to old root position.""")) end - if (net.root != rootsaved && length(net.node[rootsaved].edge)==2) + if (net.rooti != rootsaved && length(net.node[rootsaved].edge)==2) fuseedgesat!(rootsaved,net) # remove old root node if degree 2 end return net @@ -310,12 +82,12 @@ end """ - rootonedge!(HybridNetwork, edgeNumber::Integer; index=false::Bool) + rootonedge!(HybridNetwork, edgeNumber::Integer; index::Bool=false) rootonedge!(HybridNetwork, Edge) Root the network/tree along an edge with number `edgeNumber` (by default) or with index `edgeNumber` if `index=true`. -Attributes `isChild1` and `containRoot` are updated along the way. +Attributes `ischild1` and `containroot` are updated along the way. This adds a new node and a new edge to the network. Use `plot(net, showedgenumber=true, showedgelength=false)` to @@ -328,7 +100,7 @@ function rootonedge!(net::HybridNetwork, edge::Edge; kwargs...) rootonedge!(net, edge.number, index=false; kwargs...) end -function rootonedge!(net::HybridNetwork, edgeNumber::Integer; index=false::Bool) +function rootonedge!(net::HybridNetwork, edgeNumber::Integer; index::Bool=false) ind = edgeNumber # good if index=true if !index try @@ -339,21 +111,21 @@ function rootonedge!(net::HybridNetwork, edgeNumber::Integer; index=false::Bool) elseif ind > length(net.edge) error("edge index $ind too large: the network only has $(length(net.edge)) edges.") end - rootsaved = net.root + rootsaved = net.rooti breakedge!(net.edge[ind],net) # returns new node, new edge (last ones pushed) - net.root = length(net.node) # index of new node: was the last one pushed + net.rooti = length(net.node) # index of new node: was the last one pushed try - directEdges!(net) + directedges!(net) catch e if isa(e, RootMismatch) # new root incompatible with hybrid directions: revert back - fuseedgesat!(net.root,net) # reverts breakedge! - net.root = rootsaved - directEdges!(net) + fuseedgesat!(net.rooti,net) # reverts breakedge! + net.rooti = rootsaved + directedges!(net) end throw(RootMismatch("""the desired root is below a reticulation, reverting to old root position.""")) end - if (net.root != rootsaved && length(net.node[rootsaved].edge)==2) + if (net.rooti != rootsaved && length(net.node[rootsaved].edge)==2) fuseedgesat!(rootsaved,net) # remove old root node if degree 2 end return net @@ -377,13 +149,13 @@ then we get this: n1 --newedge--> newnode --edge--> n2 ``` -`isChild1` and `containRoot` are updated, but not fields for level-1 -networks like `inCycle`, `partition`, `gammaz`, etc. +`ischild1` and `containroot` are updated, but not internal fields +(e.g. not those used by SNaQ for level-1 networks). # examples ```jldoctest -julia> net = readTopology("(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));"); +julia> net = readnewick("(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));"); julia> length(net.node) 19 @@ -414,7 +186,7 @@ PhyloNetworks.EdgeT{PhyloNetworks.Node}: attached to 2 node(s) (parent first): 11 3 -julia> writeTopology(net) # note extra pair of parentheses around S1 +julia> writenewick(net) # note extra pair of parentheses around S1 "(((S8,S9),((((S4,(S1)),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" ``` @@ -430,9 +202,9 @@ function breakedge!(edge::Edge, net::HybridNetwork) newedge = Edge(max_edge+1) # create new parent (tree) edge newnode = Node(max_node+1,false,false,[edge,newedge]) # tree node setNode!(edge,newnode) # newnode comes 2nd, and parent node along 'edge' - edge.isChild1 = true + edge.ischild1 = true setNode!(newedge,newnode) # newnode comes 1st in newedge, but child node - newedge.isChild1 = true + newedge.ischild1 = true setEdge!(pn,newedge) setNode!(newedge,pn) # pn comes 2nd in newedge if edge.length == -1.0 @@ -441,14 +213,14 @@ function breakedge!(edge::Edge, net::HybridNetwork) edge.length /= 2 newedge.length = edge.length end - newedge.containRoot = edge.containRoot + newedge.containroot = edge.containroot pushEdge!(net,newedge) pushNode!(net,newnode) return newnode, newedge end """ - fuseedgesat!(i::Integer,net::HybridNetwork, multgammas=false::Bool) + fuseedgesat!(i::Integer,net::HybridNetwork, multgammas::Bool=false) Removes `i`th node in net.node, if it is of degree 2. The parent and child edges of this node are fused. @@ -459,7 +231,7 @@ Reverts the action of [`breakedge!`](@ref). returns the fused edge. """ -function fuseedgesat!(i::Integer, net::HybridNetwork, multgammas=false::Bool) +function fuseedgesat!(i::Integer, net::HybridNetwork, multgammas::Bool=false) i <= length(net.node) || error("node index $i too large: only $(length(net.node)) nodes in the network.") nodei = net.node[i] @@ -471,7 +243,7 @@ function fuseedgesat!(i::Integer, net::HybridNetwork, multgammas=false::Bool) pe = nodei.edge[j] # edge to remove: pe.number > ce.number ce = nodei.edge[j==1 ? 2 : 1] if pe.hybrid # unless it's a hybrid: should be --tree--> node i --hybrid--> - (ce,pe) = (pe,ce) # keep the hybrid edge: keep its isMajor + (ce,pe) = (pe,ce) # keep the hybrid edge: keep its ismajor end isnodeiparent = (nodei ≡ getparent(ce)) (!ce.hybrid || isnodeiparent) || @@ -483,18 +255,18 @@ function fuseedgesat!(i::Integer, net::HybridNetwork, multgammas=false::Bool) removeNode!(pn,pe) # perhaps useless. in case gc() on pe affects its nodes. setEdge!(pn,ce) setNode!(ce,pn) # pn comes 2nd in ce now: ce.node is: [original, pn] - ce.isChild1 = isnodeiparent # to retain same direction as before. + ce.ischild1 = isnodeiparent # to retain same direction as before. ce.length = addBL(ce.length, pe.length) if multgammas ce.gamma = multiplygammas(ce.gamma, pe.gamma) end - if net.root==i # isnodeiparent should be true, unless the root and ce's direction were not in sync + if net.rooti==i # isnodeiparent should be true, unless the root and ce's direction were not in sync newroot = pn if newroot.leaf && !ce.hybrid # then reverse ce's direction. pn.leaf and ce.hybrid should never both occur! newroot = ce.node[1] # getOtherNode(ce, pn) - ce.isChild1 = false + ce.ischild1 = false end - net.root = findfirst(isequal(newroot), net.node) + net.rooti = findfirst(isequal(newroot), net.node) end deleteNode!(net,nodei) deleteEdge!(net,pe,part=false) # do not update partitions. irrelevant for networks of level>1. @@ -502,7 +274,7 @@ function fuseedgesat!(i::Integer, net::HybridNetwork, multgammas=false::Bool) end """ - removedegree2nodes!(net::HybridNetwork, keeproot=false::Bool) + removedegree2nodes!(net::HybridNetwork, keeproot::Bool=false) Delete *all* nodes of degree two in `net`, fusing the two adjacent edges together each time, and return the network. @@ -517,7 +289,7 @@ If `keeproot` is true, then the root is kept even if it's of degree 2. See [`fuseedgesat!`](@ref). ```jldoctest -julia> net = readTopology("(((((S1,(S2)#H1),(#H1,S3)))#H2),(#H2,S4));"); +julia> net = readnewick("(((((S1,(S2)#H1),(#H1,S3)))#H2),(#H2,S4));"); julia> PhyloNetworks.breakedge!(net.edge[3], net); # create a degree-2 node along hybrid edge @@ -525,24 +297,24 @@ julia> PhyloNetworks.breakedge!(net.edge[3], net); # another one: 2 in a row julia> PhyloNetworks.breakedge!(net.edge[10], net); # another one, elsewhere -julia> writeTopology(net) # extra pairs of parentheses +julia> writenewick(net) # extra pairs of parentheses "((#H2,S4),(((((S1,(((S2)#H1))),(#H1,S3)))#H2)));" julia> removedegree2nodes!(net); -julia> writeTopology(net) # even the root is gone +julia> writenewick(net) # even the root is gone "(#H2,S4,(((S1,(S2)#H1),(#H1,S3)))#H2);" -julia> net = readTopology("((((C:0.9)I1:0.1)I3:0.1,((A:1.0)I2:0.4)I3:0.6):1.4,(((B:0.2)H1:0.6)I2:0.5)I3:2.1);"); +julia> net = readnewick("((((C:0.9)I1:0.1)I3:0.1,((A:1.0)I2:0.4)I3:0.6):1.4,(((B:0.2)H1:0.6)I2:0.5)I3:2.1);"); julia> removedegree2nodes!(net, true); -julia> writeTopology(net, round=true) # the root was kept +julia> writenewick(net, round=true) # the root was kept "((C:1.1,A:2.0):1.4,B:3.4);" ``` """ -function removedegree2nodes!(net::HybridNetwork, keeproot=false::Bool) +function removedegree2nodes!(net::HybridNetwork, keeproot::Bool=false) rootnode = getroot(net) # caution: the root and its incident edges may change when degree-2 nodes # are removed. Indices of nodes to be removed would change too. @@ -572,24 +344,24 @@ output: newly created leaf node. # examples ```jldoctest -julia> net = readTopology("((S1,(((S2,(S3)#H1),(#H1,S4)))#H2),(#H2,S5));"); +julia> net = readnewick("((S1,(((S2,(S3)#H1),(#H1,S4)))#H2),(#H2,S5));"); julia> net.node[6].name # leaf S4 "S4" julia> PhyloNetworks.addleaf!(net, net.node[6], "4a"); # adding leaf to a node -julia> writeTopology(net, internallabel=true) +julia> writenewick(net, internallabel=true) "((S1,(((S2,(S3)#H1),(#H1,(4a)S4)))#H2),(#H2,S5));" julia> PhyloNetworks.addleaf!(net, net.node[6], "4b"); -julia> writeTopology(net, internallabel=true) +julia> writenewick(net, internallabel=true) "((S1,(((S2,(S3)#H1),(#H1,(4a,4b)S4)))#H2),(#H2,S5));" ``` ```jldoctest -julia> net = readTopology("((S1,(((S2,(S3)#H1),(#H1,S4)))#H2),(#H2,S5));"); +julia> net = readnewick("((S1,(((S2,(S3)#H1),(#H1,S4)))#H2),(#H2,S5));"); julia> [n.name for n in net.edge[7].node] # external edge to S4 2-element Vector{String}: @@ -598,24 +370,24 @@ julia> [n.name for n in net.edge[7].node] # external edge to S4 julia> PhyloNetworks.addleaf!(net, net.edge[7], "4a"); # adding leaf to an edge -julia> writeTopology(net, internallabel=true) +julia> writenewick(net, internallabel=true) "((S1,(((S2,(S3)#H1),(#H1,(S4,4a))))#H2),(#H2,S5));" ``` """ function addleaf!(net::HybridNetwork, speciesnode::Node, leafname::String, edgelength::Float64=-1.0) - exterioredge = Edge(maximum(e.number for e in net.edge) + 1, edgelength) # isChild1 = true by default in edge creation + exterioredge = Edge(maximum(e.number for e in net.edge) + 1, edgelength) # ischild1 = true by default in edge creation pushEdge!(net, exterioredge) setEdge!(speciesnode, exterioredge) - if speciesnode.hybrid || (!isrootof(speciesnode, net) && !getparentedge(speciesnode).containRoot) - exterioredge.containRoot = false + if speciesnode.hybrid || (!isrootof(speciesnode, net) && !getparentedge(speciesnode).containroot) + exterioredge.containroot = false end newleaf = Node(maximum(n.number for n in net.node) + 1, true, false, [exterioredge]) # Node(number, leaf, hybrid, edge array) newleaf.name = leafname - setNode!(exterioredge, [newleaf, speciesnode]) # [child, parent] to match isChild1 = true by default + setNode!(exterioredge, [newleaf, speciesnode]) # [child, parent] to match ischild1 = true by default if speciesnode.leaf deleteat!(net.leaf,findfirst(isequal(speciesnode), net.leaf)) speciesnode.leaf = false - net.numTaxa -= 1 + net.numtaxa -= 1 end pushNode!(net, newleaf) # push node into network (see auxillary.jl) return newleaf @@ -634,23 +406,23 @@ end ################################################# """ - directEdges!(net::HybridNetwork; checkMajor=true::Bool) + directedges!(net::HybridNetwork; checkMajor::Bool=true) -Updates the edges' attribute `isChild1`, according to the root placement. -Also updates edges' attribute `containRoot`, for other possible root placements +Updates the edges' attribute `ischild1`, according to the root placement. +Also updates edges' attribute `containroot`, for other possible root placements compatible with the direction of existing hybrid edges. Relies on hybrid nodes having exactly 1 major hybrid parent edge, -but checks for that if checkMajor=true. +but checks for that if `checkMajor` is true. Warnings: -1. Assumes that isChild1 is correct on hybrid edges -(to avoid changing the identity of which nodes are hybrids and which are not). +1. Assumes that `ischild1` is correct on hybrid edges + (to avoid changing the identity of which nodes are hybrids and which are not). 2. Does not check for cycles (to maintain a network's DAG status) Returns the network. Throws a 'RootMismatch' Exception if the root was found to conflict with the direction of any hybrid edge. """ -function directEdges!(net::HybridNetwork; checkMajor=true::Bool) +function directedges!(net::HybridNetwork; checkMajor::Bool=true) if checkMajor # check each node has 2+ hybrid parent edges (if any), and exactly one major. for n in net.node nparents = 0 # 0 or 2 normally, but could be >2 if polytomy. @@ -658,7 +430,7 @@ function directEdges!(net::HybridNetwork; checkMajor=true::Bool) for e in n.edge if e.hybrid && n == getchild(e) nparents += 1 - if (e.isMajor) nmajor +=1; end + if (e.ismajor) nmajor +=1; end end end (nparents!=1) || error("node $(n.number) has exactly 1 hybrid parent edge") @@ -666,16 +438,16 @@ function directEdges!(net::HybridNetwork; checkMajor=true::Bool) error("hybrid node $(n.number) has 0 or 2+ major hybrid parents") (nparents!=2 || n.hybrid) || @warn "node $(n.number) has 2 parents but its hybrid attribute is false. -It is not used in directEdges!, but might cause an error elsewhere." - # to fix this: change n.hybrid, net.hybrid, net.numHybrids etc. +It is not used in directedges!, but might cause an error elsewhere." + # to fix this: change n.hybrid, net.hybrid, net.numhybrids etc. # none of those attributes are used here. end end - net.cleaned = false # attributed used by snaq! Will change isChild1 and containRoot - for e in net.node[net.root].edge - traverseDirectEdges!(net.node[net.root],e,true) + net.boolg2 = false # attributed used by snaq! Will change ischild1 and containroot + for e in net.node[net.rooti].edge + traverseDirectEdges!(net.node[net.rooti],e,true) end - net.isRooted = true + net.isrooted = true return net end @@ -684,18 +456,18 @@ end function traverseDirectEdges!(node::Node, edge::Edge, containroot::Bool) if edge.hybrid && node==getchild(edge) throw(RootMismatch( -"direction (isChild1) of hybrid edge $(edge.number) conflicts with the root. -isChild1 and containRoot were updated for a subset of edges in the network only.")) +"direction (ischild1) of hybrid edge $(edge.number) conflicts with the root. +ischild1 and containroot were updated for a subset of edges in the network only.")) end if node == edge.node[1] - edge.isChild1 = false + edge.ischild1 = false cn = edge.node[2] # cn = child node else - edge.isChild1 = true + edge.ischild1 = true cn = edge.node[1] end - edge.containRoot = containroot - if !cn.leaf && (!edge.hybrid || edge.isMajor) # continue down recursion + edge.containroot = containroot + if !cn.leaf && (!edge.hybrid || edge.ismajor) # continue down recursion if edge.hybrid containroot=false; end # changes containroot locally, intentional. nchildren=0 for e in cn.edge @@ -707,7 +479,7 @@ isChild1 and containRoot were updated for a subset of edges in the network only. if nchildren==0 throw(RootMismatch("non-leaf node $(cn.number) had 0 children. Could be a hybrid whose parents' direction conflicts with the root. -isChild1 and containRoot were updated for a subset of edges in the network only.")) +ischild1 and containroot were updated for a subset of edges in the network only.")) end end return nothing @@ -720,25 +492,26 @@ end """ preorder!(net::HybridNetwork) -Updates attribute net.nodes_changed in which the nodes are pre-ordered +Update attribute `net.vec_node` in which the nodes are pre-ordered (also called topological sorting), such that each node is visited after its parent(s). -The edges' direction needs to be correct before calling preorder!, using directEdges! +The edges' direction needs to be correct before calling `preorder!`, using `directedges!` """ function preorder!(net::HybridNetwork) - net.isRooted || error("net needs to be rooted for preorder!, run root functions or directEdges!") - net.nodes_changed = Node[] # path of nodes in preorder. + net.isrooted || error("net needs to be rooted for preorder!, run root functions or directedges!") + net.vec_node = Node[] # path of nodes in preorder. queue = Node[] # problem with PriorityQueue(): dequeue() takes a # random member if all have the same priority 1. - net.visited = [false for i = 1:size(net.node,1)]; - push!(queue,net.node[net.root]) # push root into queue + # using net.vec_bool track which nodes have already been *visited* + net.vec_bool = [false for i = 1:size(net.node,1)]; + push!(queue,net.node[net.rooti]) # push root into queue while !isempty(queue) #println("at this moment, queue is $([n.number for n in queue])") curr = pop!(queue); # deliberate choice over shift! for cladewise order currind = findfirst(x -> x===curr, net.node) # the "curr"ent node may have been already visited: because simple loop (2-cycle) - !net.visited[currind] || continue - net.visited[currind] = true # visit curr node - push!(net.nodes_changed,curr) #push curr into path + !net.vec_bool[currind] || continue + net.vec_bool[currind] = true # visit curr node + push!(net.vec_node,curr) #push curr into path for e in curr.edge if curr == getparent(e) other = getchild(e) @@ -748,7 +521,7 @@ function preorder!(net::HybridNetwork) else e2 = getpartneredge(e, other) parent = getparent(e2) - if net.visited[findfirst(x -> x===parent, net.node)] + if net.vec_bool[findfirst(x -> x===parent, net.node)] push!(queue,other) # warning: if simple loop, the same node will be pushed twice: child of "curr" via 2 edges end @@ -756,31 +529,31 @@ function preorder!(net::HybridNetwork) end end end - # println("path of nodes is $([n.number for n in net.nodes_changed])") + # println("path of nodes is $([n.number for n in net.vec_node])") end """ cladewiseorder!(net::HybridNetwork) -Updates attribute net.cladewiseorder_nodeIndex. Used for plotting the network. +Update the internal attribute `net.vec_int1`. Used for plotting the network. In the major tree, all nodes in a given clade are consecutive. On a tree, this function also provides a pre-ordering of the nodes. The edges' direction needs to be correct before calling -[`cladewiseorder!`](@ref), using [`directEdges!`](@ref) +[`cladewiseorder!`](@ref), using [`directedges!`](@ref) """ function cladewiseorder!(net::HybridNetwork) - net.isRooted || error("net needs to be rooted for cladewiseorder!\n run root functions or directEdges!") - net.cladewiseorder_nodeIndex = Int[] - queue = [net.root] # index (in net) of nodes in the queue + net.isrooted || error("net needs to be rooted for cladewiseorder!\n run root functions or directedges!") + net.vec_int1 = Int[] + queue = [net.rooti] # index (in net) of nodes in the queue # print("queued the root's children's indices: "); @show queue while !isempty(queue) ni = pop!(queue); # deliberate choice over shift! for cladewise order # @show net.node[ni].number - push!(net.cladewiseorder_nodeIndex, ni) + push!(net.vec_int1, ni) for e in net.node[ni].edge if net.node[ni] ≡ getparent(e) # net.node[ni] is parent node of e - if e.isMajor + if e.ismajor push!(queue, findfirst(isequal(getchild(e)), net.node)) # print("queuing: "); @show other.number end @@ -801,18 +574,18 @@ Use `plot(net, shownodenumber=true, showedgenumber=false)` to map node and edge on the network, as shown in the examples below. (see package [PhyloPlots](https://github.com/juliaphylo/PhyloPlots.jl)) -Warning: assumes that edges are correctly directed (isChild1 updated). This is done -by `plot(net)`. Otherwise run `directEdges!(net)`. +Warning: assumes that edges are correctly directed (ischild1 updated). This is done +by `plot(net)`. Otherwise run `directedges!(net)`. # Example ```julia -julia> net = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); +julia> net = readnewick("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); julia> using PhyloPlots julia> plot(net, shownodenumber=true) julia> rotate!(net, -4) julia> plot(net) -julia> net=readTopology("(4,((1,(2)#H7:::0.864):2.069,(6,5):3.423):0.265,(3,#H7:::0.136):10.0);"); +julia> net=readnewick("(4,((1,(2)#H7:::0.864):2.069,(6,5):3.423):0.265,(3,#H7:::0.136):10.0);"); julia> plot(net, shownodenumber=true, showedgenumber=true) julia> rotate!(net, -1, orderedEdgeNum=[1,12,9]) julia> plot(net, shownodenumber=true, showedgenumber=true) @@ -824,7 +597,7 @@ Note that `LinearAlgebra` also exports a function named `rotate!` in Julia v1.5. If both packages need to be used in Julia v1.5 or higher, usage of `rotate!` needs to be qualified, such as with `PhyloNetworks.rotate!`. """ -function rotate!(net::HybridNetwork, nnum::Integer; orderedEdgeNum=Int[]::Array{Int,1}) +function rotate!(net::HybridNetwork, nnum::Integer; orderedEdgeNum::Array{Int,1}=Int[]) nind = 0 nind = findfirst(n -> n.number == nnum, net.node) nind !== nothing || error("cannot find any node with number $nnum in network.") @@ -860,7 +633,7 @@ end # deleteLeaf! in pseudolik.jl, which # - does not necessarily remove nodes of degree 2, # - requires and updates all attributes for level-1 networks: -# inCycle, partition, branch lengths, diamond/triangle types etc. +# inte1, intn1 (cycle number), partition, branch lengths, diamond/triangle types etc. # - is used a lot within snaq! to extract quartets and retains info # on which parameters in the full network affect the quartet. # deleteIntLeaf! somewhat similar to fuseedgesat! @@ -902,8 +675,8 @@ tree edges with γ<1, or with reticulations in which the two parent `keeporiginalroot`: if true, keep the root even if it is of degree one (forcing `unroot` to be false). -Warning: does **not** update edges' `containRoot` nor attributes -related to level-1 networks such as inCycle, partition, gammaz, etc. +Warning: does **not** update edges' `containroot` nor internal attributes +(e.g. those used by SNaQ for level-1 networks). Does not require branch lengths, and designed to work on networks of all levels. """ @@ -929,10 +702,16 @@ end # - 2 hybrid edges down to a hybrid node. # hybrid edges from node to another node are not removed. fused instead. # consequence: node having 2 hybrid edges away from node should not occur. -function deleteleaf!(net::HybridNetwork, nodeNumber::Integer; - index=false::Bool, nofuse=false::Bool, - simplify=true::Bool, unroot=false::Bool, - multgammas=false::Bool, keeporiginalroot=false::Bool) +function deleteleaf!( + net::HybridNetwork, + nodeNumber::Integer; + index::Bool=false, + nofuse::Bool=false, + simplify::Bool=true, + unroot::Bool=false, + multgammas::Bool=false, + keeporiginalroot::Bool=false +) i = nodeNumber # good if index=true if !index i = findfirst(n -> n.number == nodeNumber, net.node) @@ -950,12 +729,12 @@ function deleteleaf!(net::HybridNetwork, nodeNumber::Integer; elseif nodeidegree == 1 pe = nodei.edge[1] pn = getOtherNode(pe, nodei) # parent node of leaf - if net.root == i && keeporiginalroot + if net.rooti == i && keeporiginalroot return nothing end # keep nodei if pn is a leaf: keep 1 edge for the single remaining leaf if pn.leaf - net.root = i # it should have been i before anyway + net.rooti = i # it should have been i before anyway length(net.edge)==1 || error("neighbor of degree-1 node $(nodei.name) is a leaf, but network had $(length(net.edge)) edges (instead of 1).") length(pn.edge)==1 || error("neighbor of $(nodei.name) is a leaf, incident to $(length(pn.edge)) edges (instead of 1)") return nothing @@ -964,10 +743,10 @@ function deleteleaf!(net::HybridNetwork, nodeNumber::Integer; removeNode!(pn,pe) # perhaps useless. in case gc() on pe affects pn removeEdge!(pn,pe) deleteEdge!(net,pe,part=false) - if net.root==i # if node was the root, new root = pn - net.root = findfirst(x -> x===pn, net.node) + if net.rooti==i # if node was the root, new root = pn + net.rooti = findfirst(x -> x===pn, net.node) end - deleteNode!(net,nodei) # this updates the index net.root + deleteNode!(net,nodei) # this updates the index net.rooti deleteleaf!(net, pn.number; nofuse = nofuse, simplify=simplify, unroot=unroot, multgammas=multgammas, keeporiginalroot=keeporiginalroot) return nothing @@ -976,7 +755,7 @@ function deleteleaf!(net::HybridNetwork, nodeNumber::Integer; return nothing end # if we get to here, nodei has degree 2 exactly: --e1-- nodei --e2-- - if i==net.root && (keeporiginalroot || !unroot) + if i==net.rooti && (keeporiginalroot || !unroot) return nothing # node = root of degree 2 and we want to keep it end e1 = nodei.edge[1] @@ -986,7 +765,7 @@ function deleteleaf!(net::HybridNetwork, nodeNumber::Integer; cn2 = getchild(e2) if !(nodei ≡ cn && nodei ≡ cn2) # nodei *not* the child of both e1 and e2 # possible at the root, in which case e1,e2 should have same child - (i==net.root && cn ≡ cn2) || + (i==net.rooti && cn ≡ cn2) || error("after removing descendants, node $(nodei.number) has 2 hybrid edges but is not the child of both.") # delete e1,e2,nodei and move the root to their child cn cn.hybrid || error("child node $(cn.number) of hybrid edges $(e1.number) and $(e2.number) should be a hybrid.") @@ -994,14 +773,14 @@ function deleteleaf!(net::HybridNetwork, nodeNumber::Integer; any(getchild(e) ≡ cn && e !== e1 && e !==e2 for e in cn.edge) && error("root has 2 hybrid edges, but their common child has an extra parent") removeEdge!(cn,e1); removeEdge!(cn,e2) - removeHybrid!(net,cn) # removes cn from net.hybrid, updates net.numHybrids - cn.hybrid = false # !! allowrootbelow! not called: would require correct isChild1 + removeHybrid!(net,cn) # removes cn from net.hybrid, updates net.numhybrids + cn.hybrid = false # !! allowrootbelow! not called: would require correct ischild1 empty!(e1.node); empty!(e2.node) deleteEdge!(net,e1,part=false); deleteEdge!(net,e2,part=false) empty!(nodei.edge) deleteNode!(net,nodei) - net.root = findfirst(x -> x ≡ cn, net.node) - deleteleaf!(net, net.root; index=true, nofuse=nofuse, simplify=simplify, + net.rooti = findfirst(x -> x ≡ cn, net.node) + deleteleaf!(net, net.rooti; index=true, nofuse=nofuse, simplify=simplify, unroot=unroot, multgammas=multgammas, keeporiginalroot=keeporiginalroot) return nothing end @@ -1013,7 +792,7 @@ function deleteleaf!(net::HybridNetwork, nodeNumber::Integer; removeNode!(p1,e1); removeNode!(p2,e2) # perhaps useless removeEdge!(p1,e1); removeEdge!(p2,e2) deleteEdge!(net,e1,part=false); deleteEdge!(net,e2,part=false) - if net.root==i net.root=getIndex(p1,net); end # should never occur though. + if net.rooti==i net.rooti=getIndex(p1,net); end # should never occur though. deleteNode!(net,nodei) # recursive call on both p1 and p2. deleteleaf!(net, p1.number; nofuse = nofuse, simplify=simplify, unroot=unroot, @@ -1034,12 +813,12 @@ function deleteleaf!(net::HybridNetwork, nodeNumber::Integer; if pn ≡ getparent(e2) # e1 and e2 have same child and same parent. Remove e1. e2.hybrid = false # assumes bicombining at cn: no third hybrid parent - e2.isMajor = true + e2.ismajor = true e2.gamma = addBL(e1.gamma, e2.gamma) removeEdge!(pn,e1); removeEdge!(cn,e1) deleteEdge!(net,e1,part=false) - removeHybrid!(net,cn) # removes cn from net.hybrid, updates net.numHybrids - cn.hybrid = false # !! allowrootbelow! not called: would require correct isChild1 + removeHybrid!(net,cn) # removes cn from net.hybrid, updates net.numhybrids + cn.hybrid = false # !! allowrootbelow! not called: would require correct ischild1 # call recursion again because pn and/or cn might be of degree 2 (or even 1). deleteleaf!(net, cn.number; nofuse = nofuse, simplify=simplify, unroot=unroot, multgammas=multgammas, keeporiginalroot=keeporiginalroot) @@ -1053,34 +832,185 @@ function deleteleaf!(net::HybridNetwork, nodeNumber::Integer; return nothing end + + +""" + deletehybridedge!(net::HybridNetwork, edge::Edge, + nofuse=false, unroot=false, + multgammas=false, simplify=true, keeporiginalroot=false) + +Delete a hybrid `edge` from `net` and return the network. +The network does not have to be of level 1 and may contain polytomies, +although each hybrid node must have exactly 2 parents. +Branch lengths are updated, allowing for missing values. + +If `nofuse` is false, when `edge` is removed, its child (hybrid) node is removed +and its partner hybrid edge is removed. +Its child edge is retained (below the hybrid node), fused with the former partner, +with new length: old length + length of `edge`'s old partner. +Any 2-cycle is simplified into a single edge, unless `simplify` is false. + +If `nofuse` is true, edges with descendant leaves are kept as is, +and are not fused. Nodes are retained during edge removal, +provided that they have at least one descendant leaf. +The hybrid edge that is partner to `edge` becomes a tree edge, +but has its γ value unchanged (it is not set to 1), since it is not merged +with its child edge after removal of the reticulation. +Also, 2-cycles are not simplified if `nofuse` is true. +That is, if we get 2 hybrid edges both from the same parent to the same child, +these hybrid edges are retained without being fused into a single tree edge. + +If `unroot` is false and if the root is up for deletion during the process, +it will be kept if it's of degree 2 or more. +A root node of degree 1 will be deleted unless `keeporiginalroot` is true. + +If `multgammas` is true: inheritance weights are kept by multiplying together +the inheritance γ's of edges that are merged. For example, +if there is a hybrid ladder, the partner hybrid edge remains a hybrid edge +(with a new partner), and its γ is the product of the two hybrid edges +that have been fused. So it won't add up to 1 with its new partner's γ. + +If `keeporiginalroot` is true, a root of degree one will not be deleted. + +Warnings: + +- `containroot` is updated, but this requires correct `ischild1` fields +- if the parent of `edge` is the root and if `nofuse` is false, the root + is moved to keep the network unrooted with a root of degree two. +- does *not* update attributes needed for snaq! (like inte1, edge.z, edge.y etc.) +""" +function deletehybridedge!( + net::HybridNetwork, + edge::Edge, + nofuse::Bool=false, + unroot::Bool=false, + multgammas::Bool=false, + simplify::Bool=true, + keeporiginalroot::Bool=false +) + edge.hybrid || error("edge $(edge.number) has to be hybrid for deletehybridedge!") + n1 = getchild(edge) # child of edge, to be deleted unless nofuse + n1.hybrid || error("child node $(n1.number) of hybrid edge $(edge.number) should be a hybrid.") + n1degree = length(n1.edge) + n2 = getparent(edge) # parent of edge, to be deleted too + n2degree = length(n2.edge) + # next: keep hybrid node n1 if it has 4+ edges or if keepNode. + # otherwise: detach n1, then delete recursively + delete_n1_recursively = false + if n1degree < 3 + error("node $(n1.number) has $(length(n1.edge)) edges instead of 3+"); + # alternatively: error if degree < 2 or leaf, + # warning if degree=2 and internal node, then + # delete_n1_recursively = true # n1 doesn't need to be detached first + elseif n1degree == 3 && !nofuse # then fuse 2 of the edges and detach n1 + delete_n1_recursively = true + pe = nothing # will be other parent (hybrid) edge of n1 + ce = nothing # will be child edge of n1, to be merged with pe + for e in n1.edge + if e.hybrid && e!==edge && n1===getchild(e) pe = e; end + if !e.hybrid || n1===getparent(e) ce = e; end # does *not* assume correct ischild1 for tree edges :) + end + pn = getparent(pe); # parent node of n1, other than n2 + atRoot = (net.node[net.rooti] ≡ n1) # n1 should not be root, but if so, pn will be new root + # if pe may contain the root, then allow the root on ce and below + if pe.containroot + allowrootbelow!(ce) # warning: assumes correct `ischild1` for ce and below + end + # next: replace ce by pe+ce, detach n1 from pe & ce, remove pe from network. + ce.length = addBL(ce.length, pe.length) + if multgammas + ce.gamma = multiplygammas(ce.gamma, pe.gamma) + end + removeNode!(n1,ce) # ce now has 1 single node cn + setNode!(ce,pn) # ce now has 2 nodes in this order: cn, pn + ce.ischild1 = true + setEdge!(pn,ce) + removeEdge!(pn,pe) + # if (pe.number x===pn, net.node) + i !== nothing || error("node $(pn.number) not in net!") + net.rooti = i + end + # below: we will need to delete n1 recursively (hence edge) + else # n1 has 4+ edges (polytomy) or 3 edges but we want to keep it anyway: + # keep n1 but detach it from 'edge', set its remaining parent to major tree edge + pe = getpartneredge(edge, n1) # partner edge: keep it this time + if !pe.ismajor pe.ismajor=true; end + pe.hybrid = false + # note: pe.gamma *not* set to 1.0 here + removeEdge!(n1,edge) # does not update n1.hybrid at this time + removeHybrid!(net,n1) # removes n1 from net.hybrid, updates net.numhybrids + n1.hybrid = false + if pe.containroot + allowrootbelow!(pe) # warning: assumes correct `ischild1` for pe and below + end + # below: won't delete n1, delete edge instead + end + + formernumhyb = net.numhybrids + # next: delete n1 recursively, or delete edge and delete n2 recursively. + # keep n2 if it has 4+ edges (or if nofuse). 1 edge should never occur. + # If root, would have no parent: treat network as unrooted and change the root. + if delete_n1_recursively + deleteleaf!(net, n1.number; index=false, nofuse=nofuse, + simplify=simplify, unroot=unroot, multgammas=multgammas, + keeporiginalroot=keeporiginalroot) + # else: delete "edge" then n2 as appropriate + elseif n2degree == 1 + error("node $(n2.number) (parent of hybrid edge $(edge.number) to be deleted) has 1 edge only!") + else + # fixit: if n2degree == 2 && n2 === net.node[net.rooti] and + # if we want to keep original root: then delete edge but keep n2 + # detach n2 from edge, remove hybrid 'edge' from network + removeEdge!(n2,edge) + deleteEdge!(net,edge,part=false) + # remove n2 as appropriate later (recursively) + deleteleaf!(net, n2.number; index=false, nofuse=nofuse, + simplify=simplify, unroot=unroot, multgammas=multgammas, + keeporiginalroot=keeporiginalroot) + end + if net.numhybrids != formernumhyb # deleteleaf! does not update containroot + allowrootbelow!(net) + end + return net +end + + """ - deleteaboveLSA!(net, preorder=true::Bool) + deleteaboveLSA!(net, preorder=true) Delete edges and nodes above (ancestral to) the least stable ancestor (LSA) of the leaves in `net`. See [`leaststableancestor`](@ref) for the definition of the LSA. Output: modified network `net`. """ -function deleteaboveLSA!(net::HybridNetwork, preorder=true::Bool) +function deleteaboveLSA!(net::HybridNetwork, preorder::Bool=true) lsa, lsaindex = leaststableancestor(net, preorder) for _ in 1:(lsaindex-1) # the network may temporarily have multiple "roots" - nodei = popfirst!(net.nodes_changed) + nodei = popfirst!(net.vec_node) for e in nodei.edge # delete all of nodei's edges (which much be outgoing) cn = getchild(e) - removeEdge!(cn, e) # also updates cn.hasHybEdge + removeEdge!(cn, e) # also updates cn.booln1 empty!(e.node) deleteEdge!(net, e; part=false) end empty!(nodei.edge) - deleteNode!(net, nodei) # resets net.root + deleteNode!(net, nodei) # resets net.rooti if nodei.name != "" j = findfirst(isequal(nodei.name), net.names) isnothing(j) || deleteat!(net.names, j) end end - net.root = findfirst( n -> n===lsa, net.node) + net.rooti = findfirst( n -> n===lsa, net.node) if lsa.hybrid # edge case: LSA may be hybrid if 1 single leaf in network removeHybrid!(net, lsa) lsa.hybrid = false @@ -1089,7 +1019,7 @@ function deleteaboveLSA!(net::HybridNetwork, preorder=true::Bool) end """ - resetNodeNumbers!(net::HybridNetwork; checkPreorder=true, type=:ape) + resetnodenumbers!(net::HybridNetwork; checkpreorder=true, type=:ape) Change internal node numbers of `net` to consecutive numbers from 1 to the total number of nodes. @@ -1103,48 +1033,50 @@ keyword arguments: If `:internalonly`, leaves are unchanged. Only internal nodes are modified, to take consecutive numbers from (max leaf number)+1 and up. With this last option, the post-ordering of nodes is by-passed. -- `checkPreorder`: if false, the `isChild1` edge field and the `net.nodes_changed` +- `checkpreorder`: if false, the `ischild1` edge field and the `net.vec_node` network field are supposed to be correct (to get nodes in preorder). This is not needed when `type=:internalonly`. # Examples ```jldoctest -julia> net = readTopology("(A,(B,(C,D)));"); - -julia> PhyloNetworks.resetNodeNumbers!(net) - -julia> printNodes(net) # first column "node": root is 5 -node leaf hybrid hasHybEdge name inCycle edges'numbers -1 true false false A -1 1 -2 true false false B -1 2 -3 true false false C -1 3 -4 true false false D -1 4 -7 false false false -1 3 4 5 -6 false false false -1 2 5 6 -5 false false false -1 1 6 - -julia> net = readTopology("(A,(B,(C,D)));"); - -julia> PhyloNetworks.resetNodeNumbers!(net; type=:postorder) - -julia> printNodes(net) # first column "node": root is 7 -node leaf hybrid hasHybEdge name inCycle edges'numbers -1 true false false A -1 1 -2 true false false B -1 2 -3 true false false C -1 3 -4 true false false D -1 4 -5 false false false -1 3 4 5 -6 false false false -1 2 5 6 -7 false false false -1 1 6 +julia> net = readnewick("(A,(B,(C,D)));"); + +julia> PhyloNetworks.resetnodenumbers!(net) + +julia> printnodes(net) # first column "node": root is 5 +node leaf hybrid name i_cycle edges'numbers +1 true false A -1 1 +2 true false B -1 2 +3 true false C -1 3 +4 true false D -1 4 +7 false false -1 3 4 5 +6 false false -1 2 5 6 +5 false false -1 1 6 + +julia> net = readnewick("(A,(B,(C,D)));"); + +julia> PhyloNetworks.resetnodenumbers!(net; type=:postorder) + +julia> printnodes(net) # first column "node": root is 7 +node leaf hybrid name i_cycle edges'numbers +1 true false A -1 1 +2 true false B -1 2 +3 true false C -1 3 +4 true false D -1 4 +5 false false -1 3 4 5 +6 false false -1 2 5 6 +7 false false -1 1 6 ``` """ -function resetNodeNumbers!(net::HybridNetwork; - checkPreorder=true::Bool, - type::Symbol=:ape) - if checkPreorder - directEdges!(net) - preorder!(net) # to create/update net.nodes_changed +function resetnodenumbers!( + net::HybridNetwork; + checkpreorder::Bool=true, + type::Symbol=:ape +) + if checkpreorder + directedges!(net) + preorder!(net) # to create/update net.vec_node end # first: re-number the leaves if type == :internalonly @@ -1159,9 +1091,9 @@ function resetNodeNumbers!(net::HybridNetwork; end # second: re-number internal nodes if type == :ape - nodelist = net.nodes_changed # pre-order: root first + nodelist = net.vec_node # pre-order: root first elseif type == :postorder - nodelist = reverse(net.nodes_changed) # post-order + nodelist = reverse(net.vec_node) # post-order elseif type == :internalonly nodelist = net.node end @@ -1173,12 +1105,12 @@ function resetNodeNumbers!(net::HybridNetwork; end """ - resetEdgeNumbers!(net::HybridNetwork, verbose=true) + resetedgenumbers!(net::HybridNetwork, verbose=true) Check that edge numbers of `net` are consecutive numbers from 1 to the total number of edges. If not, reset the edge numbers to be so. """ -function resetEdgeNumbers!(net::HybridNetwork, verbose=true::Bool) +function resetedgenumbers!(net::HybridNetwork, verbose::Bool=true) enum = [e.number for e in net.edge] ne = length(enum) unused = setdiff(1:ne, enum) @@ -1197,14 +1129,14 @@ end """ norootbelow!(e::Edge) -Set `containRoot` to `false` for edge `e` and all edges below, recursively. -The traversal stops if `e.containRoot` is already `false`, assuming -that `containRoot` is already false all the way below down that edge. +Set `containroot` to `false` for edge `e` and all edges below, recursively. +The traversal stops if `e.containroot` is already `false`, assuming +that `containroot` is already false all the way below down that edge. """ function norootbelow!(e::Edge) - e.containRoot || return nothing # if already false: stop + e.containroot || return nothing # if already false: stop # if true: turn to false then move down to e's children - e.containRoot = false + e.containroot = false cn = getchild(e) # cn = child node for ce in cn.edge ce !== e || continue # skip e @@ -1218,13 +1150,13 @@ end allowrootbelow!(e::Edge) allowrootbelow!(n::Node, parent_edge_of_n::Edge) -Set `containRoot` to `true` for edge `e` and all edges below, recursively. +Set `containroot` to `true` for edge `e` and all edges below, recursively. The traversal stops whenever a hybrid node is encountered: if the child of `e` is a hybrid node (that is, if `e` is a hybrid edge) or if `n` is a hybrid node, then the edges below `e` or `n` are *not* traversed. """ function allowrootbelow!(e::Edge) - e.containRoot = true + e.containroot = true e.hybrid && return nothing # e hybrid edge <=> its child hybrid node: stop allowrootbelow!(getchild(e), e) end @@ -1240,15 +1172,15 @@ end """ allowrootbelow!(net::HybridNetwork) -Set `containRoot` to `true` for each edge below the root node, then -traverses `net` in preorder to update `containRoot` of all edges (stopping +Set `containroot` to `true` for each edge below the root node, then +traverses `net` in preorder to update `containroot` of all edges (stopping at hybrid nodes): see the other methods. -Assumes correct `isChild1` edge field. +Assumes correct `ischild1` edge field. """ function allowrootbelow!(net::HybridNetwork) - rn = net.node[net.root] + rn = net.node[net.rooti] for e in rn.edge - if e.containRoot + if e.containroot allowrootbelow!(getchild(e), e) end end diff --git a/src/moves_semidirected.jl b/src/moves_semidirected.jl index fa9f0397a..ad06c2fc3 100644 --- a/src/moves_semidirected.jl +++ b/src/moves_semidirected.jl @@ -65,7 +65,7 @@ from coming into or going out of a species group. # examples ```jldoctest -julia> net = readTopology("(((2a,2b),(((((1a,1b,1c),4),(5)#H1),(#H1,(6,7))))#H2),(#H2,10));"); +julia> net = readnewick("(((2a,2b),(((((1a,1b,1c),4),(5)#H1),(#H1,(6,7))))#H2),(#H2,10));"); julia> c_species1 = PhyloNetworks.TopologyConstraint(0x01, ["1a","1b","1c"], net) Species constraint, on tips: 1a, 1b, 1c @@ -107,22 +107,22 @@ function TopologyConstraint(type::UInt8, taxonnames::Vector{String}, net::Hybrid push!(taxonnums, net.leaf[index].number) # note: not ordered as in taxonnames end # get interior ancestor edges in major tree (no hybrids) - matrix = hardwiredClusters(majorTree(net), vcat(taxonnames, outsideclade)) + matrix = hardwiredclusters(majortree(net), vcat(taxonnames, outsideclade)) # look for row with ones in relevant columns, zeros everywhere else (or zeros there and ones everywhere else) edgenum = 0 # 0 until we find the stem edge comparator = zeros(Int8, size(matrix)[2]-2) comparator[1:ntax_clade] = ones(Int8, ntax_clade) # go through matrix row by row to find match with comparator. Return number - for i in 1:size(matrix, 1) - if matrix[i,2:size(matrix)[2]-1] == comparator # found the mrca! + for i in axes(matrix, 1) + if matrix[i,2:size(matrix,2)-1] == comparator # found the mrca! edgenum = matrix[i, 1] break end end if edgenum == 0 comparator .= 1 .- comparator - for i in 1:size(matrix)[1] - if matrix[i,2:size(matrix)[2]-1] == comparator + for i in axes(matrix,1) + if matrix[i,2:size(matrix,2)-1] == comparator error("""The clade given is not rooted correctly, making it a grade instead of a clade. You can re-try after modifying the root of your network.""") end @@ -130,7 +130,7 @@ function TopologyConstraint(type::UInt8, taxonnames::Vector{String}, net::Hybrid error("The taxa given do not form a clade in the network") end edgei = findfirst(e -> e.number == edgenum, net.edge) - edgei !== nothing || error("hmm. hardwiredClusters on the major tree got an edge number not in the network") + edgei !== nothing || error("hmm. hardwiredclusters on the major tree got an edge number not in the network") stemedge = net.edge[edgei] mrcanode = getchild(stemedge) TopologyConstraint(type, taxonnames, taxonnums, stemedge, mrcanode) @@ -149,14 +149,15 @@ end True if `network` violates one (or more) of the constraints of type 1 (individuals in a species group) or type 2 (must be clades in the major tree). Warning: constraints of type 3 are not implemented. +See [`TopologyConstraint`](@ref) for constraint types. """ function constraintviolated(net::HybridNetwork, constraints::Vector{TopologyConstraint}) - # fixit next PR: add option to give a vector of constraint types to check, + # would be nice: option to give a vector of constraint types to check, # then only check these constraint types if isempty(constraints) return false end # avoids extracting major tree when no constraint - tree = majorTree(net) + tree = majortree(net) for con in constraints # checks directionality of stem edge hasn't changed if con.type in [0x01, 0x02] getchild(con.edge) === con.node || return true @@ -177,13 +178,13 @@ end Update the set `taxonnum` in each constraint, assuming that the stem edge and the crown node are still correct, and that their descendants are still correct. May be needed if the node and edge numbers were modified by -[`resetNodeNumbers!`](@ref) or [`resetEdgeNumbers!`](@ref). +[`resetnodenumbers!`](@ref) or [`resetedgenumbers!`](@ref). Warning: does *not* check that the names of leaves with numbers in `taxonnum` are `taxonnames`. ```jldoctest -julia> net = readTopology("(((2a,2b),(((((1a,1b,1c),4),(5)#H1),(#H1,(6,7))))#H2),(#H2,10));"); +julia> net = readnewick("(((2a,2b),(((((1a,1b,1c),4),(5)#H1),(#H1,(6,7))))#H2),(#H2,10));"); julia> c_species1 = PhyloNetworks.TopologyConstraint(0x01, ["1a","1b","1c"], net) Species constraint, on tips: 1a, 1b, 1c @@ -201,7 +202,7 @@ Clade constraint, on tips: 1a, 1b, 1c, 4, 5 stem edge number 12 crown node number -7 -julia> PhyloNetworks.resetNodeNumbers!(net) +julia> PhyloNetworks.resetnodenumbers!(net) julia> net.node[4].number = 111; @@ -223,7 +224,7 @@ function updateconstraints!(constraints::Vector{TopologyConstraint}, net::Hybrid if isempty(constraints) return nothing end # avoids extracting major tree when no constraint - tree = majorTree(net) + tree = majortree(net) for con in constraints if con.type in [0x01, 0x02] getchild(con.edge) === con.node || @@ -269,8 +270,13 @@ nice to add: option to modify branch lengths during NNI =# """ - nni!(net::HybridNetwork, e::Edge, nohybridladder::Bool=true, no3cycle::Bool=true, - constraints=TopologyConstraint[]::Vector{TopologyConstraint}) + nni!([rng::AbstractRNG,] + net::HybridNetwork, + e::Edge, + nohybridladder::Bool=true, + no3cycle::Bool=true, + constraints::Vector{TopologyConstraint}=TopologyConstraint[] + ) Attempt to perform a nearest neighbor interchange (NNI) around edge `e`, randomly chosen among all possible NNIs (e.g 3, sometimes more depending on `e`) @@ -282,15 +288,15 @@ The option `no3cycle` forbids moves that would create a 3-cycle in the network. When `no3cycle` = false, 2-cycle and 3-cycles may be generated. Note that the defaults values are for positional (not keyword) arguments, so -two or more arguments can be used, but in a specific order: nni!(net, e) or -nni!(net, e, nohybridladder), -nni!(net, e, nohybridladder, no3cycle), -nni!(net, e, nohybridladder, no3cycle, contraints). +two or more arguments can be used, but in a specific order: `nni!(net, e)` or +`nni!(net, e, nohybridladder)`, +`nni!(net, e, nohybridladder, no3cycle)`, +`nni!(net, e, nohybridladder, no3cycle, contraints)`. Assumptions: - The starting network does not have 3-cycles, if `no3cycle=true`. No check for the presence of 2- and 3-cycles in the input network. -- The edges' field `isChild1` is correct in the input network. (This field +- The edges' field `ischild1` is correct in the input network. (This field will be correct in the output network.) Output: @@ -301,23 +307,48 @@ information indicating how to undo the move or `nothing` if all NNIs failed. ```jldoctest julia> str_network = "(((S8,S9),(((((S1,S2,S3),S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));"; -julia> net = readTopology(str_network); +julia> net = readnewick(str_network); -julia> using Random; Random.seed!(3); +julia> # using Random; Random.seed!(3); ## commented out for doctest reproducibility across julia versions, but users can use this line to set the seed in their analyses. julia> undoinfo = nni!(net, net.edge[3], true, true); # true's to avoid hybrid ladders and 3-cycles +``` + +In the next example, we use a stable RNG to make the example reproducible +across julia versions. However, this particular RNG is *not* recommended. +The RNG used by default is better (e.g. much more efficient). + +```jldoctest nni +julia> str_network = "(((S8,S9),(((((S1,S2,S3),S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));"; + +julia> net = readnewick(str_network); + +julia> # using Pkg; Pkg.add("StableRNGs") # to install StableRNGs if not done earlier -julia> writeTopology(net) -"(((S8,(((((S1,S2,S3),S4),(S5)#H1),(#H1,(S6,S7))))#H2),S9),(#H2,S10));" +julia> using StableRNGs + +julia> rng = StableRNG(791); + +julia> undoinfo = nni!(rng, net, net.edge[3], true, true); # true's to avoid hybrid ladders and 3-cycles + +julia> writenewick(net) +"((S9,((((((S1,S2,S3),S4),(S5)#H1),(#H1,(S6,S7))))#H2,S8)),(#H2,S10));" julia> nni!(undoinfo...); -julia> writeTopology(net) == str_network # net back to original topology: the NNI was "undone" +julia> writenewick(net) == str_network # net back to original topology: the NNI was "undone" true ``` """ -function nni!(net::HybridNetwork, e::Edge, nohybridladder::Bool=true, no3cycle::Bool=true, - constraints=TopologyConstraint[]::Vector{TopologyConstraint}) +nni!(net::HybridNetwork, args...) = nni!(Random.default_rng(), net, args...) +function nni!( + rng::Random.AbstractRNG, + net::HybridNetwork, + e::Edge, + nohybridladder::Bool=true, + no3cycle::Bool=true, + constraints::Vector{TopologyConstraint}=TopologyConstraint[] +) for con in constraints # reject NNI if the focus edge is the stem of a constraint. # sufficient to maintain star species constraints @@ -327,13 +358,13 @@ function nni!(net::HybridNetwork, e::Edge, nohybridladder::Bool=true, no3cycle:: end end nnirange = 0x01:nnimax(e) # 0x01 = 1 but UInt8 instead of Int - nnis = Random.shuffle(nnirange) + nnis = Random.shuffle(rng, nnirange) for nummove in nnis # iterate through all possible NNIs, but in random order - moveinfo = nni!(net, e, nummove, nohybridladder, no3cycle) + moveinfo = nni!(e, nummove, nohybridladder, no3cycle) !isnothing(moveinfo) || continue # to next possible NNI # if constraintviolated(net, constraints) # # fixit for next PR: not needed for species constraints, - # # not sufficient for clades if γ / isMajor modified later, or if + # # not sufficient for clades if γ / ismajor modified later, or if # # constraints met after NNI but stem / crows need to be moved # nni!(moveinfo...) # undo the previous NNI # continue # try again @@ -361,20 +392,19 @@ function nnimax(e::Edge) # e not hybrid, hyb parent: RB case, 4 NNIs # e not hybrid, tree parent: BB case, 2 NNIs if directed, 8 if undirected hybparent = getparent(e).hybrid - n = (e.hybrid ? (hybparent ? 0x02 : (e.containRoot ? 0x06 : 0x03)) : # RR & BR - (hybparent ? 0x04 : (e.containRoot ? 0x08 : 0x02))) # RB & BB + n = (e.hybrid ? (hybparent ? 0x02 : (e.containroot ? 0x06 : 0x03)) : # RR & BR + (hybparent ? 0x04 : (e.containroot ? 0x08 : 0x02))) # RB & BB return n end """ - nni!(net::HybridNetwork, uv::Edge, nummove::UInt8, - nohybridladder::Bool, no3cycle::Bool) + nni!(uv::Edge, nummove::UInt8, nohybridladder::Bool, no3cycle::Bool) -Modify `net` with a nearest neighbor interchange (NNI) around edge `uv`. +Modify a network with a nearest neighbor interchange (NNI) around its edge `uv`. Return the information necessary to undo the NNI, or `nothing` if the move -was not successful (such as if the resulting graph was not acyclic (not a DAG) or if -the focus edge is adjacent to a polytomy). If the move fails, the network is not -modified. +was not successful (such as if the resulting graph was not acyclic (not a DAG) +or if the focus edge is adjacent to a polytomy). +If the move fails, the network is not modified. `nummove` specifies which of the available NNIs is performed. rooted-NNI options according to Gambette et al. (2017), fig. 8: @@ -395,10 +425,15 @@ that the input network does not have any 2- or 3-cycles. If `no3cycle` is false, 3-cycles can be generated, but NNIs generating 2-cycles are prevented. -The edge field `isChild1` is assumed to be correct according to the `net.root`. +The edge field `ischild1` is assumed to be correct in the overall network +(that is, in sync with the network's field `.rooti`). """ -function nni!(net::HybridNetwork, uv::Edge, nummove::UInt8, - nohybridladder::Bool, no3cycle::Bool) +function nni!( + uv::Edge, + nummove::UInt8, + nohybridladder::Bool, + no3cycle::Bool +) nmovemax = nnimax(uv) if nmovemax == 0x00 # uv not internal, or polytomy e.g. species represented by polytomy with >2 indiv return nothing @@ -450,7 +485,7 @@ function nni!(net::HybridNetwork, uv::Edge, nummove::UInt8, end ## TASK 2: semi-directed network swaps: ## swap u <-> v, α <-> β if undirected and according to move number - if !u.hybrid && uv.containRoot # case BB or BR, with uv that may contain the root + if !u.hybrid && uv.containroot # case BB or BR, with uv that may contain the root nmoves = 0x03 # number of moves in the rooted (directed) case if !v.hybrid # BB, uv and all adjacent edges are undirected: 8 moves if nummove > 0x04 # switch u & v with prob 1/2 @@ -545,7 +580,7 @@ function nni!(net::HybridNetwork, uv::Edge, nummove::UInt8, elseif α === γ || β === δ return nothing end # we could check nohybridladder && β.hybrid but no need because - # we only get here if uv.containRoot so β cannot be hybrid + # we only get here if uv.containroot so β cannot be hybrid res = nni!(vγ, v, uv, u, βu) # case when u is root already excluded (not DAG) end @@ -556,7 +591,7 @@ function nni!(net::HybridNetwork, uv::Edge, nummove::UInt8, end """ - nni!(αu, u, uv::Edge, v, vδ) + nni!(αu::Edge, u::Node, uv::Edge, v::Node, vδ::Edge) nni!(αu,u,uv,v,vδ, flip::Bool, inner::Bool, indices) Transform a network locally around the focus edge `uv` with @@ -591,7 +626,7 @@ These are interpreted as: * u not hybrid & v hybrid * u hybrid, v not hybrid, α -> u <- v -> δ - Because of this, `nni(αu,u,uv,v,vδ, ...)` should not be used directly; - use instead `nni!(net, uv, move_number)`. + use instead `nni!(uv, move_number)`. - nni!(undoinfo...) restores the topology, but edges below hybrid nodes will have length 0.0 even if they didn't before. @@ -635,34 +670,34 @@ function nni!(αu::Edge, u::Node, uv::Edge, v::Node, vδ::Edge, (v, vδ, αu, u) ## TASK 2: update edges' directions if flip - uv.isChild1 = !uv.isChild1 + uv.ischild1 = !uv.ischild1 end ## TASK 3: update hybrid status of nodes (#? is it ever nodes?) - # & edges, and edges containRoot field + # & edges, and edges containroot field if u.hybrid && !v.hybrid if flip # RB, BR 1 or BR 2': flip hybrid status of uv and (αu or vδ) if uv.hybrid # BR 1 or BR 2' vδ.hybrid = true vδ.gamma = uv.gamma - vδ.isMajor = uv.isMajor + vδ.ismajor = uv.ismajor # length switches: for keeping the network unzipped. could be option later αu.length = uv.length uv.length = 0.0 uv.hybrid = false uv.gamma = 1.0 - uv.isMajor = true + uv.ismajor = true norootbelow!(uv) else # RB uv.hybrid = true uv.gamma = αu.gamma - uv.isMajor = αu.isMajor + uv.ismajor = αu.ismajor # length switches: for keeping the network unzipped. could be option later uv.length = vδ.length vδ.length = 0.0 αu.hybrid = false αu.gamma = 1.0 - αu.isMajor = true - if αu.containRoot + αu.ismajor = true + if αu.containroot allowrootbelow!(v, αu) end end @@ -672,17 +707,17 @@ function nni!(αu::Edge, u::Node, uv::Edge, v::Node, vδ::Edge, # no lengths to switch in these cases vδ.hybrid = true vδ.gamma = αu.gamma - vδ.isMajor = αu.isMajor + vδ.ismajor = αu.ismajor αu.hybrid = false αu.gamma = 1.0 - αu.isMajor = true - # containRoot: nothing to update + αu.ismajor = true + # containroot: nothing to update else # BR 1' or 2: α<-u<-v->δ : hybrid status just fine # length switches: for keeping the network unzipped. could be option later αu.length = vδ.length vδ.length = 0.0 norootbelow!(vδ) - if uv.containRoot + if uv.containroot allowrootbelow!(αu) end end @@ -691,7 +726,7 @@ function nni!(αu::Edge, u::Node, uv::Edge, v::Node, vδ::Edge, # we could have -αu-> -uv-> -vδ-> or <-αu- <-uv- <-vδ- hyb = ( getchild(αu) == v ? αu : vδ ) # uv's hybrid parent edge: either αu or vδ (uv.gamma, hyb.gamma) = (hyb.gamma, uv.gamma) - (uv.isMajor, hyb.isMajor) = (hyb.isMajor, uv.isMajor) + (uv.ismajor, hyb.ismajor) = (hyb.ismajor, uv.ismajor) end # throw error if u not hybrid & v hybrid? (does not need to be implemented) return vδ, u, uv, v, αu, flip, inner, v_in_vδ, αu_in_u, vδ_in_v, u_in_αu @@ -753,7 +788,7 @@ Output: individual-level network and vector of species constraint(s). # examples ```jldoctest -julia> species_net = readTopology("(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));"); +julia> species_net = readnewick("(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));"); julia> filename = joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "mappingIndividuals.csv"); @@ -765,7 +800,7 @@ S1,S1C julia> individual_net, species_constraints = PhyloNetworks.mapindividuals(species_net, filename); -julia> writeTopology(individual_net, internallabel=true) +julia> writenewick(individual_net, internallabel=true) "(((S8,S9),(((((S1A,S1B,S1C)S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" julia> species_constraints @@ -807,14 +842,14 @@ Called by [`mapindividuals`](@ref). # examples ```jldoctest -julia> net = readTopology("(S8,(((S1,S4),(S5)#H1),(#H1,S6)));"); +julia> net = readnewick("(S8,(((S1,S4),(S5)#H1),(#H1,S6)));"); julia> PhyloNetworks.addindividuals!(net, "S1", ["S1A", "S1B", "S1C"]) Species constraint, on tips: S1A, S1B, S1C stem edge number 2 crown node number 2 -julia> writeTopology(net) # 3 new nodes, S1 now internal: not a tip +julia> writenewick(net) # 3 new nodes, S1 now internal: not a tip "(S8,((((S1A,S1B,S1C)S1,S4),(S5)#H1),(#H1,S6)));" ``` """ @@ -857,15 +892,26 @@ end """ - moveroot!(net::HybridNetwork, constraints=TopologyConstraint[]::Vector{TopologyConstraint}) + moveroot!( + [rng::AbstractRNG,] + net::HybridNetwork, + constraints::Vector{TopologyConstraint}=TopologyConstraint[] + ) Move the root to a randomly chosen non-leaf node that is different from the current root, and not within a constraint clade or species. Output: `true` if successul, `nothing` otherwise. """ -function moveroot!(net::HybridNetwork, constraints=TopologyConstraint[]::Vector{TopologyConstraint}) - newrootrandomorder = Random.shuffle(1:length(net.node)) - oldroot = net.root +function moveroot!(net::HybridNetwork, args...) + moveroot!(Random.default_rng(), net, args...) +end +function moveroot!( + rng::Random.AbstractRNG, + net::HybridNetwork, + constraints::Vector{TopologyConstraint}=TopologyConstraint[] +) + newrootrandomorder = Random.shuffle(rng, 1:length(net.node)) + oldroot = net.rooti for newrooti in newrootrandomorder newrooti != oldroot || continue newrootnode = net.node[newrooti] @@ -881,14 +927,14 @@ function moveroot!(net::HybridNetwork, constraints=TopologyConstraint[]::Vector{ newrootfound || continue # to next potential new root # Check for no directional conflict try - net.root = newrooti - directEdges!(net) + net.rooti = newrooti + directedges!(net) # warning: assumes that the previous root has degree 3 # otherwise, need to delete previous root by fusing its 2 adjacent edges catch e # RootMismatch error if root placement is below a hybrid isa(e, RootMismatch) || rethrow(e) - net.root = oldroot - directEdges!(net) # revert edges' directions to match original rooting + net.rooti = oldroot + directedges!(net) # revert edges' directions to match original rooting continue # to next potential new root end # if we get here: newrooti passed all the checks @@ -899,8 +945,13 @@ function moveroot!(net::HybridNetwork, constraints=TopologyConstraint[]::Vector{ end """ - fliphybrid!(net::HybridNetwork, minor=true::Bool, nohybridladder=false::Bool, - constraints=TopologyConstraint[]::Vector{TopologyConstraint}) + fliphybrid!( + [rng::AbstractRNG,] + net::HybridNetwork, + minor::Bool, + nohybridladder::Bool=false, + constraints::Vector{TopologyConstraint}=TopologyConstraint[] + ) Cycle through hybrid nodes in random order until an admissible flip is found. At this hybrid node, flip the indicated hybrid parent edge (minor or major). @@ -910,7 +961,7 @@ Otherwise, return nothing. The flip can be undone with `fliphybrid!(net, newhybridnode, minor, constraints)`, or -`fliphybrid!(net, newhybridnode, !flippededge.isMajor, constraints)` +`fliphybrid!(net, newhybridnode, !flippededge.ismajor, constraints)` more generally, such as if the flipped edge had its γ modified after the original flip. @@ -920,10 +971,17 @@ original flip. - undoing the flip may not recover the original root in case the root position was modified during the original flip. """ -function fliphybrid!(net::HybridNetwork, minor=true::Bool, - nohybridladder=false::Bool, - constraints=TopologyConstraint[]::Vector{TopologyConstraint}) - hybridindex = Random.shuffle(1:length(net.hybrid)) # indices in net.hybrid +function fliphybrid!(net::HybridNetwork, minor::Bool, args...) + fliphybrid!(Random.default_rng(), net, minor, args...) +end +function fliphybrid!( + rng::Random.AbstractRNG, + net::HybridNetwork, + minor::Bool, + nohybridladder::Bool=false, + constraints::Vector{TopologyConstraint}=TopologyConstraint[] +) + hybridindex = Random.shuffle(rng, 1:length(net.hybrid)) # indices in net.hybrid while !isempty(hybridindex) # all minor edges i = pop!(hybridindex) undoinfo = fliphybrid!(net, net.hybrid[i], minor, nohybridladder, constraints) @@ -935,9 +993,13 @@ function fliphybrid!(net::HybridNetwork, minor=true::Bool, end """ - fliphybrid!(net::HybridNetwork, hybridnode::Node, minor=true::Bool, - nohybridladder=false::Bool, - constraints=TopologyConstraint[]::Vector{TopologyConstraint}) + fliphybrid!( + net::HybridNetwork, + hybridnode::Node, + minor::Bool=true, + nohybridladder::Bool=false, + constraints::Vector{TopologyConstraint}=TopologyConstraint[] + ) Flip the direction of a single hybrid edge: the minor parent edge of `hybridnode` by default, @@ -964,7 +1026,7 @@ Output: The network is unchanged if the flip is not admissible. If the flip is admissible, the root position may be modified, and -the direction of tree edges (via `isChild1`) is modified accordingly. If the +the direction of tree edges (via `ischild1`) is modified accordingly. If the root needs to be modified, then the new root is set to the old hybrid node. The index of the new hybrid node in `net.hybrid` is equal to that of the @@ -973,9 +1035,13 @@ old `hybridnode`. Warning: Undoing this move may not recover the original root if the root position was modified. """ -function fliphybrid!(net::HybridNetwork, hybridnode::Node, minor=true::Bool, - nohybridladder=false::Bool, - constraints=TopologyConstraint[]::Vector{TopologyConstraint}) +function fliphybrid!( + net::HybridNetwork, + hybridnode::Node, + minor::Bool=true, + nohybridladder::Bool=false, + constraints::Vector{TopologyConstraint}=TopologyConstraint[] +) #= for species constraints, there is nothing to check, because hybrids cannot point into or come out of the group for con in constraints if con.type == # 0x02/0x03 for types 2 and 3, need to consider more cases @@ -1047,14 +1113,14 @@ function fliphybrid!(net::HybridNetwork, hybridnode::Node, minor=true::Bool, edgetokeep.hybrid = false newhybridnode.hybrid = true newhybridedge.hybrid = true - newhybridedge.isMajor = minor - edgetokeep.isMajor = true - # update node order to keep isChild1 attribute of hybrid edges true - edgetoflip.isChild1 = !edgetoflip.isChild1 # just switch + newhybridedge.ismajor = minor + edgetokeep.ismajor = true + # update node order to keep ischild1 attribute of hybrid edges true + edgetoflip.ischild1 = !edgetoflip.ischild1 # just switch if getchild(newhybridedge) !== newhybridnode # includes the case when the newhybridnode was the root # then flip newhybridedge too: make it point towards newhybridnode - newhybridedge.isChild1 = !newhybridedge.isChild1 - net.root = findfirst(n -> n === hybridnode, net.node) + newhybridedge.ischild1 = !newhybridedge.ischild1 + net.rooti = findfirst(n -> n === hybridnode, net.node) runDirectEdges = true # many edges are likely to need to have directions flipped here end # give new hybridnode a name @@ -1063,12 +1129,12 @@ function fliphybrid!(net::HybridNetwork, hybridnode::Node, minor=true::Bool, # update gammas newhybridedge.gamma = edgetokeep.gamma edgetokeep.gamma = 1.0 - # update hybrids in network (before directEdges!) + # update hybrids in network (before directedges!) hybridindex = findfirst(n -> n === hybridnode, net.hybrid) net.hybrid[hybridindex] = newhybridnode if runDirectEdges # direct edges only if root is moved - directEdges!(net) - else # if not, only update containRoot attributes + directedges!(net) + else # if not, only update containroot attributes # norootbelow in child edges of newhybridedge for ce in newhybridnode.edge ce !== newhybridedge || continue # skip e @@ -1076,7 +1142,7 @@ function fliphybrid!(net::HybridNetwork, hybridnode::Node, minor=true::Bool, norootbelow!(ce) end # allow root for edges below old hybrid node - if edgetokeep.containRoot #else, already forbidden below due to hybrid above + if edgetokeep.containroot #else, already forbidden below due to hybrid above allowrootbelow!(hybridnode, edgetokeep) # old hybrid node end end diff --git a/src/moves_snaq.jl b/src/moves_snaq.jl deleted file mode 100644 index 36adf61d2..000000000 --- a/src/moves_snaq.jl +++ /dev/null @@ -1,1356 +0,0 @@ -# functions for moves: change direction, move origin, move target, nni -# originally functions.jl -# Claudia March 2015 - -# fixit: in moveOrigin/moveTarget when updating partitions with -# splice, looking for same partition twice (before and after splice), -# maybe there is a more efficient way to handle this - -# -------------------------- change direction of minor hybrid edge --------------------------------- - -# aux function to transform tree edge into hybrid edge -# input: new edge, hybrid node (needs to be attached to new edge) -# new gamma -# swtichHyb=true if called in hybridatnode -function makeEdgeHybrid!(edge::Edge,node::Node,gamma::Float64; switchHyb=false::Bool) - !edge.hybrid || error("edge $(edge.number) already hybrid, cannot make it hybrid") - node.hybrid || error("to make edge $(edge.number) hybrid, you need to give the hybrid node it is going to point to and node $(node.number) is not hybrid") - #println("estamos en make edge hybrid en edge $(edge.number) y node $(node.number)") - #println("vamos a hacer hashybedge true para $(getOtherNode(edge,node).number)") - #println("$(getOtherNode(edge,node).hasHybEdge) debe ser true") - size(edge.node,1) == 2 || error("strange edge $(edge.number) has $(size(edge.node,1)) nodes instead of 2") - if(isEqual(edge.node[1],node)) - edge.isChild1 = true - elseif(isEqual(edge.node[2],node)) - edge.isChild1 = false - else - error("node $(node.number) is not attached to edge $(edge.number)") - end - edge.hybrid = true - getOtherNode(edge,node).hasHybEdge = true - if switchHyb - edge.gamma = gamma; - edge.isMajor = (gamma>=0.5) ? true : false - else - setGamma!(edge,gamma,false) - end - edge.istIdentifiable = isEdgeIdentifiable(edge) - edge.containRoot = false -end - -# aux function to exchange who is the hybrid node -# input: current hybrid, new hybrid -# returns false if there is no need to updategammaz after -# true if there is need to updategammaz after -function exchangeHybridNode!(net::HybridNetwork, current::Node,new::Node) - (current.hybrid && !new.hybrid) || error("either current node $(current.number) is not hybrid: current.hybrid $(current.hybrid) or new node $(new.number) is already hybrid: new.hybrid $(new.hybrid)") - #println("find cycle for current node $(current.number)") - nocycle,edgesInCycle,nodesInCycle = identifyInCycle(net,current) - !nocycle || error("strange here: change direction on hybrid node $(current.number) that does not have a cycle to begin with") - #println("edges in cycle for node $(current.number) are $([e.number for e in edgesInCycle]) and nodes in cycle $([n.number for n in nodesInCycle])") - for e in edgesInCycle - e.inCycle = new.number - end - for n in nodesInCycle - n.inCycle = new.number - end - update = true - new.hybrid = true - new.k = current.k - removeHybrid!(net,current) - pushHybrid!(net,new) - current.hybrid = false - current.k = -1 - if(current.isBadDiamondI || current.isBadDiamondII) - current.isBadDiamondI = false - current.isBadDiamondII = false - update = false - elseif(current.isBadTriangle) - current.isBadTriangle = false - update = true - end - return update -end - - -# function to change the direction of a hybrid edge -# input: hybrid node, network, isminor=true: changes dir of minor edge -# warning: it assumes that undoGammaz has been run before -# and that the new hybridization has been -# approved by the containRoot criterion -# warning: it needs incycle attributes -# returns flag of whether it needs update gammaz, and alreadyNoRoot = !edgemin2.containRoot -function changeDirection!(node::Node, net::HybridNetwork, isminor::Bool) - node.hybrid || error("node $(node.number) is not hybrid, so we cannot change the direction of the hybrid edge") - major,minor,tree = hybridEdges(node); - othermin = getOtherNode(minor,node); - othermaj = getOtherNode(major,node); - othertree = getOtherNode(tree,node); - if(isminor) - edgebla,edgemin1,edgemin2 = hybridEdges(othermin); - nodemin1 = getOtherNode(edgemin1,othermin) - nodemin2 = getOtherNode(edgemin2,othermin) - removeEdge!(nodemin1,edgemin1) - removeEdge!(nodemin2,edgemin2) - removeEdge!(othermaj,major) - removeEdge!(othertree,tree) - removeNode!(nodemin1,edgemin1) - removeNode!(nodemin2,edgemin2) - removeNode!(othermaj,major) - removeNode!(othertree,tree) - setNode!(edgemin1,othermaj) - setNode!(major,nodemin1) - setNode!(edgemin2,othertree) - setNode!(tree,nodemin2) - setEdge!(othermaj,edgemin1) - setEdge!(nodemin1,major) - setEdge!(othertree,edgemin2) - setEdge!(nodemin2,tree) - tmajor = major.length - ttree = tree.length - tedmin1 = edgemin1.length - tedmin2 = edgemin2.length - setLength!(major,tedmin1) - setLength!(tree,tedmin2) - setLength!(edgemin1,tmajor) - setLength!(edgemin2,ttree) - # -- update partition - indexPedgemin = whichPartition(net,edgemin2,node.number) - indexPtree = whichPartition(net,tree,node.number) - ind = getIndex(edgemin2,net.partition[indexPedgemin].edges) - deleteat!(net.partition[indexPedgemin].edges,ind) - ind = getIndex(tree,net.partition[indexPtree].edges) - deleteat!(net.partition[indexPtree].edges,ind) - push!(net.partition[indexPtree].edges,edgemin2) - push!(net.partition[indexPedgemin].edges,tree) - # -- - @debug "edgemin2 is $(edgemin2.number) and its containRoot is $(edgemin2.containRoot)" - alreadyNoRoot = !edgemin2.containRoot - @debug "edgemin2 is $(edgemin2.number) and its containRoot is $(edgemin2.containRoot), alreadyNoRoot $(alreadyNoRoot)" - else - edgebla,edgemaj1,edgemaj2 = hybridEdges(othermaj); - nodemaj1 = getOtherNode(edgemaj1,othermaj) - nodemaj2 = getOtherNode(edgemaj2,othermaj) - removeEdge!(nodemaj1,edgemaj1) - removeEdge!(nodemaj2,edgemaj2) - removeEdge!(othermin,minor) - removeEdge!(othertree,tree) - removeNode!(nodemaj1,edgemaj1) - removeNode!(nodemaj2,edgemaj2) - removeNode!(othermin,minor) - removeNode!(othertree,tree) - setNode!(edgemaj1,othermin) - setNode!(minor,nodemaj1) - setNode!(edgemaj2,othertree) - setNode!(tree,nodemaj2) - setEdge!(othermin,edgemaj1) - setEdge!(nodemaj1,minor) - setEdge!(othertree,edgemaj2) - setEdge!(nodemaj2,tree) - tminor = minor.length - ttree = tree.length - tedmaj1 = edgemaj1.length - tedmaj2 = edgemaj2.length - setLength!(minor,tedmaj1) - setLength!(tree,tedmaj2) - setLength!(edgemaj1,tminor) - setLength!(edgemaj2,ttree) - # -- update partition - indexPedgemaj = whichPartition(net,edgemaj2,node.number) - indexPtree = whichPartition(net,tree,node.number) - ind = getIndex(edgemaj2,net.partition[indexPedgemaj].edges) - deleteat!(net.partition[indexPedgemaj].edges,ind) - ind = getIndex(tree,net.partition[indexPtree].edges) - deleteat!(net.partition[indexPtree].edges,ind) - push!(net.partition[indexPtree].edges,edgemaj2) - push!(net.partition[indexPedgemaj].edges,tree) - # -- - @debug "edgemaj2 is $(edgemaj2.number) and its containRoot is $(edgemaj2.containRoot)" - alreadyNoRoot = !edgemaj2.containRoot - @debug "edgemaj2 is $(edgemaj2.number) and its containRoot is $(edgemaj2.containRoot), alreadyNoRoot $(alreadyNoRoot)" - end - if(node.isBadDiamondI || node.isBadDiamondII) - node.isBadDiamondI = false - node.isBadDiamondII = false - return false, alreadyNoRoot - elseif(node.isBadTriangle) - return false, alreadyNoRoot - end - return true, alreadyNoRoot -end - -changeDirection!(node::Node, net::HybridNetwork) = changeDirection!(node, net, true) - -# function to change the direction of the minor hybrid edge -# and update necessary stepts before and after -# input: hybrid node and network, random=false, changes dir of minor edge always -# returns success -# if success=false, it undoes the change direction -function changeDirectionUpdate!(net::HybridNetwork,node::Node, random::Bool) - global CHECKNET - node.hybrid || error("cannot change the direction of minor hybrid edge since node $(node.number) is not hybrid") - undoGammaz!(node,net) - edgesRoot = identifyContainRoot(net,node); - #undoContainRoot!(edgesRoot); now inside updateContainRootChangeDir - if(random) - edges = hybridEdges(node) - edges[1].hybrid || error("hybrid node $(node.number) has as major edge a tree edge $(edges[1].number)") - edges[1].gamma >= 0.5 || error("major hybrid edge $(edges[1].number) has gamma less than 0.5: $(edges[1].gamma)") - minor = rand() < edges[1].gamma - else - minor = true - end - @debug "MOVE: change direction around hybrid node $(node.number) for minor $(minor)------- " - update, alreadyNoRoot = changeDirection!(node,net,minor) - if(node.k == 4 && update) - flag2, edgesgammaz = updateGammaz!(net,node) - else - flag2 = true - end - if(flag2) -# flag3,edgesroot = updateContainRoot!(net,node); now in updateContainRootChangeDir - flag3,edgesroot = updateContainRootChangeDir!(net,node,edgesRoot, alreadyNoRoot) - if(flag3) - parameters!(net); - @debug "MOVE: change direction around hybrid node $(node.number) SUCCESSFUL" - return true - else - @debug "MOVE: change direction around hybrid node $(node.number) FAILED because of containRoot" - CHECKNET && checkNet(net) - node.isBadDiamondI || undoGammaz!(node,net) - alreadyNoRoot || undoContainRoot!(edgesroot) #only undo edgesroot if there were changed: alreadyNoRoot=true => no change - update,a = changeDirection!(node,net,minor); - alreadyNoRoot == a || error("change direction alreadyNoRoot should match when done the first time and when undoing") - if(node.k == 4 && update) - flag2, edgesgammaz = updateGammaz!(net,node) - else - flag2 = true - end - flag2 || error("when undoing change direction, we should be able to update gammaz again") - alreadyNoRoot || undoContainRoot!(edgesRoot,false); - CHECKNET && checkNet(net) - return false - end - else - @debug "MOVE: change direction around hybrid node $(node.number) FAILED because of gammaz" - CHECKNET && checkNet(net) - node.isBadDiamondI || undoGammaz!(node,net) - update,a = changeDirection!(node,net,minor); - if(node.k == 4 && update) - flag2, edgesgammaz = updateGammaz!(net,node) - else - flag2 = true - end - flag2 || error("when undoing change direction, we should be able to update gammaz again") - #undoContainRoot!(edgesRoot,false); #redo containRoot as before NO NEED ANYMORE - CHECKNET && checkNet(net) - return false - end -end - -changeDirectionUpdate!(net::HybridNetwork,node::Node) = changeDirectionUpdate!(net,node, false) - - -# function that will take care of the case when one cycle is above another cycle -# edgesRoot come from identifyContainRoot before changeDirection -# this function should be run after changeDirection which gives alreadyNoRoot -# returns flag2, edgesroot -function updateContainRootChangeDir!(net::HybridNetwork,node::Node,edgesRoot::Vector{Edge}, alreadyNoRoot::Bool) - node.hybrid || error("cannot update contain root on node $(node.number) because it is not hybrid") - @debug "updating contain root for hybrid node $(node.number), with alreadyNoRoot $(alreadyNoRoot)" - if(!alreadyNoRoot) #only update root if new descendats were not forbidden to carry root already - undoContainRoot!(edgesRoot); - flag3,edgesroot = updateContainRoot!(net,node); - @debug "alreadyNoRoot is $(alreadyNoRoot), undoing containRoot for $([e.number for e in edgesRoot]), updating containRoot for $([e.number for e in edgesroot]), with flag3 $(flag3)" - return flag3,edgesroot - else - flag3,edgesroot = updateContainRoot!(net,node); - return flag3,edgesroot - end -end - - -# ------------------------- move origin of hybrid edge --------------------------------- - - -# function to choose an edge to move origin of hybrid -# but for a nni-like move: only to neighbors -# input: hybridnode for the move -# will choose one of 4 neighbor edges at random and see if -# it is suitable. if none is suitable, stops -# vector a is the vector of possible edges: comes from getNeighborsOrigin/Target -# returns: success (bool), edge, ind -function chooseEdgeOriginTarget!(neighbor::Vector{Edge}, node::Node) - length(neighbor) < 5 || error("neighbor should have at most 4 edges: $([n.number for n in neighbor])") - while(!isempty(neighbor)) - ind = rand(1:length(neighbor)) - if(!neighbor[ind].hybrid && (neighbor[ind].inCycle == -1 || neighbor[ind].inCycle == node.number)) - return true, neighbor[ind], ind - else - deleteat!(neighbor,ind) - end - end - return false, nothing, nothing -end - - - -# function to move the origin of a hybrid edge -# warning: it does not do any update -# input: necessary nodes/edges, see moveOriginUpdate and -# ipad notes -# warning: it changes the branch lengths of newedge, tree1, tree2 to match the -# optimum branch lengths in the corresponding other edge (see ipad notes) -# needed tree1 and tree2 as parameters because we need to do undogammaz before moveOrigin -# returns flag=true if newedge was incycle before, to be able to undo if needed (newedgeincycle) -function moveOrigin!(net::HybridNetwork,node::Node,othermin::Node,tree1::Edge, tree2::Edge,newedge::Edge, undo::Bool, newedgeincycle::Bool) - node.hybrid || error("cannot move origin of hybridization because node $(node.number) is not hybrid") - size(newedge.node,1) == 2 || error("strange edge $(newedge.number) that has $(size(newedge.node,1)) nodes instead of 2") - in(newedge,net.edge) || error("newedge $(newedge.number) not in net.edge") - @debug "othermin $(othermin.number) with edges $([e.number for e in othermin.edge])" - @debug "tree1 is $(tree1.number), tree2 is $(tree2.number)" - if(tree1.inCycle == node.number && tree2.inCycle == -1) - treej = tree1 - treei = tree2 - elseif(tree2.inCycle == node.number && tree1.inCycle == -1) - treej = tree2 - treei = tree1 - else - error("tree1 edge $(tree1.number) and tree2 edge $(tree2.number) should be one in cycle and one not incycle") - end - @debug "MOVE: newedge is $(newedge.number)" - @debug "treei is $(treei.number), treej is $(treej.number) (the one incycle)" - otheri = getOtherNode(treei,othermin); - otherj = getOtherNode(treej,othermin); - @debug "otheri is $(otheri.number), otherj is $(otherj.number)" - node1 = newedge.node[1]; # not waste of memory, needed step - node2 = newedge.node[2]; - @debug "node1 is $(node1.number), node2 is $(node2.number)" - neighbor = false - from_otheri = false - from_otherj = false - if(isEqual(otheri,node1)) - n1 = node1 - n2 = node2 - neighbor = true - from_otheri = true - elseif(isEqual(otheri,node2)) - n1 = node2 - n2 = node1 - neighbor = true - from_otheri = true - elseif(isEqual(otherj,node1)) - n1 = node1 - n2 = node2 - neighbor = true - from_otherj = true - elseif(isEqual(otherj,node2)) - n1 = node2 - n2 = node1 - neighbor = true - from_otherj = true - end - @debug "neighbor $(neighbor), from otheri $(otheri.number) $(from_otheri), from otherj $(otherj.number) $(from_otherj), n1 $(n1.number), n2 $(n2.number)" - if(neighbor && from_otheri) - ## println("leaving n1 $(n1.number) as it is") - ##println("removing n2 $(n2.number) from newedge $(newedge.number) and viceversa") - removeEdge!(n2,newedge) - removeNode!(n2,newedge) - #println("removing otherj $(otherj.number) from treej $(treej.number) and viceversa") - removeEdge!(otherj,treej) - removeNode!(otherj,treej) - #println("setting newedge $(newedge.number) to otherj $(otherj.number) and viceversa") - setNode!(newedge,otherj) - setEdge!(otherj,newedge) - #println("setting treej edge $(treej.number) to n2 $(n2.number) and viceversa") - setNode!(treej,n2) - setEdge!(n2,treej) - elseif(neighbor && from_otherj) - #println("leaving n1 $(n1.number) as it is") - #println("removing n2 $(n2.number) from newedge $(newedge.number) and viceversa") - removeEdge!(n2,newedge) - removeNode!(n2,newedge) - #println("removing otheri $(otheri.number) from treei edge $(treei.number) and viceversa") - removeEdge!(otheri,treei) - removeNode!(otheri,treei) - #println("setting newedge $(newedge.number) to otheri $(otheri.number) and viceversa") - setNode!(newedge,otheri) - setEdge!(otheri,newedge) - #println("setting treei edge $(treei.number) to n2 $(n2.number) and viceversa") - setNode!(treei,n2) - setEdge!(n2,treei) - else - error("move origin to edge $(newedge.number) not neighbor to tree1 edge $(tree1.number) nor tree2 edge $(tree2.number), function not debugged!") - other1 = getOtherNode(tree1,othermin); - other2 = getOtherNode(tree2,othermin); - removeEdge!(other1,tree1) - removeNode!(other1,tree1) - removeEdge!(node1,newedge) - removeNode!(node1,newedge) - setEdge!(other1,newedge) - setNode!(newedge,other1) - setEdge!(node1,tree1) - setNode!(tree1,node1) - removeEdge!(other2,tree2) - removeNode!(other2,tree2) - removeEdge!(node2,newedge) - removeNode!(node2,newedge) - setEdge!(other2,newedge) - setNode!(newedge,other2) - setEdge!(node2,tree2) - setNode!(tree2,node2) - end - ti = treei.length - tj = treej.length - t = newedge.length - setLength!(newedge,ti+tj) - if(approxEq(ti,0.0) && approxEq(tj,0.0)) - setLength!(treei,ti) - setLength!(treej,tj) - else - setLength!(treei,(ti/(ti+tj))*t) - setLength!(treej,(tj/(ti+tj))*t) - end - @debug begin printEdges(net); "printed edges" end - @debug writeTopologyLevel1(net) - if !undo - if from_otheri - # -- update partition - indexPtreei = whichPartition(net,treei,node.number) - ind = getIndex(newedge,net.partition[indexPtreei].edges) - deleteat!(net.partition[indexPtreei].edges,ind) - ind = getIndex(treei,net.partition[indexPtreei].edges) - deleteat!(net.partition[indexPtreei].edges,ind) - push!(net.partition[indexPtreei].edges,treej) - edges = hybridEdges(otheri) - for i in 1:3 #check of 3 edges inside hybridEdges - if(!isEqual(edges[i],treei) && !isEqual(edges[i],newedge)) - descendants = [edges[i]] - cycleNum = [node.inCycle] - getDescendants!(getOtherNode(edges[i],otheri),edges[i],descendants,cycleNum) - !isempty(descendants) || error("descendants is empty for node $(otheri.number)") - @debug "for node $(otheri.number), descendants are $([e.number for e in descendants]), and cycleNum is $(cycleNum)" - partition = Partition(unique(cycleNum),descendants) # create new partition - push!(net.partition, partition) - for e in descendants #delete edges from partition with tree originally - ind = getIndex(e,net.partition[indexPtreei].edges) - deleteat!(net.partition[indexPtreei].edges,ind) - end - net.partition[indexPtreei].cycle = union([node.inCycle],symdiff(net.partition[indexPtreei].cycle,cycleNum)) - break - end - end - # -- update in cycle - newedge.inCycle = node.number - switchCycleTree!(tree1,tree2,node) - node.k += 1 - otheri.inCycle = node.number - elseif(from_otherj) - if(newedge.inCycle == node.number) - # -- update partition - indexPtreei = whichPartition(net,treei,node.number) - push!(net.partition[indexPtreei].edges,treej) - push!(net.partition[indexPtreei].edges,newedge) - ind = getIndex(treei,net.partition[indexPtreei].edges) - deleteat!(net.partition[indexPtreei].edges,ind) - edges = hybridEdges(otherj) - for i in 1:3 #check of 3 edges inside hybridEdges - if(!isEqual(edges[i],treej) && !isEqual(edges[i],newedge)) - indexP = whichPartition(net,edges[i],node.number) - for e in net.partition[indexP].edges - push!(net.partition[indexPtreei].edges,e) - end - net.partition[indexPtreei].cycle = union(net.partition[indexPtreei].cycle,net.partition[indexP].cycle) - part = splice!(net.partition,indexP) #splice at the end to not change indexPtreei - break - end - end - # -- update in cycle - newedge.inCycle = -1 - switchCycleTree!(tree1,tree2,node) - otherj.inCycle = -1 - node.k -= 1 - return true - else - # -- update partition - indexPnew = whichPartition(net,newedge,node.number) - indexPtreei = whichPartition(net,treei,node.number) - ind = getIndex(newedge,net.partition[indexPnew].edges) - deleteat!(net.partition[indexPnew].edges,ind) - ind = getIndex(treei,net.partition[indexPtreei].edges) - deleteat!(net.partition[indexPtreei].edges,ind) - push!(net.partition[indexPnew].edges,treei) - push!(net.partition[indexPtreei].edges,newedge) - end - end - else #yes undo - if(newedge.inCycle == node.number) - # -- update partition - indexPtreei = whichPartition(net,treei,node.number) - push!(net.partition[indexPtreei].edges,treej) - push!(net.partition[indexPtreei].edges,newedge) - ind = getIndex(treei,net.partition[indexPtreei].edges) - deleteat!(net.partition[indexPtreei].edges,ind) - edges = hybridEdges(otherj) - for i in 1:3 #check of 3 edges inside hybridEdges - if(!isEqual(edges[i],treej) && !isEqual(edges[i],newedge)) - indexP = whichPartition(net,edges[i],node.number) - for e in net.partition[indexP].edges - push!(net.partition[indexPtreei].edges,e) - end - net.partition[indexPtreei].cycle = union(net.partition[indexPtreei].cycle,net.partition[indexP].cycle) - part = splice!(net.partition,indexP) #splice at the end - break - end - end - # -- update in cycle - newedge.inCycle = -1 - switchCycleTree!(tree1,tree2,node) - node.k -= 1 - otherj.inCycle = -1 - elseif(newedge.inCycle == -1) - if(newedgeincycle) - # -- update partition - indexPtreei = whichPartition(net,treei,node.number) - ind = getIndex(newedge,net.partition[indexPtreei].edges) - deleteat!(net.partition[indexPtreei].edges,ind) - ind = getIndex(treei,net.partition[indexPtreei].edges) - deleteat!(net.partition[indexPtreei].edges,ind) - push!(net.partition[indexPtreei].edges,treej) - edges = hybridEdges(otheri) - for i in 1:3 #check of 3 edges inside hybridEdges - if(!isEqual(edges[i],treei) && !isEqual(edges[i],newedge)) - descendants = [edges[i]] - cycleNum = [node.inCycle] - getDescendants!(getOtherNode(edges[i],otheri),edges[i],descendants,cycleNum) - !isempty(descendants) || error("descendants is empty for node $(otheri.number)") - @debug "for node $(otheri.number), descendants are $([e.number for e in descendants]), and cycleNum is $(cycleNum)" - partition = Partition(unique(cycleNum),descendants) # create new partition - push!(net.partition, partition) - for e in descendants #delete edges from partition with tree originally - ind = getIndex(e,net.partition[indexPtreei].edges) - deleteat!(net.partition[indexPtreei].edges,ind) - end - net.partition[indexPtreei].cycle = union([node.inCycle],symdiff(net.partition[indexPtreei].cycle,cycleNum)) - break - end - end - # -- update in cycle - newedge.inCycle = node.number - switchCycleTree!(tree1,tree2,node) - otheri.inCycle = node.number - node.k += 1 - else - # -- update partition - indexPnew = whichPartition(net,newedge,node.number) - indexPtreei = whichPartition(net,treei,node.number) - ind = getIndex(newedge,net.partition[indexPnew].edges) - deleteat!(net.partition[indexPnew].edges,ind) - ind = getIndex(treei,net.partition[indexPtreei].edges) - deleteat!(net.partition[indexPtreei].edges,ind) - push!(net.partition[indexPnew].edges,treei) - push!(net.partition[indexPtreei].edges,newedge) - end - end - end - return false -end - -moveOrigin!(net::HybridNetwork,node::Node,othermin::Node,tree1::Edge, tree2::Edge,newedge::Edge) = moveOrigin!(net,node,othermin,tree1, tree2,newedge, false,false) - -# function to switch the cycle of 2 tree edges in moveTarget -function switchCycleTree!(tree1::Edge, tree2::Edge, node::Node) - (!tree1.hybrid && !tree2.hybrid) || error("tree1 edge $(tree1.number) and tree2 $(tree2.number) cannot be hybrid to switch incycle attribute") - (tree1.inCycle == node.number && tree2.inCycle == -1) || (tree2.inCycle == node.number && tree1.inCycle == -1) || error("tree1 edge or tree2 edge must by in cycle by node $(node.number) and the other -1, but: $([tree1.inCycle, tree2.inCycle])") - k = tree1.inCycle - m = tree2.inCycle - tree2.inCycle = k - tree1.inCycle = m -end - -# function to choose minor/major hybrid edge -# to move the origin or target -# random=false always chooses the minor edge -# returns the othermin node and majoredge for target -function chooseMinorMajor(node::Node, random::Bool, target::Bool) - node.hybrid || error("node $(node.number) is not hybrid, so we cannot delete hybridization event around it") - major,minor,tree = hybridEdges(node); - #println("hybrid node $(node.number) has major $(major.number), minor $(minor.number) and tree $(tree.number)") - if random - r = rand() - major.gamma >= 0.5 || error("strange major hybrid edge $(major.number) with gamma $(major.gamma) less than 0.5") - @debug (major.gamma != 1.0 ? "" : - "strange major hybrid edge $(major.number) with gamma $(major.gamma) equal to 1.0") - othermin = r < major.gamma ? getOtherNode(minor,node) : getOtherNode(major,node) - majoredge = r < major.gamma ? major : minor - @debug (r < major.gamma ? "MOVE: will do move on minor hybrid edge" : - "MOVE: will do move on major hybrid edge") - else - @debug "MOVE: will do move on minor hybrid edge" - majoredge = major - othermin = getOtherNode(minor,node); - end - if target - return othermin, majoredge - else - return othermin - end -end - -chooseMinorMajor(node::Node, random::Bool) = chooseMinorMajor(node, random, false) - -# function to give the vector of edges neighbor -# that includes all the suitable neighbors of othermin -# to move the origin -function getNeighborsOrigin(othernode::Node) - othernode.hasHybEdge || error("other node $(othernode.number) should the attach to the hybrid edge whose origin will be moved") - !othernode.hybrid || error("other node $(othernode.number) must not be the hybrid node to move origin") - edges = hybridEdges(othernode) - length(edges) == 3 || error("length of node.edge for node $(othernode.number) should be 3, not $(length(edges))") - edges[1].hybrid || error("edge $(edges[1].number) should be hybrid because it is the one to move the origin from") - neighbor = Edge[] - n1 = getOtherNode(edges[2],othernode) - n2 = getOtherNode(edges[3],othernode) - if(!n1.leaf) - e = hybridEdges(n1,edges[2]) - length(e) == 2 || error("node $(n1.number) is not a leaf but has $(length(e)+1) edges") - push!(neighbor, e[1]) - push!(neighbor, e[2]) - end - if(!n2.leaf) - e = hybridEdges(n2,edges[3]) - length(e) == 2 || error("node $(n1.number) is not a leaf but has $(length(e)+1) edges") - push!(neighbor, e[1]) - push!(neighbor, e[2]) - end - return neighbor -end - -# function to move the origin of a hybrid edge -# and update everything that needs update: gammaz -# input: network, hybrid node, othermin already chosen with chooseMinorMajor -# returns: success (bool), flag, nocycle, flag2 -function moveOriginUpdate!(net::HybridNetwork, node::Node, othermin::Node, newedge::Edge) - global CHECKNET - node.hybrid || error("node $(node.number) is not hybrid, so we cannot delete hybridization event around it") - @debug "MOVE: move Origin for hybrid node $(node.number)" - in(newedge,net.edge) || error("newedge $(newedge.number) not in net.edge") - edgebla, tree1, tree2 = hybridEdges(othermin); - undoGammaz!(node,net); - #println("othermin is $(othermin.number)") - newedgeincycle = moveOrigin!(net,node,othermin,tree1,tree2,newedge) - flag2, edgesGammaz = updateGammaz!(net,node) - if(flag2) - parameters!(net); - @debug "MOVE: move Origin for hybrid node $(node.number) SUCCESSFUL" - return true,flag2 - else - @debug "MOVE: move Origin for hybrid node $(node.number) FAILED" - CHECKNET && checkNet(net) - isempty(edgesGammaz) || undoistIdentifiable!(edgesGammaz) - undoGammaz!(node,net); - @debug "MOVE: undoing move origin for conflict: gammaz" - moveOrigin!(net,node,othermin,tree1,tree2,newedge,true,newedgeincycle); - flag2, edgesGammaz = updateGammaz!(net,node) - (flag2 || node.isVeryBadTriangle || node.isExtBadTriangle) || error("updating gammaz for undone moveOrigin, should not be any problem") - CHECKNET && checkNet(net) - return false, flag2 - end -end - -# function to repeat moveOriginUpdate with all the neighbors -# until success or failure of all for a given hybrid node -# returns success (bool): failure from: neighbors not suitable to begin -# with, or conflicts incycle -function moveOriginUpdateRepeat!(net::HybridNetwork, node::Node, random::Bool) - node.hybrid || error("cannot move origin because node $(node.number) is not hybrid") - othermin = chooseMinorMajor(node,random) - #println("othermin is $(othermin.number) with edges $([e.number for e in othermin.edge])") - neighbor = getNeighborsOrigin(othermin) - #println("neighbors list is $([n.number for n in neighbor])") - success = false - while(!isempty(neighbor) && !success) - success1,newedge,ind = chooseEdgeOriginTarget!(neighbor,node) - !isa(newedge,Nothing) || return false - success1 || return false - #println("newedge is $(newedge.number), success1 is $(success1)") - in(newedge,net.edge) || error("newedge $(newedge.number) is not in net.edge") - success,flag2 = moveOriginUpdate!(net, node, othermin, newedge) - #println("after update, success is $(success)") - if(!success) - @debug "move origin failed, will delete that neighbor and try new one" - deleteat!(neighbor,ind) - end - #println("neighbor list is $([n.number for n in neighbor])") - end - success || return false - return true -end - -# ----------------- move target of hybridization ------------------------------- -""" - getNeighborsTarget(hybrid_node, majoredge) - -Vector of edges that are incident to either: -- the node incident to `majoredge` other than `hybrid_node`, or -- the tree child of `hybrid_node`. - -This vector of edges is used as the list of suitable neighbors of "othermin" -to move the target of a hybrid edge, in `moveTargetUpdateRepeat!`. -""" -function getNeighborsTarget(node::Node,majoredge::Edge) - node.hybrid || error("node $(node.number) must be the hybrid node to move target") - major,minor,tree = hybridEdges(node) - neighbor = Edge[] - n1 = getOtherNode(majoredge,node) - n2 = getOtherNode(tree,node) - if(!n1.leaf) - e = hybridEdges(n1,majoredge) - length(e) == 2 || error("node $(n1.number) is not a leaf but has $(length(e)+1) edges") - push!(neighbor, e[1]) - push!(neighbor, e[2]) - end - if(!n2.leaf) - e = hybridEdges(n2,tree) - length(e) == 2 || error("node $(n1.number) is not a leaf but has $(length(e)+1) edges") - push!(neighbor, e[1]) - push!(neighbor, e[2]) - end - return neighbor -end - -# function to switch major and tree node in moveTarget -function switchMajorTree!(major::Edge, tree::Edge, node::Node) - !tree.hybrid || error("tree edge $(tree.number) cannot be hybrid to switch to major") - major.hybrid || error("major edge $(major.number) has to be hybrid to switch to tree") - @debug "switch major $(major.number) tree $(tree.number), node $(node.number)" - g = major.gamma #needed because changed inside makeEdgeTree - cycle = major.inCycle #needed because changed inside makeEdgeTree - makeEdgeTree!(major,node) - makeEdgeHybrid!(tree,node,g) - tree.inCycle = cycle - major.inCycle = -1 -end - -# function to move the target of a hybrid edge -# warning: it does not do any update -# input: necessary nodes/edges, see moveOriginUpdate and -# ipad notes, undo=true if it is undoing a previous moveTarget -# warning: it changes the branch lengths of newedge, tree1, tree2 to match the -# optimum branch lengths in the corresponding other edge (see ipad notes) -# returns flag=true if newedge was incycle before, to be able to undo if needed (newedgeincycle) -# also returns alreadyNoRoot -function moveTarget!(net::HybridNetwork,node::Node, major::Edge, tree::Edge, newedge::Edge, undo::Bool, newedgeincycle::Bool) - node.hybrid || error("cannot move origin of hybridization because node $(node.number) is not hybrid") - length(newedge.node) == 2 || error("strange edge $(newedge.number) that has $(size(newedge.node,1)) nodes instead of 2") - newedge.inCycle == node.number || newedge.inCycle == -1 || error("newedge in cycle must be -1 or $(node.number), not $(newedge.inCycle)") - in(newedge,net.edge) || error("newedge $(newedge.number) not in net.edge") - othermajor = getOtherNode(major,node); - treenode = getOtherNode(tree,node); - node1 = newedge.node[1]; # not waste of memory, needed step - node2 = newedge.node[2]; - @debug "MOVE: hybrid node is $(node.number), major edge $(major.number), tree edge $(tree.number)" - @debug "MOVE: newedge is $(newedge.number), othermajor $(othermajor.number), treenode $(treenode.number), node1 $(node1.number), node2 $(node2.number)" - neighbor = false - from_othermajor = false - from_treenode = false - if(isEqual(othermajor,node1)) - n1 = node1 - n2 = node2 - neighbor = true - from_othermajor = true - elseif(isEqual(othermajor,node2)) - n1 = node2 - n2 = node1 - neighbor = true - from_othermajor = true - elseif(isEqual(treenode,node1)) - n1 = node1 - n2 = node2 - neighbor = true - from_treenode = true - elseif(isEqual(treenode,node2)) - n1 = node2 - n2 = node1 - neighbor = true - from_treenode = true - end - # -- alreadyNoRoot? - if(newedge.inCycle != -1) - alreadyNoRoot = false - else - if(neighbor && from_othermajor) - alreadyNoRoot = !newedge.containRoot - elseif(neighbor && from_treenode) - for e in node.edge - if(!isEqual(e,major) && !isEqual(e,tree)) #looking for minor edge - o = getOtherNode(e,node) - for e2 in o.edge - if(!e2.hybrid && e2.inCycle != -1) - alreadyNoRoot = !e2.containRoot - break - end - end - break - end - end - elseif(!neighbor) - alreadyNoRoot = false - end - end - @debug "neighbor $(neighbor), from othermajor $(from_othermajor), from treenode $(from_treenode), n1 $(n1.number), n2 $(n2.number), alreadyNoRoot $(alreadyNoRoot)" - if(neighbor && from_othermajor) - #println("leaving n1 $(n1.number) as it is") - #println("removing n2 $(n2.number) from newedge $(newedge.number) and viceversa") - removeEdge!(n2,newedge) - removeNode!(n2,newedge) - #println("removing treenode $(treenode.number) from tree edge $(tree.number) and viceversa") - removeEdge!(treenode,tree) - removeNode!(treenode,tree) - #println("setting newedge $(newedge.number) to treenode $(treenode.number) and viceversa") - setNode!(newedge,treenode) - setEdge!(treenode,newedge) - #println("setting tree edge $(tree.number) to n2 $(n2.number) and viceversa") - setNode!(tree,n2) - setEdge!(n2,tree) - elseif(neighbor && from_treenode) - #println("leaving n1 $(n1.number) as it is") - #println("removing n2 $(n2.number) from newedge $(newedge.number) and viceversa") - removeEdge!(n2,newedge) - removeNode!(n2,newedge) - #println("removing othermajor $(othermajor.number) from major edge $(major.number) and viceversa") - removeEdge!(othermajor,major) - removeNode!(othermajor,major) - #println("setting newedge $(newedge.number) to othermajor $(othermajor.number) and viceversa") - setNode!(newedge,othermajor) - setEdge!(othermajor,newedge) - #println("setting major edge $(major.number) to n2 $(n2.number) and viceversa") - setNode!(major,n2) - setEdge!(n2,major) - else - error("move target to edge $(newedge.number) not neighbor to major edge $(major.number) nor tree edge $(tree.number), function not debugged!") - #println("removing major edge $(major.number) from othermajor node $(othermajor.number) and viceverse") - removeEdge!(othermajor,major) - removeNode!(othermajor,major) - #println("removing treenode $(treenode.number) from tree edge $(tree.number) and viceversa") - removeEdge!(treenode,tree) - removeNode!(treenode,tree) - #println("removing node1 $(node1.number) from newedge $(newedge.number) and viceversa") - removeEdge!(node1,newedge) - removeNode!(node1,newedge) - #println("removing node2 $(node2.number) from newedge $(newedge.number) and viceversa") - removeEdge!(node2,newedge) - removeNode!(node2,newedge) - #println("setting newedge $(newedge.number) to othermajor $(othermajor.number) and viceversa") - setNode!(newedge,othermajor) - setEdge!(othermajor,newedge) - #println("setting newedge $(newedge.number) to treenode $(treenode.number) and viceversa") - setNode!(newedge,treenode) - setEdge!(treenode,newedge) - #println("setting major edge $(major.number) to node1 $(node1.number) and viceversa") - setNode!(major,node1) - setEdge!(node1,major) - #println("setting tree edge $(tree.number) to node2 $(node2.number) and viceversa") - setNode!(tree,node2) - setEdge!(node2,tree) - end - t1 = major.length - t2 = tree.length - t = newedge.length - setLength!(newedge,t1+t2) - if(approxEq(t1,0.0) && approxEq(t2,0.0)) - setLength!(major,t1) - setLength!(tree,t2) - else - setLength!(major,t1/(t1+t2)*t) - setLength!(tree,t2/(t1+t2)*t) - end - if(!undo) - if(from_treenode) - # -- update partition - indexPtree = whichPartition(net,tree,node.number) - ind = getIndex(newedge,net.partition[indexPtree].edges) - deleteat!(net.partition[indexPtree].edges,ind) - ind = getIndex(tree,net.partition[indexPtree].edges) - deleteat!(net.partition[indexPtree].edges,ind) - push!(net.partition[indexPtree].edges,major) - edges = hybridEdges(treenode) - for i in 1:3 #check of 3 edges inside hybridEdges - if(!isEqual(edges[i],tree) && !isEqual(edges[i],newedge)) - descendants = [edges[i]] - cycleNum = [node.inCycle] - getDescendants!(getOtherNode(edges[i],treenode),edges[i],descendants,cycleNum) - !isempty(descendants) || error("descendants is empty for node $(treenode.number)") - @debug "for node $(treenode.number), descendants are $([e.number for e in descendants]), and cycleNum is $(cycleNum)" - partition = Partition(unique(cycleNum),descendants) # create new partition - push!(net.partition, partition) - for e in descendants #delete edges from partition with tree originally - ind = getIndex(e,net.partition[indexPtree].edges) - deleteat!(net.partition[indexPtree].edges,ind) - end - net.partition[indexPtree].cycle = union([node.inCycle],symdiff(net.partition[indexPtree].cycle,cycleNum)) - break - end - end - # -- update in cycle - @debug "from treenode treatment, switch major $(major.number) to tree $(tree.number)" - switchMajorTree!(major,tree,node) - node.k += 1 - newedge.inCycle = node.number - treenode.inCycle = node.number - elseif(from_othermajor) - if(newedge.inCycle == node.number) - @debug "from othermajor and newedge incycle treatment, switch major $(major.number) to tree $(tree.number)" - # -- update partition - indexPtree = whichPartition(net,tree,node.number) - push!(net.partition[indexPtree].edges,major) - push!(net.partition[indexPtree].edges,newedge) - ind = getIndex(tree,net.partition[indexPtree].edges) - deleteat!(net.partition[indexPtree].edges,ind) - edges = hybridEdges(othermajor) - for i in 1:3 #check of 3 edges inside hybridEdges - if(!isEqual(edges[i],major) && !isEqual(edges[i],newedge)) - indexP = whichPartition(net,edges[i],node.number) - for e in net.partition[indexP].edges - push!(net.partition[indexPtree].edges,e) - end - net.partition[indexPtree].cycle = union(net.partition[indexPtree].cycle,net.partition[indexP].cycle) - part = splice!(net.partition,indexP) #splice at the end - break - end - end - # -- update inCycle - switchMajorTree!(major,tree,node) - node.k -= 1 - newedge.inCycle = -1 - othermajor.inCycle = -1 - return true, alreadyNoRoot - else - # -- update partition - indexPnew = whichPartition(net,newedge,node.number) - indexPtree = whichPartition(net,tree,node.number) - ind = getIndex(newedge,net.partition[indexPnew].edges) - deleteat!(net.partition[indexPnew].edges,ind) - ind = getIndex(tree,net.partition[indexPtree].edges) - deleteat!(net.partition[indexPtree].edges,ind) - push!(net.partition[indexPnew].edges,tree) - push!(net.partition[indexPtree].edges,newedge) - # -- update in cycle - major.istIdentifiable = isEdgeIdentifiable(major) - end - end - else - if(from_treenode) - # -- update partition - indexPmajor = whichPartition(net,major,node.number) - push!(net.partition[indexPmajor].edges,tree) - push!(net.partition[indexPmajor].edges,newedge) - ind = getIndex(major,net.partition[indexPmajor].edges) - deleteat!(net.partition[indexPmajor].edges,ind) - edges = hybridEdges(treenode) - for i in 1:3 #check of 3 edges inside hybridEdges - if(!isEqual(edges[i],tree) && !isEqual(edges[i],newedge)) - indexP = whichPartition(net,edges[i],node.number) - for e in net.partition[indexP].edges - push!(net.partition[indexPmajor].edges,e) - end - net.partition[indexPmajor].cycle = union(net.partition[indexPmajor].cycle,net.partition[indexP].cycle) - part = splice!(net.partition,indexP) #splice at the end - break - end - end - # -- update in cycle - switchMajorTree!(tree,major,node) - node.k -= 1 - newedge.inCycle = -1 - treenode.inCycle = -1 - elseif(from_othermajor) - if(newedgeincycle) - # -- update partition - indexPmajor = whichPartition(net,major,node.number) - ind = getIndex(major,net.partition[indexPmajor].edges) - deleteat!(net.partition[indexPmajor].edges,ind) #delete major - ind = getIndex(newedge,net.partition[indexPmajor].edges) - deleteat!(net.partition[indexPmajor].edges,ind) # delete newedge - push!(net.partition[indexPmajor].edges,tree) # add tree - edges = hybridEdges(othermajor) - for i in 1:3 #check of 3 edges inside hybridEdges - if(!isEqual(edges[i],major) && !isEqual(edges[i],newedge)) - descendants = [edges[i]] - cycleNum = [node.inCycle] - getDescendants!(getOtherNode(edges[i],othermajor),edges[i],descendants,cycleNum) - !isempty(descendants) || error("descendants is empty for node $(othermajor.number)") - @debug "for node $(othermajor.number), descendants are $([e.number for e in descendants]), and cycleNum is $(cycleNum)" - partition = Partition(unique(cycleNum),descendants) # create new partition - push!(net.partition, partition) - for e in descendants #delete edges from partition with major originally - ind = getIndex(e,net.partition[indexPmajor].edges) - deleteat!(net.partition[indexPmajor].edges,ind) - end - net.partition[indexPmajor].cycle = union([node.inCycle],symdiff(net.partition[indexPmajor].cycle,cycleNum)) - break - end - end - # -- update inCycle - switchMajorTree!(tree,major,node) - node.k += 1 - newedge.inCycle = node.number - othermajor.inCycle = node.number - else - # -- update partition - indexPnew = whichPartition(net,newedge,node.number) - indexPtree = whichPartition(net,tree,node.number) - ind = getIndex(newedge,net.partition[indexPnew].edges) - deleteat!(net.partition[indexPnew].edges,ind) - ind = getIndex(tree,net.partition[indexPtree].edges) - deleteat!(net.partition[indexPtree].edges,ind) - push!(net.partition[indexPnew].edges,tree) - push!(net.partition[indexPtree].edges,newedge) - # -- update in cycle - major.istIdentifiable = isEdgeIdentifiable(major) - end - end - end - return false, alreadyNoRoot -end - -moveTarget!(net::HybridNetwork,node::Node, major::Edge, tree::Edge, newedge::Edge) = moveTarget!(net,node, major, tree, newedge, false, false) - -# function to move the target of a hybrid edge -""" - moveTargetUpdate!(net, hybrid_node, majoredge, newedge) - -Modify a level-1 network `net` by moving `majoredge`, which should be a -hybrid edge parent of `hybrid_node`. -Within SNaQ, `majoredge` is chosen by `chooseMinorMajor`. -- calls `moveTarget!(net,hybrid_node, majoredge, treeedge_belowhybrid, newedge)`, - which does the move but does not update any attributes -- updates all level-1 attributes needed for SNaQ: gammaz, containRoot -- un-does the move and updates if the move is invalid, - through another call to `moveTarget!` but with the "undo" option. - -`newedge` should be a tree edge (enforced by `chooseEdgeOriginTarget!`) -adjacent to the parent node of `majoredge` or to the tree child of `hybrid_node` -(enforced by `getNeighborsTarget`) - -Output: tuple of 3 booleans `(success, flag_triangle, flag_root)`. -- `success` is false if the move failed (lead to an invalid network for SNaQ) -- `flag_triangle` is false if `net.hasVeryBadTriangle` -- `flag_root` is false if the set of edges to place the root is empty -If `success` is false, then the flags are not meant to be used downstream. -""" -function moveTargetUpdate!(net::HybridNetwork, node::Node, majoredge::Edge, newedge::Edge) - global CHECKNET - node.hybrid || error("node $(node.number) is not hybrid, so we cannot delete hybridization event around it") - @debug "MOVE: move Target for hybrid node $(node.number)" - # reject the move if `node` is in a 3-cycle and `newedge` is in that cycle - if node.k == 3 && newedge.inCycle == node.number - # then invalid move: would create a 2-cycle - node.isBadTriangle || @warn "network with a not-nice 3-cycle (at least 1 block has a single taxon)" - return false,false,false - end - in(newedge,net.edge) || error("newedge $(newedge.number) not in net.edge") - major,minor,tree = hybridEdges(node) - undoGammaz!(node,net); - edgesRoot = identifyContainRoot(net,node); - edgesRoot = setdiff(edgesRoot,[tree]) #need to remove tree from edgesRoot or it will be undone/updated with containRoot - #undoContainRoot!(edgesRoot); now in updateContainRootChangeDir - #@debug "undoContainRoot for edges $([e.number for e in edgesRoot])" - newedgeincycle, alreadyNoRoot = moveTarget!(net,node,majoredge,tree,newedge) - flag2, edgesGammaz = updateGammaz!(net,node) - if flag2 -# flag3,edgesroot = updateContainRoot!(net,node) now in updateContainRootChangeDir - flag3,edgesroot = updateContainRootChangeDir!(net,node,edgesRoot, alreadyNoRoot) - if flag3 - parameters!(net); - @debug "MOVE: move Target for hybrid node $(node.number) SUCCESSFUL" - return true,flag2, flag3 - else - @debug "MOVE: move Target for hybrid node $(node.number) FAILED" - @debug begin printEverything(net); "printed everything" end - alreadyNoRoot || undoContainRoot!(edgesroot) #only undo edgesroot if there were changed: alreadyNoRoot=true => no change - alreadyNoRoot || undoContainRoot!(edgesRoot,false); - isempty(edgesGammaz) || undoistIdentifiable!(edgesGammaz) - undoGammaz!(node,net); - @debug "MOVE: undoing move target for conflict: updategammaz" - moveTarget!(net,node,majoredge,tree,newedge,true,newedgeincycle); - flag2, edgesGammaz = updateGammaz!(net,node) - #@debug "undoContainRoot for edges $([e.number for e in edgesRoot])" - (flag2 || node.isVeryBadTriangle || node.isExtBadTriangle) || error("updating gammaz/root for undone moveTarget, should not be any problem, but flag2 $(flag2) and node not very/ext bad triangle") - CHECKNET && checkNet(net) - return false, flag2,flag3 - end - else - @debug "MOVE: move Target for hybrid node $(node.number) FAILED" - @debug begin printEverything(net); "printed everything" end - if CHECKNET - flag3,edgesroot = updateContainRootChangeDir!(net,node,edgesRoot, alreadyNoRoot) #only to be sure there are no errors in the modified net - checkNet(net) - alreadyNoRoot || undoContainRoot!(edgesroot) #only undo edgesroot if there were changed: alreadyNoRoot=true => no change - alreadyNoRoot || undoContainRoot!(edgesRoot,false); - end - isempty(edgesGammaz) || undoistIdentifiable!(edgesGammaz) - undoGammaz!(node,net); - @debug "MOVE: undoing move target for conflict: updategammaz" - moveTarget!(net,node,majoredge,tree,newedge,true,newedgeincycle); - flag2, edgesGammaz = updateGammaz!(net,node) - #@debug "undoContainRoot for edges $([e.number for e in edgesRoot])" - (flag2 || node.isVeryBadTriangle || node.isExtBadTriangle) || error("updating gammaz/root for undone moveTarget, should not be any problem, but flag2 $(flag2) and node not very/ext bad triangle") - CHECKNET && checkNet(net) - return false, flag2, false - end -end - - -# function to repeat moveTargetUpdate with all the neighbors -# until success or failure of all for a given hybrid node -# returns success (bool): failure from: neighbors not suitable to begin -# with, or conflicts incycle -function moveTargetUpdateRepeat!(net::HybridNetwork, node::Node, random::Bool) - node.hybrid || error("cannot move origin because node $(node.number) is not hybrid") - othermin,majoredge = chooseMinorMajor(node,random, true) - #println("othermin is $(othermin.number), will move edge: majoredge $(majoredge.number)") - neighbor = getNeighborsTarget(node,majoredge) - #println("neighbors list is $([n.number for n in neighbor])") - success = false - while(!isempty(neighbor) && !success) - success1,newedge,ind = chooseEdgeOriginTarget!(neighbor,node); - success1 || return false - #println("newedge is $(newedge.number), success1 is $(success1)") - in(newedge,net.edge) || error("newedge $(newedge.number) not in net.edge") - success,flag2 = moveTargetUpdate!(net, node, majoredge,newedge) - #println("after update, success is $(success)") - if(!success) - @debug "move target failed, will delete neighbor and try new one" - deleteat!(neighbor,ind) - end - #println("neighbor list is $([n.number for n in neighbor])") - end - return success -end - - -# ------------------------------------- tree move NNI ------------------------------------------- - -# function to check if an edge is internal edge -function isInternalEdge(edge::Edge) - length(edge.node) == 2 || error("edge $(edge.number) has $(length(edge.node)) nodes, should be 2") - return !edge.node[1].leaf && !edge.node[2].leaf -end - -# function to check if the two node of an edge -# do not have hybrid edges -function hasNeighborHybrid(edge::Edge) - length(edge.node) == 2 || error("edge $(edge.number) has $(length(edge.node)) nodes, should be 2") - return edge.node[1].hasHybEdge || edge.node[2].hasHybEdge -end - -# function to choose a tree edge for NNI -# its two nodes must have hasHybEdge=false -function chooseEdgeNNI(net::Network,N::Integer) - N > 0 || error("N must be positive: $(N)") - index1 = 0 - i = 0 - while((index1 == 0 || index1 > size(net.edge,1) || net.edge[index1].hybrid || hasNeighborHybrid(net.edge[index1]) || !isInternalEdge(net.edge[index1])) && i < N) - index1 = round(Integer,rand()*size(net.edge,1)); - i += 1 - end - if(i < N) - return true,net.edge[index1] - else - @debug "cannot find suitable tree edge for NNI after $(N) attempts" - return false,nothing - end -end - - -# tree move NNI -# it does not consider keeping the same setup -# as a possibility -# input: edge from chooseEdgeNNI -# returns success; failure if cannot do nni without creating intersecting cycles -function NNI!(net::Network,edge::Edge) - !edge.hybrid || error("cannot do NNI on hybrid edge: $(edge.number)") - @debug "MOVE: NNI on tree edge $(edge.number)" - edges1 = hybridEdges(edge.node[1],edge) - edges2 = hybridEdges(edge.node[2],edge) - (!edges1[1].hybrid && !edges1[2].hybrid) || error("cannot do tree move NNI if one of the edges is hybrid: check neighbors of edge $(edge.number)") - (!edges2[1].hybrid && !edges2[2].hybrid) || error("cannot do tree move NNI if one of the edges is hybrid: check neighbors of edge $(edge.number)") - if(rand() < 0.5) - e1 = edges1[1] - e2 = edges1[2] - else - e1 = edges1[2] - e2 = edges1[1] - end - if(rand() < 0.5) - e3 = edges2[1] - e4 = edges2[2] - else - e3 = edges2[2] - e4 = edges2[1] - end - t1 = e1.length - t = edge.length - t4 = e4.length - n1 = edge.node[1] - n2 = edge.node[2] - nohybrid = false - @debug "e1 is $(e1.number), e2 is $(e2.number), e3 is $(e3.number), e4 is $(e4.number), n1 is $(n1.number), n2 is $(n2.number)" - if(edge.inCycle != -1) - node = net.node[getIndexNode(edge.inCycle,net)] - node.hybrid || error("edge $(edge.number) has incycle $(edge.inCycle) but node $(node.number) is not hybrid") - (n1.inCycle == edge.inCycle && n2.inCycle == edge.inCycle) || error("edge $(edge.number) is in cycle $(edge.inCycle) but its nodes are not: $(n1.number), $(n2.number)") - if((e2.inCycle == e3.inCycle == edge.inCycle && e1.inCycle == e4.inCycle == -1) || (e1.inCycle == e4.inCycle == edge.inCycle && e2.inCycle == e3.inCycle == -1)) - nothing - elseif((e2.inCycle == e4.inCycle == edge.inCycle && e1.inCycle == e3.inCycle == -1) || (e1.inCycle == e3.inCycle == edge.inCycle && e2.inCycle == e4.inCycle == -1)) - # -- update partition - if(e2.inCycle != -1) - indexPe3 = whichPartition(net,e3,node.number) - part = splice!(net.partition,indexPe3) # delete partition e3 - indexPe1 = whichPartition(net,e1,node.number) - for e in part.edges - push!(net.partition[indexPe1].edges,e) #put into partition e1 - end - push!(net.partition[indexPe1].edges,edge) #put edge into partition e1 - net.partition[indexPe1].cycle = union(net.partition[indexPe1].cycle,part.cycle) - else - indexPe2 = whichPartition(net,e2,node.number) - part = splice!(net.partition,indexPe2) # delete partition e2 - indexPe4 = whichPartition(net,e4,node.number) - @debug "deleted partition $([e.number for e in part.edges]) from net.partition" - for e in part.edges - @debug "partition for e4 is $([e.number for e in net.partition[indexPe4].edges]), pushing edge $(e.number)" - push!(net.partition[indexPe4].edges,e) #put into partition e4 - end - @debug "partition for e4 is $([e.number for e in net.partition[indexPe4].edges]), pushing edge $(edge.number)" - push!(net.partition[indexPe4].edges,edge) #put edge into partition e4 - @debug "added the edges of such partition to partition of e4, so new partition is $([e.number for e in net.partition[indexPe4].edges])" - net.partition[indexPe4].cycle = union(net.partition[indexPe4].cycle,part.cycle) - @debug "new partition has cycle $(net.partition[indexPe4].cycle)" - end - # -- update inCycle - @debug "incycle e1 $(e1.inCycle), e2 $(e2.inCycle), e3 $(e3.inCycle), e4 $(e4.inCycle), edge $(edge.inCycle)" - if(e2.inCycle == e4.inCycle == edge.inCycle) - edge.inCycle = -1 - n1.inCycle = -1 - node.k -= 1; - elseif(e1.inCycle == e3.inCycle == edge.inCycle) - edge.inCycle = -1 - n2.inCycle = -1 - node.k -= 1; - end - else - error("internal edge $(edge.number) is in cycle $(edge.inCycle), but it is not consistent with other edges") - end - else #edge not in cycle - (e1.inCycle == e2.inCycle && e3.inCycle == e4.inCycle) || error("both edges in edges1 $([e.number for e in edges1]) (or edges2 $([e.number for e in edges2])) must have the same inCycle attribute") - if(e1.inCycle != -1 && e3.inCycle != -1) - @debug "cannot do tree NNI because it will create intersecting cycles, nothing done. e1,e2,e3,e4: $([e1.number,e2.number,e3.number,e4.number])" - return false - elseif(e1.inCycle != -1 && e3.inCycle == -1) - node = net.node[getIndexNode(e1.inCycle,net)] - node.hybrid || error("edge $(ed1.number) has incycle $(ed1.inCycle) but node $(node.number) is not hybrid") - # -- update partition - indexP = whichPartition(net,edge,node.number) # find partition where edge is - ind = getIndex(edge,net.partition[indexP].edges) - deleteat!(net.partition[indexP].edges,ind) - edges = hybridEdges(n2) - for i in 1:3 #check of 3 edges inside hybridEdges - if(!isEqual(edges[i],e4) && !isEqual(edges[i],edge)) - descendants = [edges[i]] - cycleNum = [node.inCycle] - getDescendants!(getOtherNode(edges[i],n2),edges[i],descendants,cycleNum) - !isempty(descendants) || error("descendants is empty for node $(n2.number)") - @debug "for node $(n2.number), descendants are $([e.number for e in descendants]), and cycleNum is $(cycleNum)" - partition = Partition(unique(cycleNum),descendants) # create new partition - push!(net.partition, partition) - for e in descendants #delete edges from partition with tree originally - ind = getIndex(e,net.partition[indexP].edges) - deleteat!(net.partition[indexP].edges,ind) - end - net.partition[indexP].cycle = union([node.inCycle],symdiff(net.partition[indexP].cycle,cycleNum)) - break - end - end - # -- update in cycle - edge.inCycle = e1.inCycle - n2.inCycle = e1.inCycle - node.k += 1 - elseif(e3.inCycle != -1 && e1.inCycle == -1) - node = net.node[getIndexNode(e3.inCycle,net)] - node.hybrid || error("edge $(ed3.number) has incycle $(ed3.inCycle) but node $(node.number) is not hybrid") - # -- update partition - indexP = whichPartition(net,edge,node.number) # find partition where edge is - ind = getIndex(edge,net.partition[indexP].edges) - deleteat!(net.partition[indexP].edges,ind) - edges = hybridEdges(n1) - for i in 1:3 #check of 3 edges inside hybridEdges - if(!isEqual(edges[i],e1) && !isEqual(edges[i],edge)) - descendants = [edges[i]] - cycleNum = [node.inCycle] - getDescendants!(getOtherNode(edges[i],n1),edges[i],descendants,cycleNum) - !isempty(descendants) || error("descendants is empty for node $(n1.number)") - @debug "for node $(n1.number), descendants are $([e.number for e in descendants]), and cycleNum is $(cycleNum)" - partition = Partition(unique(cycleNum),descendants) # create new partition - push!(net.partition, partition) - for e in descendants #delete edges from partition with tree originally - ind = getIndex(e,net.partition[indexP].edges) - deleteat!(net.partition[indexP].edges,ind) - end - net.partition[indexP].cycle = union([node.inCycle],symdiff(net.partition[indexP].cycle,cycleNum)) - break - end - end - # -- update in cycle - edge.inCycle = e3.inCycle - n1.inCycle = e3.inCycle - node.k += 1 - else - nohybrid = true - end - end - removeNode!(n1,e2) - removeEdge!(n1,e2) - removeNode!(n2,e3) - removeEdge!(n2,e3) - setNode!(e3,n1) - setEdge!(n1,e3) - setNode!(e2,n2) - setEdge!(n2,e2) - if(rand() < 0.5) # update lengths - r = rand() - setLength!(e1,r*t1) - setLength!(edge,(1-r)*t1) - setLength!(e4,t4+t) - else - r = rand() - setLength!(e1,t1+t) - setLength!(edge,(1-r)*t4) - setLength!(e4,r*t4) - end - if(!isTree(net) && !nohybrid) - undoGammaz!(node,net); - flag,edges = updateGammaz!(net,node); - flag || error("cannot encounter bad triangles with NNI move") - end - parameters!(net); - @debug "MOVE: NNI around edge $(edge.number) SUCCESSFUL" - return true -end - -# function to repeat NNI until success -function NNIRepeat!(net::HybridNetwork,N::Integer) - N > 0 || error("N must be positive: $(N)") - flag,edge = chooseEdgeNNI(net,N) - flag || return false - i = 0 - success = false - while(!success && i < N) - success = NNI!(net,edge) - i += 1 - end - success || return false - return true -end - diff --git a/src/multipleAlleles.jl b/src/multipleAlleles.jl deleted file mode 100644 index 781f3a3f8..000000000 --- a/src/multipleAlleles.jl +++ /dev/null @@ -1,300 +0,0 @@ -# functions to extend snaq to multiple alleles case -# Claudia November 2015 - -global repeatAlleleSuffix = "__2" -repeatAlleleSuffix_re = Regex("$repeatAlleleSuffix\$") - - -""" - mapAllelesCFtable(mapping file, CF file; filename, columns, delim) - -Create a new DataFrame containing the same concordance factors as in the input CF file, -but with modified taxon names. Each allele name in the input CF table is replaced by the -species name that the allele maps onto, based on the mapping file. The mapping file should have column names: allele and species. - -Optional arguments: - -- file name to write/save resulting CF table. If not specified, then the output - data frame is not saved to a file. -- column numbers for the taxon names. 1-4 by default. -- any keyword arguments that `CSV.File` would accept. - For example, delim=',' by default: columns are delimited by commas. - Unless specified otherwise by the user, `pool`=false - (to read taxon names as Strings, not levels of a categorical factor, - for combining the 4 columns with taxon names more easily). - The same CSV arguments are used to read both input file (mapping file and quartet file) - -See also [`mapAllelesCFtable!`](@ref) to input DataFrames instead of file names. - -If a `filename` is specified, such as "quartetCF_speciesNames.csv" -in the example below, this file is best read later with the option -`pool=false`. example: - -```julia -mapAllelesCFtable("allele-species-map.csv", "allele-quartet-CF.csv"; - filename = "quartetCF_speciesNames.csv") -df_sp = CSV.read("quartetCF_speciesNames.csv", DataFrame); # DataFrame object -dataCF_specieslevel = readTableCF!(df_sp, mergerows=true); # DataCF object -``` -""" -function mapAllelesCFtable(alleleDF::AbstractString, cfDF::AbstractString; - filename=""::AbstractString, columns=Int[]::Vector{Int}, CSVargs...) - # force pool=false unless the user wants otherwise - if :pool ∉ [pair[1] for pair in CSVargs] - CSVargs = (CSVargs..., :pool=>false) - end - d = DataFrame(CSV.File(alleleDF; CSVargs...); copycols=false) - d2 = DataFrame(CSV.File(cfDF; CSVargs...); copycols=false) - mapAllelesCFtable!(d2,d, columns, filename != "", filename) -end - -""" - mapAllelesCFtable!(quartet CF DataFrame, mapping DataFrame, columns, write?, filename) - -Modify (and return) the quartet concordance factor (CF) DataFrame: -replace each allele name by the species name that the allele maps onto -based on the mapping data frame. This mapping data frame should have columns -named "allele" and "species" (see `rename!` to change column names if need be). - -If `write?` is `true`, the modified data frame is written to a file named "filename". - -Warning: [`mapAllelesCFtable`](@ref) takes the quartet data file as its second -argument, while `mapAllelesCFtable!` takes the quartet data (which it modifies) -as its first argument. -""" -function mapAllelesCFtable!(cfDF::DataFrame, alleleDF::DataFrame, co::Vector{Int},write::Bool,filename::AbstractString) - size(cfDF,2) >= 7 || error("CF DataFrame should have 7+ columns: 4taxa, 3CF, and possibly ngenes") - if length(co)==0 co=[1,2,3,4]; end - allelecol, speciescol = compareTaxaNames(alleleDF,cfDF,co) - for j in 1:4 - for ia in 1:size(alleleDF,1) # for all alleles - cfDF[!,co[j]] = map(x->replace(string(x), - Regex("^$(string(alleleDF[ia,allelecol]))\$") => - alleleDF[ia,speciescol]), - cfDF[!,co[j]]) - end - end - if write - filename != "" || error("cannot write quartet CF with mapped alleles: empty filename") - CSV.write(filename, cfDF) - end - return cfDF -end - -# function to clean a df after changing allele names to species names -# inside readTableCF! -# by deleting rows that are not informative like sp1 sp1 sp1 sp2 -# keepOne=true: we only keep one allele per species -function cleanAlleleDF!(newdf::DataFrame, cols::Vector{<:Integer}; keepOne=false::Bool) - delrows = Int[] # indices of rows to delete - repSpecies = Set{String}() - if(isa(newdf[1,cols[1]],Integer)) #taxon names as integers: we need this to be able to add __2 - for j in 1:4 - newdf[!,cols[j]] .= map(string, newdf[!,cols[j]]) - end - end - row = Vector{String}(undef, 4) - for i in 1:nrow(newdf) - map!(j -> newdf[i,cols[j]], row, 1:4) - uniq = unique(row) - - if(length(uniq) == 4) - continue - end - # by now, at least 1 species is repeated - if !keepOne # then we may choose to keep this row - # 3 options: sp1 sp1 sp2 sp3; or sp1 sp1 sp2 sp2 (keep) - # or sp1 sp1 sp1 sp2; or sp1 sp1 sp1 sp1 (do not keep) - keep = false - for u in uniq - ind = row .== u # indices of taxon names matching u - if sum(ind) == 2 - keep = true - push!(repSpecies, string(u)) - # change the second instance of a repeated taxon name with suffix - k = findlast(ind) - newdf[i,cols[k]] = string(u, repeatAlleleSuffix) - end - end - end - keep || push!(delrows, i) - end - nrows = size(newdf,1) - nkeep = nrows - length(delrows) - if nkeep < nrows - print("""found $(length(delrows)) 4-taxon sets uninformative about between-species relationships, out of $(nrows). - These 4-taxon sets will be deleted from the data frame. $nkeep informative 4-taxon sets will be used. - """) - nkeep > 0 || @warn "All 4-taxon subsets are uninformative, so the dataframe will be left empty" - deleteat!(newdf, delrows) # deleteat! requires DataFrames 1.3 - end - return collect(repSpecies) -end - - -# function to merge rows that have repeated taxon names by using the weigthed average of CF -# (if info on number of genes is provided) or simple average -function mergeRows(df::DataFrame, cols::Vector{Int}) - sorttaxa!(df, cols) # sort taxa alphabetically within each row - colnamtax = DataFrames.propertynames(df)[cols[1:4]] - colnam = DataFrames.propertynames(df)[cols[5:end]] - df = combine(groupby(df, colnamtax, sort=false, skipmissing=false), - colnam .=> mean .=> colnam) - # rename!(df, Dict((Symbol(n, "_mean"), n) for n in colnam) ) - n4tax = size(df,1) # total number of 4-taxon sets - print("$n4tax unique 4-taxon sets were found. CF values of repeated 4-taxon sets will be averaged") - println((length(cols)>7 ? " (ngenes too)." : ".")) - return df -end - - -# function to expand leaves in tree to two individuals -# based on cf table with alleles mapped to species names -function expandLeaves!(repSpecies::Union{Vector{String},Vector{Int}},tree::HybridNetwork) - for sp in repSpecies - for n in tree.node - if(n.name == sp) #found leaf with sp name - n.leaf || error("name $(sp) should correspond to a leaf, but it corresponds to an internal node") - length(n.edge) == 1 || error("leaf $(sp) should have only one edge attached and it has $(length(n.edge))") - if(n.edge[1].length == -1.0) - setLength!(n.edge[1],1.0) - end - removeLeaf!(tree,n) - n.leaf = false - n.edge[1].istIdentifiable = true - n.name = "" - max_node = maximum([e.number for e in tree.node]); - max_edge = maximum([e.number for e in tree.edge]); - e1 = Edge(max_edge+1,0.0) - e2 = Edge(max_edge+2,0.0) - n1 = Node(max_node+1,true,false,[e1]) - n2 = Node(max_node+2,true,false,[e2]) - setNode!(e1,n1) - setNode!(e1,n) - setNode!(e2,n2) - setNode!(e2,n) - setEdge!(n,e1) - setEdge!(n,e2) - pushNode!(tree,n1) - pushNode!(tree,n2) - pushEdge!(tree,e1) - pushEdge!(tree,e2) - n1.name = string(sp) - n2.name = string(sp,repeatAlleleSuffix) - push!(tree.names,n2.name) - break - end - end - end -end - - -# function to compare the taxon names in the allele-species matching table -# and the CF table -function compareTaxaNames(alleleDF::DataFrame, cfDF::DataFrame, co::Vector{Int}) - allelecol, speciescol = checkMapDF(alleleDF) - CFtaxa = string.(mapreduce(x -> unique(skipmissing(x)), union, eachcol(cfDF[!,co[1:4]]))) - alleleTaxa = map(string, alleleDF[!,allelecol]) # as string, too - sizeCF = length(CFtaxa) - sizeAllele = length(alleleTaxa) - if sizeAllele > sizeCF - @warn "some alleles in the mapping file do not occur in the quartet CF data. Extra allele names will be ignored" - alleleTaxa = intersect(alleleTaxa,CFtaxa) - end - unchanged = setdiff(CFtaxa,alleleTaxa) - if length(unchanged) == length(CFtaxa) - @warn "None of the taxon names in CF table match with allele names in the mapping file" - end - if !isempty(unchanged) - warnmsg = "not all alleles were mapped\n" - warnmsg *= "alleles not mapped to a species name:" - for n in unchanged warnmsg *= " $n"; end - @warn warnmsg - end - return allelecol, speciescol -end - -""" - checkMapDF(mapping_allele2species::DataFrame) - -Check that the data frame has one column named "allele" or "individual", -and one column named "species". Output: indices of these column. -""" -function checkMapDF(alleleDF::DataFrame) - size(alleleDF,2) >= 2 || error("Allele-Species matching Dataframe should have at least 2 columns") - colnames = DataFrames.propertynames(alleleDF) - allelecol = findfirst(x -> x == :allele, colnames) - if isnothing(allelecol) - allelecol = findfirst(x -> x == :individual, colnames) - end - isnothing(allelecol) && error("In allele mapping file there is no column named 'allele' or 'individual'") - speciescol = findfirst(x -> x == :species, colnames) - isnothing(speciescol) && error("In allele mapping file there is no column named species") - return allelecol, speciescol -end - - - -## function to check if a new proposed topology satisfies the condition for -## multiple alleles: no gene flow to either allele, and both alleles as sister -## returns false if the network is not ok -function checkTop4multAllele(net::HybridNetwork) - for n in net.leaf - if occursin(repeatAlleleSuffix_re, n.name) - n.leaf || error("weird node $(n.number) not leaf in net.leaf list") - length(n.edge) == 1 || error("weird leaf with $(length(n.edge)) edges") - par = getOtherNode(n.edge[1],n) - if(par.hybrid) ## there is gene flow into n - return false - end - nameOther = replace(n.name, repeatAlleleSuffix_re => "") - foundOther = false - for i in 1:3 - other = getOtherNode(par.edge[i],par) - if(other.leaf && other.name == nameOther) - foundOther = true - end - end - foundOther || return false - end - end - return true -end - - - -## function to merge the two alleles into one -function mergeLeaves!(net::HybridNetwork) - leaves = copy(net.leaf) # bc we change this list - for n in leaves - if occursin(repeatAlleleSuffix_re, n.name) - n.leaf || error("weird node $(n.number) not leaf in net.leaf list") - length(n.edge) == 1 || error("weird leaf with $(length(n.edge)) edges") - par = getOtherNode(n.edge[1],n) - foundOther = false - other = Node() - nameOther = replace(n.name, repeatAlleleSuffix_re => "") - for i in 1:3 - other = getOtherNode(par.edge[i],par) - if(other.leaf && other.name == nameOther) - foundOther = true - break - end - end - if(!foundOther) - checkTop4multAllele(net) || error("current network does not comply with multiple allele condition") - error("strange network that passes checkTop4multAllele, but cannot find the other allele for $(n.name)") - end - removeEdge!(par,n.edge[1]) - removeEdge!(par,other.edge[1]) - deleteNode!(net,n) - deleteNode!(net,other) - deleteEdge!(net,n.edge[1]) - deleteEdge!(net,other.edge[1]) - par.name = other.name - par.leaf = true - push!(net.leaf,par) - net.numTaxa += 1 - end - end -end diff --git a/src/nj.jl b/src/nj.jl index 4c3815af2..c89e0202c 100644 --- a/src/nj.jl +++ b/src/nj.jl @@ -6,9 +6,9 @@ function check_distance_matrix(D::Matrix{<:Real}) if any(diag(D) .!= 0.0) throw(DomainError(D, "Diagonal entry not 0")) end + return nothing end - """ nj!(D::Matrix{Float64}, names::AbstractVector{<:AbstractString}=String[]; force_nonnegative_edges::Bool=false) @@ -23,17 +23,17 @@ is changed to 0.0 (with a message). Warning: `D` is modified. """ -function nj!(D::Matrix{Float64}, names::AbstractVector{<:AbstractString}=String[]; - force_nonnegative_edges::Bool=false) - +function nj!( + D::Matrix{Float64}, + names::AbstractVector{<:AbstractString}=String[]; + force_nonnegative_edges::Bool=false +) check_distance_matrix(D) - n = size(D, 1) # number of species - - # when no names arg is supplied + n = size(D, 1) # number of species + active_size = n # tracks the current active size of matrix if isempty(names) names = string.(1:n) end - # create empty network with n unconnected leaf nodes nodes = map(function(i) node = Node(i, true) @@ -41,24 +41,19 @@ function nj!(D::Matrix{Float64}, names::AbstractVector{<:AbstractString}=String[ return node end, 1:n) - net = HybridNetwork(nodes, Edge[]) - # an array of Node s.t. active_nodes[i] would correspond to the - # ith entry in distance matrix D at each iteration active_nodes = copy(nodes) - neglenp = 0 # number of negative edge lengths - while n > 2 - # compute Q matrix and find min - # warning: here i and j are indeces for D, not actual id's - sums = sum(D, dims = 1) + while active_size > 2 + # compute Q matrix and find pair with minimum Q + sums = sum(D[1:active_size, 1:active_size], dims = 1) cur = Inf min_index = (0, 0) - for i = 1:n - for j = i:n + for i = 1:active_size + for j = i:active_size if j != i - qij = (n-2) * D[i,j] - sums[i] - sums[j] + qij = (active_size-2) * D[i,j] - sums[i] - sums[j] if qij < cur cur = qij min_index = (i, j) @@ -66,12 +61,11 @@ function nj!(D::Matrix{Float64}, names::AbstractVector{<:AbstractString}=String[ end end end - # connect the nodes, compute the length of the edge (i, j) = min_index - dik = D[i,j] / 2 + (sums[i] - sums[j]) / (2 * (n - 2)) + dik = D[i,j] / 2 + (sums[i] - sums[j]) / (2 * (active_size - 2)) djk = D[i,j] - dik - # force negative lengths to 0, if any + if dik < 0.0 neglenp += 1 if force_nonnegative_edges dik = 0.0; end @@ -80,12 +74,11 @@ function nj!(D::Matrix{Float64}, names::AbstractVector{<:AbstractString}=String[ neglenp += 1 if force_nonnegative_edges djk = 0.0; end end - # create new edges and node, update tree - edgenum = net.numEdges - eik = Edge(edgenum + 1, dik) # edge length must be Float64 for Edge() + edgenum = net.numedges + eik = Edge(edgenum + 1, dik) ejk = Edge(edgenum + 2, djk) - node_k = Node(net.numNodes+1, false, false, [eik, ejk]) # new node + node_k = Node(net.numnodes+1, false, false, [eik, ejk]) node_i = active_nodes[i] node_j = active_nodes[j] setNode!(eik, Node[node_i, node_k]) @@ -96,50 +89,50 @@ function nj!(D::Matrix{Float64}, names::AbstractVector{<:AbstractString}=String[ pushEdge!(net, ejk) pushNode!(net, node_k) - # update map and D - # replace D[l, i] with D[l, k], delete D[ , j] - for l in 1:n - if !(l in [i j]) - D[l, i] = (D[l,i] + D[j,l] - D[i,j]) / 2 - D[i, l] = D[l, i] + # Update distances to new node k, placed in position i + if i == active_size # swap with j instead, if i is last active position + (i,j) = (j,i) + end + for l in 1:active_size + if !(l in [i, j]) + D[l,i] = (D[l,i] + D[l,j] - D[i,j]) / 2 + D[i,l] = D[l,i] end end - newidx = filter(u->u!=j, 1:n) # index 1:n\{j} - D = view(D, newidx, newidx) - - # update active_nodes + # swap j with last active position using whole column/row operations + if j != active_size + D[:, j], D[:, active_size] = D[:, active_size], D[:, j] + D[j, :], D[active_size, :] = D[active_size, :], D[j, :] + active_nodes[j] = active_nodes[active_size] + end + # inactivate last active position: okay bc k replaces i != active_size + active_size -= 1 active_nodes[i] = node_k - active_nodes = view(active_nodes, newidx) - - n = n - 1 end - # base case + # base case: 2 leaves if D[1,2] < 0.0 neglenp += 1 if force_nonnegative_edges D[1,2] = 0.0; end end node1 = active_nodes[1] node2 = active_nodes[2] - newedge = Edge(net.numEdges+1, D[1,2]) - setNode!(newedge, [node1, node2]) # isChild1 = true by default: nodes are [child, parent] - if node1.number == net.numNodes - newedge.isChild1 = false # to direct the edge from the last created node to the other node + newedge = Edge(net.numedges+1, D[1,2]) + setNode!(newedge, [node1, node2]) # ischild1 = true by default: nodes are [child, parent] + if node1.number == net.numnodes + newedge.ischild1 = false # direct the edge: last created node -> other node end setEdge!(node1, newedge) setEdge!(node2, newedge) pushEdge!(net, newedge) - net.root = net.numNodes # to place the root at the last created node, which is internal - - # report on number of negative branches + net.rooti = net.numnodes # root = last created node, which is internal if neglenp > 0 infostr = (force_nonnegative_edges ? - "$neglenp branches had negative lengths, reset to 0" : - "$neglenp branches have negative lengths" ) + "$neglenp branch(es) of negative length, reset to 0" : + "$neglenp branch(es) of negative length" ) @info infostr end - return net end diff --git a/src/nloptsummary.jl b/src/nloptsummary.jl deleted file mode 100644 index a9d4e6e77..000000000 --- a/src/nloptsummary.jl +++ /dev/null @@ -1,69 +0,0 @@ -""" - OptSummary{T<:AbstractFloat} - -Summary of an `NLopt` optimization. Idea and code taken from -[`MixedModels`](https://github.com/JuliaStats/MixedModels.jl). -`T` is the type of the function argument(s) and of the function value. -""" -mutable struct OptSummary{T<:AbstractFloat} - "copy of initial param values in the optimization" - initial::Vector{T} - "lower bounds on the parameter values" - lowerbd::Vector{T} - "relative tolerance on the function value f(x), as in NLopt" - ftol_rel::T - "absolute tolerance on the function value f(x), as in NLopt" - ftol_abs::T - "relative tolerance on the argument value x, as in NLopt" - xtol_rel::T - "absolute tolerance on the argument value x" - xtol_abs::Vector{T} - "initial step sizes, as in NLopt" - initial_step::Vector{T} - "maximum number of function evaluations, as in NLopt" - maxfeval::Int - "copy of the final parameter values from the optimization" - final::Vector{T} - "final value of the objective function" - fmin::T - "number of function evaluations" - feval::Int - "name of the optimizer used, as a `Symbol`" - algorithm::Symbol - "return value, as a `Symbol`" - returnvalue::Symbol -end -function OptSummary(initial::Vector{T}, lowerbd::Vector{T}, algorithm::Symbol; - ftol_rel::T = zero(T), - ftol_abs::T = zero(T), - xtol_rel::T = zero(T), - xtol_abs::Vector{T} = fill(zero, length(initial)), - initial_step::Vector{T} = T[]) where {T<:AbstractFloat} - OptSummary(initial, lowerbd, - ftol_rel, ftol_abs, xtol_rel, xtol_abs, - initial_step, - -1, # maxeval: 0 or negative for no limit - copy(initial), # final x - T(Inf), # final value (will be finite after minimization) - -1, # number of evals - algorithm, - :FAILURE) -end - -function NLopt.Opt(optsum::OptSummary) - lb = optsum.lowerbd - np = length(lb) # number of parameters to optimize - opt = NLopt.Opt(optsum.algorithm, np) - NLopt.ftol_rel!(opt, optsum.ftol_rel) # relative criterion on objective - NLopt.ftol_abs!(opt, optsum.ftol_abs) # absolute criterion on objective - NLopt.xtol_rel!(opt, optsum.xtol_rel) # relative criterion on parameters - NLopt.xtol_abs!(opt, optsum.xtol_abs) # absolute criterion on parameters - NLopt.lower_bounds!(opt, lb) - NLopt.maxeval!(opt, optsum.maxfeval) - if isempty(optsum.initial_step) - optsum.initial_step = NLopt.initial_step(opt, similar(lb)) - else - NLopt.initial_step!(opt, optsum.initial_step) - end - return opt -end diff --git a/src/pairwiseDistanceLS.jl b/src/pairwiseDistanceLS.jl index 3ab5470d8..d92d0d335 100644 --- a/src/pairwiseDistanceLS.jl +++ b/src/pairwiseDistanceLS.jl @@ -1,17 +1,17 @@ """ - getNodeAges(net) + getnodeages(net) -vector of node ages in pre-order, as in `nodes_changed`. +vector of node ages in pre-order, as in `vec_node`. *Warnings*: `net` is assumed to -- have been preordered before (to calculate `nodes_changed`) +- have been preordered before (to calculate `vec_node`) - be time-consistent (all paths to the root to a given hybrid have the same length) - be ultrametric (all leaves have the same age: 0) """ -function getNodeAges(net::HybridNetwork) - x = Vector{Float64}(undef, length(net.nodes_changed)) - for i in reverse(1:length(net.nodes_changed)) # post-order - n = net.nodes_changed[i] +function getnodeages(net::HybridNetwork) + x = Vector{Float64}(undef, length(net.vec_node)) + for i in reverse(1:length(net.vec_node)) # post-order + n = net.vec_node[i] if n.leaf x[i] = 0.0 continue @@ -19,7 +19,7 @@ function getNodeAges(net::HybridNetwork) for e in n.edge if getparent(e) == n # n parent of e childnode = getchild(e) - childIndex = getIndex(childnode, net.nodes_changed) + childIndex = getIndex(childnode, net.vec_node) x[i] = x[childIndex] + e.length break # use 1st child, ignores all others end @@ -29,16 +29,16 @@ function getNodeAges(net::HybridNetwork) end """ - pairwiseTaxonDistanceMatrix(net; keepInternal=false, - checkPreorder=true, nodeAges=[]) - pairwiseTaxonDistanceMatrix!(M, net, nodeAges) + pairwisetaxondistancematrix(net; keepInternal=false, + checkpreorder=true, nodeAges=[]) + pairwisetaxondistancematrix!(M, net, nodeAges) Return the matrix `M` of pairwise distances between nodes in the network: - between all nodes (internal and leaves) if `keepInternal=true`, in which case the nodes are listed in `M` in the - order in which they appear in `net.nodes_changed` + order in which they appear in `net.vec_node` - between taxa only otherwise, in which case the nodes are listed - in `M` in the order in which they appear in `tipLabels(net)` + in `M` in the order in which they appear in `tiplabels(net)` (i.e. same order as in `net.leaf`) The second form modifies `M` in place, assuming all nodes. @@ -51,31 +51,32 @@ if branch lengths are in substitutions/site. optional arguments: -- `checkPreorder`: if true, `net.nodes_changed` is updated to get a +- `checkpreorder`: if true, `net.vec_node` is updated to get a topological ordering of nodes. - `nodeAges`: if not provided, i.e. empty vector, the network is *not* modified. If provided and non-empty, `nodeAges` should list node ages in the - pre-order in which nodes are listed in `nodes_changed` (including leaves), + pre-order in which nodes are listed in `vec_node` (including leaves), and **edge lengths** in `net` **are modified** accordingly. Providing node ages hence makes the network time consistent: such that all paths from the root to a given hybrid node have the same length. If node ages are not provided, the network need not be time consistent. """ -function pairwiseTaxonDistanceMatrix(net::HybridNetwork; - keepInternal=false::Bool, checkPreorder=true::Bool, - nodeAges=Float64[]::Vector{Float64}) - net.isRooted || error("net needs to be rooted for preorder recursion") - if(checkPreorder) +function pairwisetaxondistancematrix( + net::HybridNetwork; + keepInternal::Bool=false, + checkpreorder::Bool=true, + nodeAges::Vector{Float64}=Float64[] +) + net.isrooted || error("net needs to be rooted for preorder recursion") + if checkpreorder preorder!(net) end - nnodes = net.numNodes + nnodes = net.numnodes M = zeros(Float64,nnodes,nnodes) - if length(nodeAges)>0 - length(nodeAges) == net.numNodes || - error("there should be $(net.numNodes) node ages") - end - pairwiseTaxonDistanceMatrix!(M,net,nodeAges) + isempty(nodeAges) || length(nodeAges) == nnodes || + error("there should be $nnodes node ages") + pairwisetaxondistancematrix!(M,net,nodeAges) if !keepInternal M = getTipSubmatrix(M, net) end @@ -86,16 +87,16 @@ end Extract submatrix of M, with rows and/or columns corresponding to tips in the network, ordered like in `net.leaf`. -In M, rows and/or columns are assumed ordered as in `net.nodes_changed`. +In M, rows and/or columns are assumed ordered as in `net.vec_node`. indexation: one of `:rows`, `:cols` or `:both`: are nodes numbers indexed in the matrix by rows, by columns, or both? Subsetting is taken accordingly. """ function getTipSubmatrix(M::Matrix, net::HybridNetwork; indexation=:both) - nodenames = [n.name for n in net.nodes_changed] + nodenames = [n.name for n in net.vec_node] tipind = Int[] - for l in tipLabels(net) + for l in tiplabels(net) push!(tipind, findfirst(isequal(l), nodenames)) end if indexation == :both @@ -109,111 +110,139 @@ function getTipSubmatrix(M::Matrix, net::HybridNetwork; indexation=:both) end end -function pairwiseTaxonDistanceMatrix!(M::Matrix{Float64},net::HybridNetwork,nodeAges) - recursionPreOrder!(net.nodes_changed, M, # updates M in place - updateRootSharedPathMatrix!, # does nothing +function pairwisetaxondistancematrix!(M::Matrix{Float64},net::HybridNetwork,nodeAges) + traversal_preorder!(net.vec_node, M, # updates M in place + traversalupdate_default!, # does nothing updateTreePairwiseTaxonDistanceMatrix!, updateHybridPairwiseTaxonDistanceMatrix!, nodeAges) end -function updateTreePairwiseTaxonDistanceMatrix!(V::Matrix, - i::Int,parentIndex::Int,edge::Edge, - params) - nodeAges = params # assumed pre-ordered, as in nodes_changed - if length(nodeAges)>0 - edge.length= nodeAges[parentIndex] - nodeAges[i] +function updateTreePairwiseTaxonDistanceMatrix!( + V::Matrix, + i::Int, + parindx::Int, # index of parent node + edge::Edge, + nodeages, # assumed pre-ordered, as in vec_node +) + if !isempty(nodeages) + edge.length = nodeages[parindx] - nodeages[i] end for j in 1:(i-1) - V[i,j] = V[parentIndex,j]+edge.length + V[i,j] = V[parindx,j] + edge.length V[j,i] = V[i,j] end - V[i,i] = 0.0 + # V[i,i] = zero(eltype(V)) # not needed bc: initialized to 0 and never changes + return true end -function updateHybridPairwiseTaxonDistanceMatrix!(V::Matrix, - i::Int, parentIndex1::Int, parentIndex2::Int, - edge1::Edge, edge2::Edge, - params) - nodeAges = params # should be pre-ordered - if length(nodeAges)>0 - edge1.length= nodeAges[parentIndex1] - nodeAges[i] - edge2.length= nodeAges[parentIndex2] - nodeAges[i] +function updateHybridPairwiseTaxonDistanceMatrix!( + V::Matrix, + i::Int, + parindx::AbstractVector{Int}, + paredge::AbstractVector{Edge}, + nodeages, # node ages should be pre-ordered +) + if !isempty(nodeages) + for (pi,pe) in zip(parindx, paredge) + pe.length = nodeages[pi] - nodeages[i] + end end for j in 1:(i-1) - V[i,j] = edge1.gamma*(edge1.length+V[parentIndex1,j]) + - edge2.gamma*(edge2.length+V[parentIndex2,j]) + V[i,j] = zero(eltype(V)) + for (pi,pe) in zip(parindx, paredge) + V[i,j] += pe.gamma * (V[pi,j] + pe.length) + end V[j,i] = V[i,j] end + return true end """ - pairwiseTaxonDistanceGrad(net; checkEdgeNumber=true, nodeAges=[]) + pairwisetaxondistance_gradient(net; checkEdgeNumber=true, nodeAges=[]) 3-dim array: gradient of pairwise distances between all nodes. (internal and leaves); gradient with respect to edge lengths if `nodeAges` is empty; with respect to node ages otherwise. -Assume correct `net.nodes_changed` (preorder). +Assume correct `net.vec_node` (preorder). This gradient depends on the network's topology and γ's only, not on branch lengths or node ages (distances are linear in either). WARNING: edge numbers need to range between 1 and #edges. """ -function pairwiseTaxonDistanceGrad(net::HybridNetwork; - checkEdgeNumber=true::Bool, nodeAges=Float64[]::Vector{Float64}) +function pairwisetaxondistance_gradient( + net::HybridNetwork; + checkEdgeNumber::Bool=true, + nodeAges::Vector{Float64}=Float64[] +) if checkEdgeNumber - sort([e.number for e in net.edge]) == collect(1:net.numEdges) || + sort([e.number for e in net.edge]) == collect(1:net.numedges) || error("edge numbers must range between 1 and #edges") end - n = (length(nodeAges)==0 ? net.numEdges : net.numNodes) - M = zeros(Float64, net.numNodes, net.numNodes, n) - recursionPreOrder!(net.nodes_changed, M, - updateRootSharedPathMatrix!, # does nothing + n = (length(nodeAges)==0 ? net.numedges : net.numnodes) + M = zeros(Float64, net.numnodes, net.numnodes, n) + traversal_preorder!(net.vec_node, M, + traversalupdate_default!, # does nothing updateTreePairwiseTaxonDistanceGrad!, updateHybridPairwiseTaxonDistanceGrad!, - nodeAges) # nodeAges assumed pre-ordered, like nodes_changed + nodeAges) # nodeAges assumed pre-ordered, like vec_node return M end -function updateTreePairwiseTaxonDistanceGrad!(V::Array{Float64,3}, i::Int, - parentIndex::Int, edge::Edge, params) - nodeAges = params # assumed pre-ordered +function updateTreePairwiseTaxonDistanceGrad!( + V::Array{Float64,3}, + i::Int, + parindx::Int, # index of parent node + edge::Edge, + nodeages, # assumed pre-ordered +) + emptyages = isempty(nodeages) for j in 1:(i-1) - if length(nodeAges) == 0 # d/d(edge length) + if emptyages # d/d(edge length) V[i,j,edge.number] = 1.0 - else # d/d(node age) - V[i,j,parentIndex] = 1.0 + else # d/d(node age) + V[i,j,parindx] = 1.0 V[i,j,i] = -1.0 end for k in 1:size(V)[3] # brute force... - V[i,j,k] += V[parentIndex,j,k] + V[i,j,k] += V[parindx,j,k] V[j,i,k] = V[i,j,k] end end # V[i,i,k] initialized to 0.0 already + return true end -function updateHybridPairwiseTaxonDistanceGrad!(V::Array{Float64,3},i::Int, - parentIndex1::Int, parentIndex2::Int, - edge1::Edge, edge2::Edge, params) - nodeAges = params +function updateHybridPairwiseTaxonDistanceGrad!( + V::Array{Float64,3}, + i::Int, + parindx::AbstractVector{Int}, + paredge::AbstractVector{Edge}, + nodeages, +) + emptyages = isempty(nodeages) for j in 1:(i-1) - if length(nodeAges) == 0 # d/d(edge length) - V[i,j,edge1.number] = edge1.gamma - V[i,j,edge2.number] = edge2.gamma - else # d/d(node age) - V[i,j,parentIndex1] = edge1.gamma - V[i,j,parentIndex2] = edge2.gamma + if emptyages # d/d(edge length) + for pe in paredge + V[i,j,pe.number] = pe.gamma + end + else # d/d(node age) + for (pi,pe) in zip(parindx, paredge) + V[i,j,pi] = pe.gamma + end V[i,j,i] = - 1.0 # because γ1+γ2 = 1 end - for k in 1:size(V)[3] - V[i,j,k] += edge1.gamma*V[parentIndex1,j,k] + edge2.gamma*V[parentIndex2,j,k] + for k in 1:size(V)[3] # 1:size(V,3) + for (pi,pe) in zip(parindx, paredge) + V[i,j,k] += pe.gamma * V[pi,j,k] + end V[j,i,k] = V[i,j,k] end end + return true end """ - calibrateFromPairwiseDistances!(net, distances::Matrix{Float64}, + calibratefrompairwisedistances!(net, distances::Matrix{Float64}, taxon_names::Vector{<:AbstractString}) Calibrate the network to match (as best as possible) input @@ -230,8 +259,12 @@ distance data equally well (lack of identifiability). This function will output *one* of these equally good calibrations. optional arguments (default): -- checkPreorder (true) +- checkpreorder (true) - forceMinorLength0 (false) to force minor hybrid edges to have a length of 0 +- ultrametric (true) to force the network to be + * time-consistent: all paths from the root to a given node must have the same + length, so the age of this node is well-defined, and + * ultrametric: all tips are at the same distance from the root, so have the same age. - NLoptMethod (`:LD_MMA`) for the optimization algorithm. Other options include `:LN_COBYLA` (derivative-free); see NLopt package. - tolerance values to control when the optimization is stopped: @@ -239,14 +272,21 @@ optional arguments (default): xtolRel (1e-10), xtolAbs (1e-10) on branch lengths / divergence times. - verbose (false) """ -function calibrateFromPairwiseDistances!(net::HybridNetwork, - D::Array{Float64,2}, taxNames::Vector{<:AbstractString}; - checkPreorder=true::Bool, forceMinorLength0=false::Bool, verbose=false::Bool, - ultrametric=true::Bool, NLoptMethod=:LD_MMA::Symbol, - ftolRel=fRelBL::Float64, ftolAbs=fAbsBL::Float64, - xtolRel=xRelBL::Float64, xtolAbs=xAbsBL::Float64) - - checkPreorder && preorder!(net) +function calibratefrompairwisedistances!( + net::HybridNetwork, + D::Array{Float64,2}, + taxNames::Vector{<:AbstractString}; + checkpreorder::Bool=true, + forceMinorLength0::Bool=false, + verbose::Bool=false, + ultrametric::Bool=true, + NLoptMethod::Symbol=:LD_MMA, + ftolRel::Float64=fRelBL, + ftolAbs::Float64=fAbsBL, + xtolRel::Float64=xRelBL, + xtolAbs::Float64=xAbsBL +) + checkpreorder && preorder!(net) # fixit: remove root node if of degree 2, and if ultrametric=false defaultedgelength = median(D)/(length(net.edge)/2) for e in net.edge @@ -254,57 +294,57 @@ function calibrateFromPairwiseDistances!(net::HybridNetwork, # get smarter starting values: NJ? fast dating? end if ultrametric # get all node ages in pre-order - na = getNodeAges(net) + na = getnodeages(net) else na = Float64[]; end # get number and indices of edge/nodes to be optimized if forceMinorLength0 && !ultrametric - parind = filter(i -> net.edge[i].isMajor, 1:net.numEdges) + parind = filter(i -> net.edge[i].ismajor, 1:net.numedges) nparams = length(parind) # edges to be optimized: indices par = [e.length for e in net.edge][parind] # and lengths - for i in 1:net.numEdges - if !net.edge[i].isMajor net.edge[i].length=0.0; end + for i in 1:net.numedges + if !net.edge[i].ismajor net.edge[i].length=0.0; end end elseif !forceMinorLength0 && !ultrametric nparams = length(net.edge) # number of parameters to optimize par = [e.length for e in net.edge] parind = 1:nparams elseif !forceMinorLength0 && ultrametric - nparams = net.numNodes - net.numTaxa # internal nodes to be optimized - parind = filter(i -> !net.nodes_changed[i].leaf, 1:net.numNodes) + nparams = net.numnodes - net.numtaxa # internal nodes to be optimized + parind = filter(i -> !net.vec_node[i].leaf, 1:net.numnodes) par = na[parind] else # forceMinorLength0 && ultrametric - nparams = net.numNodes - net.numTaxa - net.numHybrids - parind = filter(i -> !(net.nodes_changed[i].leaf || net.nodes_changed[i].hybrid), - 1:net.numNodes) + nparams = net.numnodes - net.numtaxa - net.numhybrids + parind = filter(i -> !(net.vec_node[i].leaf || net.vec_node[i].hybrid), + 1:net.numnodes) par = na[parind] - hybInd = filter(i -> net.nodes_changed[i].hybrid, 1:net.numNodes) - hybParentInd = Int[] # index in nodes_changed of minor parent + hybInd = filter(i -> net.vec_node[i].hybrid, 1:net.numnodes) + hybParentInd = Int[] # index in vec_node of minor parent hybGParentI = Int[] # index in 1:nparams of minor (grand-)parent in param list for i in hybInd - n = net.nodes_changed[i] + n = net.vec_node[i] p = getparentminor(n) - pi = findfirst(n -> n===p, net.nodes_changed) + pi = findfirst(n -> n===p, net.vec_node) push!(hybParentInd, pi) pii = findfirst(isequal(pi), parind) while pii===nothing # in case minor parent of n is also hybrid node p = getparentminor(p) - pi = findfirst(n -> n===p, net.nodes_changed) + pi = findfirst(n -> n===p, net.vec_node) pii = findfirst(isequal(pi), parind) end push!(hybGParentI, pii) end end # initialize M=dist b/w all nodes, G=gradient (constant) - M = pairwiseTaxonDistanceMatrix(net, keepInternal=true, - checkPreorder=false, nodeAges=na) - if !ultrametric && sort([e.number for e in net.edge]) != collect(1:net.numEdges) - for i in 1:net.numEdges # renumber edges, needed for G + M = pairwisetaxondistancematrix(net, keepInternal=true, + checkpreorder=false, nodeAges=na) + if !ultrametric && sort([e.number for e in net.edge]) != collect(1:net.numedges) + for i in 1:net.numedges # renumber edges, needed for G net.edge[i].number = i end end # G assumes edges numbered 1:#edges, if optim edge lengths - G = pairwiseTaxonDistanceGrad(net, checkEdgeNumber=false, nodeAges=na) .* 2 + G = pairwisetaxondistance_gradient(net, checkEdgeNumber=false, nodeAges=na) .* 2 # match order of leaves in input matrix, versus pre-order - nodenames = [n.name for n in net.nodes_changed] # pre-ordered + nodenames = [n.name for n in net.vec_node] # pre-ordered ntax = length(taxNames) tipind = Int[] # pre-order index for leaf #i in dna distances for l in taxNames @@ -314,13 +354,13 @@ function calibrateFromPairwiseDistances!(net::HybridNetwork, end # contraints: to force a parent to be older than its child if ultrametric - numConstraints = length(parind) -1 + net.numHybrids + numConstraints = length(parind) -1 + net.numhybrids # calculate indices in param list of child & (grand-)parent once chii = Int[] # non-root internal node, can be repeated: once per constraint anii = Int[] # closest ancestor in param list ci = 1 # index of constraint - for i in 2:length(net.nodes_changed) # 1=root, can skip - n = net.nodes_changed[i] + for i in 2:length(net.vec_node) # 1=root, can skip + n = net.vec_node[i] if n.leaf continue; end # node ages already bounded by 0 if n.hybrid && forceMinorLength0 # get index in param list of nii = hybGParentI[findfirst(isequal(i), hybInd)] # minor grand-parent (same age) @@ -330,9 +370,9 @@ function calibrateFromPairwiseDistances!(net::HybridNetwork, for e in n.edge if getchild(e) == n # n child of e p = getparent(e) # parent of n - if forceMinorLength0 && n.hybrid && !e.isMajor + if forceMinorLength0 && n.hybrid && !e.ismajor continue; end # p and n at same age already - pi = findfirst(isequal(p.number), [no.number for no in net.nodes_changed]) + pi = findfirst(isequal(p.number), [no.number for no in net.vec_node]) if forceMinorLength0 && p.hybrid pii = hybGParentI[findfirst(isequal(pi), hybInd)] else @@ -340,7 +380,7 @@ function calibrateFromPairwiseDistances!(net::HybridNetwork, end push!(chii, nii) push!(anii, pii) - verbose && println("node $(net.nodes_changed[parind[nii]].number) constrained by age of parent $(net.nodes_changed[parind[pii]].number)") + verbose && println("node $(net.vec_node[parind[nii]].number) constrained by age of parent $(net.vec_node[parind[pii]].number)") ci += 1 end end @@ -383,7 +423,7 @@ function calibrateFromPairwiseDistances!(net::HybridNetwork, na[parind[i]] = x[i] end if forceMinorLength0 # set hybrid age to minor parent age - for i in 1:net.numHybrids + for i in 1:net.numhybrids na[hybInd[i]] = na[hybParentInd[i]] # pre-order important end end @@ -393,7 +433,7 @@ function calibrateFromPairwiseDistances!(net::HybridNetwork, end end # update distances in M, in place - pairwiseTaxonDistanceMatrix!(M,net,na) + pairwisetaxondistancematrix!(M,net,na) ss = 0.0 # sum of squares between M and observed distances for i in 2:ntax; for j in 1:(i-1) ss += (M[tipind[i],tipind[j]]-D[i,j])^2 @@ -407,7 +447,7 @@ function calibrateFromPairwiseDistances!(net::HybridNetwork, (M[tipind[i],tipind[j]]-D[i,j]) end if ultrametric && forceMinorLength0 - for i in 1:net.numHybrids # na[hybrid] set to na[minor parent] + for i in 1:net.numhybrids # na[hybrid] set to na[minor parent] grad[hybGParentI[i]] += G[tipind[i],tipind[j],hybInd[i]] * (M[tipind[i],tipind[j]]-D[i,j]) end @@ -421,3 +461,87 @@ function calibrateFromPairwiseDistances!(net::HybridNetwork, verbose && println("got $(round(fmin, digits=5)) at $(round.(xmin, digits=5)) after $(counter[1]) iterations (return code $(ret))") return fmin,xmin,ret end + +""" + startingBL!(net::HybridNetwork, + trait::AbstractVector{Vector{Union{Missings.Missing,Int}}}, + siteweight::AbstractVector{Float64}=ones(length(trait[1]))) + +Calibrate branch lengths in `net` by minimizing the mean squared error +between the JC-adjusted pairwise distance between taxa, and network-predicted +pairwise distances, using [`calibratefrompairwisedistances!`](@ref). +The network is *not* forced to be time-consistent nor ultrametric. +To avoid one source of non-identifiability, the network is "zipped" by +forcing minor hybrid edges to have length 0. + +`siteweight[k]` gives the weight of site (or site pattern) `k` (default: all 1s). + +Assumptions: + +- all species have the same number of traits (sites): `length(trait[i])` constant +- `trait[i]` is for leaf with `node.number = i` in `net`, and + `trait[i][j] = k` means that leaf number `i` has state index `k` for trait `j`. + These indices are those used in a substitution model (see `PhyloTraits.jl`): + kth value of `getlabels(model)`. + +Other: +- Hamming distances are calculated for each pair, ignoring any site in which + one of 2 values is missing. The total number of differences is then divided + by the total weight of all sites, ignoring that some of them may have been + missing for the pair. This is an inexact rescaling of the hamming distance, + assuming a small proportion of missing values for each pair. +- Theoretically, Hamming distances are < 0.75 with four states, + or < (n-1)/n for n states. + If not, all pairwise hamming distances are scaled by `.75/(m*1.01)` where `m` + is the maximum observed hamming distance, to make them all < 0.75. + The JC correction calculates: d_JC = - 0.75 log(1-d_hamming/0.75) for n=4 states +- At the end, any edge length smaller than 1.0e-10 is reset to 0.0001, + to avoid the 0 boundary. +""" +function startingBL!( + net::HybridNetwork, + trait::AbstractVector{Vector{Union{Missings.Missing,Int}}}, + siteweight::AbstractVector{<:Real}=ones(Float64,length(trait[1])) +) + nspecies = net.numtaxa + M = zeros(Float64, nspecies, nspecies) # pairwise distances initialized to 0 + # count pairwise differences, then multiply by pattern weight + ncols = length(trait[1]) # assumption: all species have same # columns + length(siteweight) == ncols || + error("$(length(siteweight)) site weights but $ncols columns in the data") + for i in 2:nspecies + species1 = trait[i] + for j in 1:(i-1) + species2 = trait[j] + for col in 1:ncols + if !(ismissing(species1[col]) || ismissing(species2[col])) && + (species1[col] != species2[col]) + M[i, j] += siteweight[col] + end + end + M[j,i] = M[i,j] + end + end + Mp = M ./ sum(siteweight) # to get proportion of sites, for each pair + + # estimate pairwise evolutionary distances using extended Jukes Cantor model + nstates = mapreduce(x -> maximum(skipmissing(x)), max, trait) + maxdist = (nstates-1)/nstates + Mp[:] = Mp ./ max(maxdist, maximum(Mp*1.01)) # values in [0,0.9901]: log(1-Mp) well defined + dhat = - maxdist .* log.( 1.0 .- Mp) + + taxonnames = [net.leaf[i].name for i in sortperm([n.number for n in net.leaf])] + # taxon names: to tell the calibration that row i of dhat is for taxonnames[i] + # trait[i][j] = trait j for taxon at node number i: 'node.number' = i + calibratefrompairwisedistances!(net, dhat, taxonnames, + forceMinorLength0=true, ultrametric=false) + #= force minor length to 0 to avoid non-identifiability at zippers. + works well if the true (or "the" best-fit) minor parent edge is shorter + than that of the major parent edge: to zip-up =# + for e in net.edge # avoid starting at the boundary + if e.length < 1.0e-10 + e.length = 0.0001 + end + end + return net +end diff --git a/src/parsimony.jl b/src/parsimony.jl index 5aa5462b6..f22963871 100644 --- a/src/parsimony.jl +++ b/src/parsimony.jl @@ -1,22 +1,22 @@ """ - parsimonyBottomUpFitch!(node, states, score) + parsimonyfitch_bottomup!(node, states, score) Bottom-up phase (from tips to root) of the Fitch algorithm: assign sets of character states to internal nodes based on character states at tips. Polytomies okay. -Assumes a *tree* (no reticulation) and correct isChild1 attribute. +Assumes a *tree* (no reticulation) and correct ischild1 attribute. output: dictionary with state sets and most parsimonious score """ -function parsimonyBottomUpFitch!(node::Node, possibleStates::Dict{Int,Set{T}}, parsimonyscore::Array{Int,1}) where {T} +function parsimonyfitch_bottomup!(node::Node, possibleStates::Dict{Int,Set{T}}, parsimonyscore::Array{Int,1}) where {T} node.leaf && return # change nothing if leaf childrenStates = Set{T}[] # state sets for the 2 (or more) children for e in node.edge - if e.node[e.isChild1 ? 1 : 2] == node continue; end + if e.node[e.ischild1 ? 1 : 2] == node continue; end # excluded parent edges only: assuming tree here child = getOtherNode(e, node) - parsimonyBottomUpFitch!(child, possibleStates, parsimonyscore) + parsimonyfitch_bottomup!(child, possibleStates, parsimonyscore) if haskey(possibleStates, child.number) # false if missing data push!(childrenStates, possibleStates[child.number]) end @@ -40,7 +40,7 @@ function parsimonyBottomUpFitch!(node::Node, possibleStates::Dict{Int,Set{T}}, p end """ - parsimonyTopDownFitch!(node, states) + parsimonyfitch_topdown!(node, states) Top-down phase (root to tips) of the Fitch algorithm: constrains character states at internal nodes based on @@ -48,39 +48,39 @@ the state of the root. Assumes a *tree*: no reticulation. output: dictionary with state sets """ -function parsimonyTopDownFitch!(node::Node, possibleStates::Dict{Int,Set{T}}) where {T} +function parsimonyfitch_topdown!(node::Node, possibleStates::Dict{Int,Set{T}}) where {T} for e in node.edge - child = e.node[e.isChild1 ? 1 : 2] + child = e.node[e.ischild1 ? 1 : 2] if child == node continue; end # exclude parent edges if child.leaf continue; end # no changing the state of tips commonState = intersect(possibleStates[node.number], possibleStates[child.number]) if !isempty(commonState) possibleStates[child.number] = Set(commonState) # restrain states to those with cost 0 end - parsimonyTopDownFitch!(child, possibleStates) + parsimonyfitch_topdown!(child, possibleStates) end return possibleStates # updated dictionary of sets of character states end """ - parsimonySummaryFitch(tree, nodestates) + parsimonyfitch_summary(tree, nodestates) summarize character states at nodes, assuming a *tree* """ -function parsimonySummaryFitch(tree::HybridNetwork, nodestates::Dict{Int,Set{T}}) where {T} +function parsimonyfitch_summary(tree::HybridNetwork, nodestates::Dict{Int,Set{T}}) where {T} println("node number => character states on tree ", - writeTopology(tree,di=true,round=true,digits=1)) + writenewick(tree,di=true,round=true,digits=1)) for n in tree.node haskey(nodestates, n.number) || continue print(n.number) if n.name != "" print(" (",n.name,")"); end - if n == tree.node[tree.root] print(" (root)"); end + if n == tree.node[tree.rooti] print(" (root)"); end println(": ", sort(collect(nodestates[n.number]))) end end """ - parsimonyDiscreteFitch(net, tipdata) + parsimonyfitch(net, tipdata) Calculate the most parsimonious (MP) score of a network given a discrete character at the tips. @@ -95,7 +95,7 @@ also return the union of all optimized character states at each internal node as obtained by Fitch algorithm, where the union is taken over displayed trees with the MP score. """ -function parsimonyDiscreteFitch(net::HybridNetwork, tips::Dict{String,T}) where {T} +function parsimonyfitch(net::HybridNetwork, tips::Dict{String,T}) where {T} # T = type of characters. Typically Int if data are binary 0-1 # initialize dictionary: node number -> admissible character states possibleStates = Dict{Int,Set{T}}() @@ -107,14 +107,14 @@ function parsimonyDiscreteFitch(net::HybridNetwork, tips::Dict{String,T}) where charset = union(possibleStates) # fixit # assign this set to all tips with no data - directEdges!(net) # parsimonyBottomUpFitch! uses isChild1 attributes - trees = displayedTrees(net, 0.0) # all displayed trees + directedges!(net) # parsimonyfitch_bottomup! uses ischild1 attributes + trees = displayedtrees(net, 0.0) # all displayed trees mpscore = Int[] # one score for each tree statesets = Dict{Int,Set{T}}[] # one state set dict per tree for tree in trees statedict = deepcopy(possibleStates) parsimonyscore = [0] # initialization, mutable - parsimonyBottomUpFitch!(tree.node[tree.root], statedict, parsimonyscore) + parsimonyfitch_bottomup!(tree.node[tree.rooti], statedict, parsimonyscore) push!(mpscore, parsimonyscore[1]) push!(statesets, statedict) end @@ -123,8 +123,8 @@ function parsimonyDiscreteFitch(net::HybridNetwork, tips::Dict{String,T}) where statedictUnion = statesets[mpt[1]] # later: union over all MP trees # println("parsimony score: ", mps) for i in mpt # top down calculation for best trees only - parsimonyTopDownFitch!(trees[i].node[trees[i].root], statesets[i]) - parsimonySummaryFitch(trees[i], statesets[i]) + parsimonyfitch_topdown!(trees[i].node[trees[i].rooti], statesets[i]) + parsimonyfitch_summary(trees[i], statesets[i]) if i == mpt[1] continue; end for n in keys(statesets[i]) if haskey(statedictUnion, n) # degree-2 nodes absent from trees @@ -139,7 +139,7 @@ function parsimonyDiscreteFitch(net::HybridNetwork, tips::Dict{String,T}) where return mps, statedictUnion end -function parsimonyDiscreteFitch(net::HybridNetwork, dat::DataFrame) +function parsimonyfitch(net::HybridNetwork, dat::DataFrame) i = findfirst(isequal(:taxon), DataFrames.propertynames(dat)) if i===nothing i = findfirst(isequal(:species), DataFrames.propertynames(dat)); end if i===nothing i=1; end # first column if no column named "taxon" or "species" @@ -154,11 +154,11 @@ function parsimonyDiscreteFitch(net::HybridNetwork, dat::DataFrame) if ismissing(dat[r,j]) continue; end tips[dat[r,i]] = dat[r,j] end - parsimonyDiscreteFitch(net,tips) + parsimonyfitch(net,tips) end """ - parsimonyBottomUpSoftwired!(node, blobroot, states, w, scores) + parsimonysoftwired_bottomup!(node, blobroot, states, w, scores) Computing the MP scores (one for each assignment of the root state) of a swicthing as described in Algorithm 1 in the following paper: @@ -167,25 +167,25 @@ Fischer, M., van Iersel, L., Kelk, S., Scornavacca, C. (2015). On computing the Maximum Parsimony score of a phylogenetic network. SIAM J. Discrete Math., 29(1):559-585. -Assumes a *switching* (ie correct `fromBadDiamondI` field) and correct isChild1 field. -The field `isExtBadTriangle` is used to know which nodes are at the root of a blob. +Assumes a *switching* (ie correct `boole2` field) and correct ischild1 field. +The field `booln4` is used to know which nodes are at the root of a blob. """ -function parsimonyBottomUpSoftwired!(node::Node, blobroot::Node, nchar::Integer, +function parsimonysoftwired_bottomup!(node::Node, blobroot::Node, nchar::Integer, w::AbstractArray, parsimonyscore::AbstractArray) #println("entering with node $(node.number)") parsimonyscore[node.number,:] = w[node.number,:] # at all nodes to re-initialize between switchings - if node.leaf || (node.isExtBadTriangle && node != blobroot) - return nothing # isExtBadTriangle=dummy leaf: root of another blob + if node.leaf || (node.booln4 && node != blobroot) + return nothing # booln4=dummy leaf: root of another blob end for e in node.edge - if (e.hybrid && e.fromBadDiamondI) || getchild(e) == node continue; end # fromBadDiamondI= edge switched off + if (e.hybrid && e.boole2) || getchild(e) == node continue; end # boole2= edge switched off son = getchild(e) - parsimonyBottomUpSoftwired!(son, blobroot, nchar, w, parsimonyscore) + parsimonysoftwired_bottomup!(son, blobroot, nchar, w, parsimonyscore) end for s in 1:nchar for e in node.edge - if (e.hybrid && e.fromBadDiamondI) || getchild(e) == node continue; end + if (e.hybrid && e.boole2) || getchild(e) == node continue; end son = getchild(e) bestMin = Inf # best score from to this one child starting from s at the node for sf in 1:nchar # best assignement for the son @@ -205,8 +205,8 @@ end """ - parsimonySoftwired(net, tipdata) - parsimonySoftwired(net, species, sequences) + parsimonysoftwired(net, tipdata) + parsimonysoftwired(net, species, sequences) Calculate the most parsimonious (MP) score of a network given a discrete character at the tips. @@ -240,7 +240,7 @@ extendable to other parsimony criteria. On computing the Maximum Parsimony score of a phylogenetic network. SIAM J. Discrete Math., 29(1):559-585. """ -function parsimonySoftwired(net::HybridNetwork, tips::Dict{String,T}) where {T} +function parsimonysoftwired(net::HybridNetwork, tips::Dict{String,T}) where {T} # T = type of characters. Typically Int if data are binary 0-1 species = String[] dat = Vector{T}[] @@ -248,10 +248,10 @@ function parsimonySoftwired(net::HybridNetwork, tips::Dict{String,T}) where {T} push!(species, k) push!(dat, [v]) end - parsimonySoftwired(net, species, dat) + parsimonysoftwired(net, species, dat) end -function parsimonySoftwired(net::HybridNetwork, dat::DataFrame) +function parsimonysoftwired(net::HybridNetwork, dat::DataFrame) i = findfirst(isequal(:taxon), DataFrames.propertynames(dat)) if i===nothing i = findfirst(isequal(:species), DataFrames.propertynames(dat)); end if i===nothing i=1; end # first column if no column named "taxon" or "species" @@ -261,19 +261,21 @@ function parsimonySoftwired(net::HybridNetwork, dat::DataFrame) error("""expecting taxon names in column 'taxon', or 'species' or column 1, and trait values in column 'trait' or column 2.""") end - innet = findall(in(tipLabels(net)), dat[i]) # species in the network + innet = findall(in(tiplabels(net)), dat[i]) # species in the network species = dat[innet, i] tips = dat[j][innet] indna = findall(ismissing, tips) # species with missing data deleteat!(species, indna) deleteat!(tips, indna) - parsimonySoftwired(net,tips) + parsimonysoftwired(net,tips) end -function parsimonySoftwired(net::HybridNetwork, species::Array{String}, - sequenceData::AbstractArray) - - resetNodeNumbers!(net) +function parsimonysoftwired( + net::HybridNetwork, + species::Array{String}, + sequenceData::AbstractArray +) + resetnodenumbers!(net) nsites = length(sequenceData[1]) nspecies = length(species) # no check to see if == length(sequenceData) nchar = 0 # this is to allocate the needed memory for w and @@ -287,7 +289,7 @@ function parsimonySoftwired(net::HybridNetwork, species::Array{String}, tips = Dict{String, typeof(sequenceData[1][1])}() # to re-use memory later (?) checkGap = eltype(sequenceData) == BioSequences.BioSequence sequenceType = eltype(sequenceData[1]) - blobroots, majorEdges, minorEdges = blobInfo(net) # calls directEdges!: sets isChild1 + blobroots, majorEdges, minorEdges = blobinfo(net) # calls directedges!: sets ischild1 score = 0.0 #allscores = Float64[] @@ -307,7 +309,7 @@ function parsimonySoftwired(net::HybridNetwork, species::Array{String}, charset = union(values(tips)) nchari = length(charset) # possibly < nchar nchari > 0 || continue - initializeWeightsFromLeavesSoftwired!(w, net, tips, charset) # data are now in w + initializeweightsfromleaves_softwired!(w, net, tips, charset) # data are now in w fill!(parsimonyscore, 0.0) # reinitialize parsimonyscore too # @show tips; @show w @@ -320,15 +322,15 @@ function parsimonySoftwired(net::HybridNetwork, species::Array{String}, iswitch = 0 perms = nhyb == 0 ? [()] : Iterators.product([[true, false] for i=1:nhyb]...) for switching in perms - # next: modify the `fromBadDiamondI` of hybrid edges in the blob: + # next: modify the `boole2` of hybrid edges in the blob: # switching[h] = pick the major parent of hybrid h if true, pick minor if false iswitch += 1 #@show switching for h in 1:nhyb - majorEdges[bcnumber][h].fromBadDiamondI = switching[h] - minorEdges[bcnumber][h].fromBadDiamondI = !switching[h] + majorEdges[bcnumber][h].boole2 = switching[h] + minorEdges[bcnumber][h].boole2 = !switching[h] end - parsimonyBottomUpSoftwired!(r, r, nchari, w, parsimonyscore) # updates parsimonyscore + parsimonysoftwired_bottomup!(r, r, nchari, w, parsimonyscore) # updates parsimonyscore for s in 1:nchari mpscoreSwitchings[iswitch,s] = parsimonyscore[r.number,s] end @@ -341,7 +343,7 @@ function parsimonySoftwired(net::HybridNetwork, species::Array{String}, bcnumber+=1 end - bestMin = minimum(w[net.node[net.root].number, 1:nchari]) + bestMin = minimum(w[net.node[net.rooti].number, 1:nchari]) #if bestMin>0 println("site $isite, score $bestMin"); end #push!(allscores, bestMin) score += bestMin @@ -350,13 +352,18 @@ function parsimonySoftwired(net::HybridNetwork, species::Array{String}, end """ - initializeWeightsFromLeavesSoftwired!(w, net, tips, charset) + initializeweightsfromleaves_softwired!(w, net, tips, charset) Modify weight in w: to Inf for w[n, s] if the "tips" data has a state different from s at node number n. Assumes that w was initialized to 0 for the leaves. """ -function initializeWeightsFromLeavesSoftwired!(w::AbstractArray, net::HybridNetwork, tips, charset) +function initializeweightsfromleaves_softwired!( + w::AbstractArray, + net::HybridNetwork, + tips, + charset +) fill!(w, 0.0) for node in net.node node.leaf || continue @@ -372,7 +379,7 @@ function initializeWeightsFromLeavesSoftwired!(w::AbstractArray, net::HybridNetw end """ - readFastaToArray(filename::AbstractString, sequencetype=BioSequences.LongDNA{4}) + readfastatoarray(filename::AbstractString, sequencetype=BioSequences.LongDNA{4}) Read a fasta-formatted file. Return a tuple `species, sequences` where `species` is a vector of Strings with identifier names, and @@ -385,7 +392,7 @@ where `species` is a vector of Strings with identifier names, and sequence may be broken across several lines though. - fails if all sequences aren't of the same length """ -function readFastaToArray(filename::AbstractString, sequencetype=BioSequences.LongDNA{4}) +function readfastatoarray(filename::AbstractString, sequencetype=BioSequences.LongDNA{4}) reader = FASTX.FASTA.Reader(open(filename)) sequences = Array{BioSequences.BioSequence}(undef, 0) species = String[] @@ -400,7 +407,7 @@ function readFastaToArray(filename::AbstractString, sequencetype=BioSequences.Lo end """ - readfastatodna(filename::String, countPatterns=false::Bool) + readfastatodna(filename::String, countPatterns::Bool=false) Read a fasta file to a dataframe containing a column for each site. If `countPatterns` is true, calculate weights and remove identical @@ -416,7 +423,7 @@ Return a tuple containing: where each taxon name appears only once. For this one time, the corresponding sequence may be broken across several lines though. """ -function readfastatodna(fastafile::String, countPatterns=false::Bool) +function readfastatodna(fastafile::String, countPatterns::Bool=false) reader = FASTX.FASTA.Reader(open(fastafile)) siteList = Vector{Vector}(undef, 0) # vector of vectors: one for each site species = String[] @@ -463,8 +470,8 @@ function readfastatodna(fastafile::String, countPatterns=false::Bool) end """ - readCSVtoArray(dat::DataFrame) - readCSVtoArray(filename::String) + readcsvtoarray(dat::DataFrame) + readcsvtoarray(filename::String) Read a CSV table containing both species names and data, create two separate arrays: one for the species names, @@ -475,7 +482,7 @@ Warning: If none found, it will assume the taxon names are in column 1. - will use all other columns as characters """ -function readCSVtoArray(dat::DataFrame) +function readcsvtoarray(dat::DataFrame) i = findfirst(isequal(:taxon), DataFrames.propertynames(dat)) if i===nothing i = findfirst(isequal(:species), DataFrames.propertynames(dat)); end if i===nothing @@ -504,9 +511,9 @@ function readCSVtoArray(dat::DataFrame) return species,seq end -function readCSVtoArray(filename::String) - dat = DataFrame(CSV.File(filename); copycols=false) - readCSVtoArray(dat) +function readcsvtoarray(filename::String) + dat = CSV.read(filename, DataFrame) + readcsvtoarray(dat) end """ @@ -537,7 +544,7 @@ of each hybrid node within a blob, so its complexity is of the order of `n * m * c^2 * c^level` where `n` is the number of tips, `m` the number of traits and `c` the number of states. -See [`parsimonySoftwired`](@ref) for a faster algorithm, but +See [`parsimonysoftwired`](@ref) for a faster algorithm, but solving the softwired criterion only. ## references @@ -551,14 +558,16 @@ solving the softwired criterion only. On computing the Maximum Parsimony score of a phylogenetic network. SIAM J. Discrete Math., 29(1):559-585. -Use the recursive helper function [`parsimonyBottomUpGF!`](@ref). -Use the fields `isChild1`, -`isExtBadTriangle` to know which nodes are at the root of a blob, and -`fromBadDiamondI` to know which edges are cut (below the minor parent of each hybrid). +Use the recursive helper function [`parsimonyGF_bottomup!`](@ref). +Use the fields `ischild1`, +`booln4` to know which nodes are at the root of a blob, and +`boole2` to know which edges are cut (below the minor parent of each hybrid). """ -function parsimonyGF(net::HybridNetwork, tips::Dict{String,T}, - criterion=:softwired::Symbol) where {T} - # T = type of characters. Typically Int if data are binary 0-1 +function parsimonyGF( + net::HybridNetwork, + tips::Dict{String,T}, + criterion::Symbol=:softwired +) where {T} # T = type of characters. Typically Int if data are binary 0-1 species = String[] dat = Vector{T}[] for (k,v) in tips @@ -569,11 +578,14 @@ function parsimonyGF(net::HybridNetwork, tips::Dict{String,T}, end -function parsimonyGF(net::HybridNetwork, species::Array{String}, - sequenceData::AbstractArray, criterion=:softwired::Symbol) - - resetNodeNumbers!(net) # direct edges and checks pre-order by default - rootnumber = net.node[net.root].number +function parsimonyGF( + net::HybridNetwork, + species::Array{String}, + sequenceData::AbstractArray, + criterion::Symbol=:softwired +) + resetnodenumbers!(net) # direct edges and checks pre-order by default + rootnumber = net.node[net.rooti].number nsites = length(sequenceData[1]) nspecies = length(species) # no check to see if == length(sequenceData) nstates = 0 # this is to allocate the needed memory for w and @@ -670,12 +682,12 @@ function parsimonyGF(net::HybridNetwork, species::Array{String}, tips = Dict{String, typeof(sequenceData[1][1])}() # to re-use memory later (?) checkGap = eltype(sequenceData) == BioSequences.BioSequence sequenceType = eltype(sequenceData[1]) - blobroots, majorEdges, minorEdges = blobInfo(net) # calls directEdges!: sets isChild1 + blobroots, majorEdges, minorEdges = blobinfo(net) # calls directedges!: sets ischild1 # fixit: use trivial biconnected components, and compare running time # pick 1 parent node (the minor parent arbitrarily) for each hybrid, then - # "cut" both children edges of that parent: mark its `fromBadDiamondI` = false + # "cut" both children edges of that parent: mark its `boole2` = false for e in net.edge - e.fromBadDiamondI = false # don't cut by default + e.boole2 = false # don't cut by default end guessedparent = Vector{Node}[] for melist in minorEdges # minor edge list for one single blob + loop over blobs @@ -686,7 +698,7 @@ function parsimonyGF(net::HybridNetwork, species::Array{String}, push!(guessedparentBlob, p) for e2 in p.edge p == getparent(e2) || continue - e2.fromBadDiamondI = true # cut the edge: not followed in recursive call + e2.boole2 = true # cut the edge: not followed in recursive call end end end @@ -699,24 +711,24 @@ function parsimonyGF(net::HybridNetwork, species::Array{String}, # determine which nodes are the root of trees after we cut off edges # below guessed parents. For this, at each node, set its - # inCycle = 0 if the node has (at least) 1 non-cut edge, and - # inCycle = # of detached parents if the node has detached parents only. + # intn1 = 0 if the node has (at least) 1 non-cut edge, and + # intn1 = # of detached parents if the node has detached parents only. # Do this now to avoid re-doing it at each site. - # `inCycle` was used earlier to find blobs. - for n in net.node n.inCycle=0; end - # first: calculate inCycle = # of detached parents + # `intn1` was used earlier to find blobs. + for n in net.node n.intn1=0; end + # first: calculate intn1 = # of detached parents for e in net.edge - e.fromBadDiamondI || continue # to next edge if current edge not cut + e.boole2 || continue # to next edge if current edge not cut n = getchild(e) - n.inCycle += 1 + n.intn1 += 1 end - # second: make inCycle = 0 if node has a non-detached parent + # second: make intn1 = 0 if node has a non-detached parent for n in net.node - n.inCycle > 0 || continue # to next node if inCycle = 0 already + n.intn1 > 0 || continue # to next node if intn1 = 0 already for e in n.edge n == getchild(e) || continue - !e.fromBadDiamondI || continue - n.inCycle = 0 # if e parent of n and e not cut: make inCycle 0 + !e.boole2 || continue + n.intn1 = 0 # if e parent of n and e not cut: make intn1 0 break end end @@ -742,7 +754,7 @@ function parsimonyGF(net::HybridNetwork, species::Array{String}, if criterion == :softwired nchari = nstatesi + 1 end - initializeWeightsFromLeaves!(w, net, tips, stateset, criterion) # data are now in w + initializeweightsfromleaves!(w, net, tips, stateset, criterion) # data are now in w #fill!(parsimonyscore, 0.0) # reinitialize parsimonyscore too # @show tips; @show w @@ -763,7 +775,7 @@ function parsimonyGF(net::HybridNetwork, species::Array{String}, end w[p.number, guesses[pind]] = 0.0 end - parsimonyBottomUpGF!(r, r, nchari, w, parsimonyscore, costmatrix1, costmatrix2) + parsimonyGF_bottomup!(r, r, nchari, w, parsimonyscore, costmatrix1, costmatrix2) # recursion above: updates parsimonyscore #@show nchari if firstguess @@ -802,7 +814,7 @@ function parsimonyGF(net::HybridNetwork, species::Array{String}, end """ - initializeWeightsFromLeaves!(w, net, tips, stateset, criterion) + initializeweightsfromleaves!(w, net, tips, stateset, criterion) Modify weight in w: to Inf for w[n, i] if the "tips" data has a state different from the lineage state of index i at node number n. @@ -811,8 +823,13 @@ Assumes that w was initialized to 0 for the leaves. criterion: should be one of `:softwired`, `:parental` or `:hardwired`. - softwired parsimony: lineage states are in this order: ∅,{1},{2},{3},...,{nstates} """ -function initializeWeightsFromLeaves!(w::AbstractArray, net::HybridNetwork, tips, stateset, - criterion::Symbol) +function initializeweightsfromleaves!( + w::AbstractArray, + net::HybridNetwork, + tips, + stateset, + criterion::Symbol +) fill!(w, 0.0) if criterion == :softwired nchar = length(stateset) + 1 @@ -836,7 +853,7 @@ function initializeWeightsFromLeaves!(w::AbstractArray, net::HybridNetwork, tips end """ - parsimonyBottomUpGF!(node, blobroot, nchar, w, scores, + parsimonyGF_bottomup!(node, blobroot, nchar, w, scores, costmatrix1, costmatrix2) Compute the MP scores (one for each assignment of the blob root state) @@ -849,12 +866,12 @@ Systematic Biology, (https://doi.org/10.1093/sysbio/syx094). Assumes a set of state *guesses*, ie correct initialization of `w` for -predefined hybrid parents, and correct `fromBadDiamondI` field for the children -edges of these predefined parents. `fromBadDiamondI` is true for edges that are cut. +predefined hybrid parents, and correct `boole2` field for the children +edges of these predefined parents. `boole2` is true for edges that are cut. -The field `isExtBadTriangle` is used to know which nodes are at the root of a blob. -The field `isChild1` is used (and assumed correct). -Field `inCycle` is assumed to store the # of detached parents (with guessed states) +The field `booln4` is used to know which nodes are at the root of a blob. +The field `ischild1` is used (and assumed correct). +Field `intn1` is assumed to store the # of detached parents (with guessed states) - `nchar`: number of characters considered at internal lineages. For softwired parsimony, this is # states + 1, because characters @@ -870,30 +887,35 @@ Field `inCycle` is assumed to store the # of detached parents (with guessed stat used by [`parsimonyGF`](@ref). """ -function parsimonyBottomUpGF!(node::Node, blobroot::Node, nchar::Integer, - w::AbstractArray, parsimonyscore::AbstractArray, - costmatrix1::AbstractArray, costmatrix2::AbstractArray) - +function parsimonyGF_bottomup!( + node::Node, + blobroot::Node, + nchar::Integer, + w::AbstractArray, + parsimonyscore::AbstractArray, + costmatrix1::AbstractArray, + costmatrix2::AbstractArray +) #println("entering with node $(node.number)") parsimonyscore[node.number,1:nchar] = w[node.number,1:nchar] # at all nodes to re-initialize between guesses - if !node.leaf && (!node.isExtBadTriangle || node == blobroot) - # isExtBadTriangle=dummy leaf: root of another blob + if !node.leaf && (!node.booln4 || node == blobroot) + # booln4=dummy leaf: root of another blob for e in node.edge # post-order traversal according to major tree: detached edges were minor. - if !e.isMajor || getchild(e) == node continue; end # Even if we didn't visit one parent (yet), + if !e.ismajor || getchild(e) == node continue; end # Even if we didn't visit one parent (yet), son = getchild(e) # that parent is a minor parent with an assigned guessed state. - parsimonyBottomUpGF!(son, blobroot, nchar, w, parsimonyscore, costmatrix1, costmatrix2) + parsimonyGF_bottomup!(son, blobroot, nchar, w, parsimonyscore, costmatrix1, costmatrix2) end # check to see if "node" has guessed value: by checking to see if all its children edges were cut cutparent = false for e in node.edge if getchild(e) == node continue; end - if e.fromBadDiamondI # if true: one child edge is cut, so all are cut + if e.boole2 # if true: one child edge is cut, so all are cut cutparent = true break end end if !cutparent # look at best assignment of children, to score each assignment at node - for e in node.edge # avoid edges that were cut: those for which fromBadDiamondI is true + for e in node.edge # avoid edges that were cut: those for which boole2 is true son = getchild(e) if son == node continue; end bestpars = [Inf for s in 1:nchar] # best score, so far, for state s at node. @@ -930,12 +952,12 @@ function parsimonyBottomUpGF!(node::Node, blobroot::Node, nchar::Integer, node != blobroot || return nothing # if blob root has detached parents only, these are paid for in the blob # in which this blob root is a leaf. - node.inCycle > 0 || return nothing # inCycle = # of detached parents + node.intn1 > 0 || return nothing # intn1 = # of detached parents # if we get here, it means that "node" is not root of current blob, but # is root of a tree after detaching all guessed parents from their children. # pay now for re-attaching the guessed parents to node cost = 0.0 # variable external to 'for' loops below - if node.inCycle == 1 # 1 detached parent, no non-detached parents + if node.intn1 == 1 # 1 detached parent, no non-detached parents for e in node.edge par = getparent(e) if par == node continue; end @@ -946,7 +968,7 @@ function parsimonyBottomUpGF!(node::Node, blobroot::Node, nchar::Integer, #println("node $(node.number), parent $(par.number), guess k=$k") break # out of for loop end - else # node.inCycle should be 2: 2 detached parents + else # node.intn1 should be 2: 2 detached parents k1 = 0 # guess made on first detached parent for e in node.edge par = getparent(e) @@ -975,27 +997,24 @@ end ## -------------------------------------------------- ## Search for most parsimonious network -## start the search from (or near) topology currT, -## .loglik will save now parsimony score -## fixit: we are using the functions for level1 network, we need to include level-k networks -## this will be done by changing the current proposedTop! function -## the current search/moves functions are the same for snaq, so they need a "good" semi-directed -## network, so currently we propose new topology from this set of networks, and simply root to -## compute the parsimony score (we do not keep rooted networks as the search objects), -## that is, newT and currT are unrooted through the whole algorithm (because computing the parsimony destroys inCycle) -## criterion=softwired by default -## at this stage, currT is compatible with the outgroup, but still unrooted (for moves functions to work) ## tolAbs: could be set to 0.1 and removed from list of arguments. up to 0.5 should work, ## because parsimony scores are integers, but Float64 to extend cost function later perhaps +## +## Near-term fix: maxParsimonuNetRun1 and maxParsimonuNetRun1! are commented out. +## The body of maxParsimonyNet is commented out, replaced by an error notifying the user of the issues of the function. +## The functions are not exported. Their tests and documentation are commented out + +#= """ -Road map for various functions behind maxParsimonyNet +Road map for various functions behind maxParsimonyNet: from v0.16 of PhyloNetworks. +These functions will be completely re-implemented in a future version maxParsimonyNet maxParsimonyNetRun1 maxParsimonyNetRun1! -All return their optimized network. Only maxParsimonyNet returns a rooted network -(though all functions guarantee that the returned networks agree with the outgroup). +All return their optimized network. Only maxParsimonyNet returns a rooted network, +though all functions guarantee that the returned networks agree with the outgroup. - maxParsimonyNet calls maxParsimonyNetRun1 per run, after a read(write(.)) of the starting network (to ensure level-1 and semi-directedness). @@ -1011,7 +1030,7 @@ Note that the search algorithm keeps two HybridNetworks at a time: currT (curren Both are kept unrooted (semi-directed), otherwise the moves in proposedTop! function fail. We only root the topologies to calculate the parsimony, so we create a rooted copy (currTr, newTr) to compute parsimony score in this copied topology. We do not root and calculate parsimony score in the original HybridNetworks objects (currT,newT) -because the computation of the parsimony score overwrites the inCycle attribute of the Nodes, which messes with +because the computation of the parsimony score overwrites the intn1 attribute of the Nodes, which messes with the search moves. Extensions: @@ -1026,9 +1045,17 @@ Extensions: - outgroup is currently String or Node number, but it would be good if it allowed Edge number as an option too. Not sure best way to distinguish between Node number and Edge number, which is why left as Node number for now. """ -function maxParsimonyNetRun1!(currT::HybridNetwork, tolAbs::Float64, Nfail::Integer, df::DataFrame, hmax::Integer, - logfile::IO, writelog::Bool, outgroup::Union{AbstractString,Integer}, - criterion=:softwired::Symbol) +function maxParsimonyNetRun1!( + currT::HybridNetwork, + tolAbs::Float64, + Nfail::Integer, + df::DataFrame, + hmax::Integer, + logfile::IO, + writelog::Bool, + outgroup::Union{AbstractString,Integer}, + criterion::Symbol=:softwired +) tolAbs >= 0 || error("tolAbs must be greater than zero: $(tolAbs)") Nfail > 0 || error("Nfail must be greater than zero: $(Nfail)") @debug begin printEverything(currT); "printed everything" end @@ -1039,10 +1066,10 @@ function maxParsimonyNetRun1!(currT::HybridNetwork, tolAbs::Float64, Nfail::Inte failures = 0 stillmoves = true Nmov = zeros(Int,6) - species, traits = readCSVtoArray(df) + species, traits = readcsvtoarray(df) currTr = deepcopy(currT) rootatnode!(currTr,outgroup) - currT.loglik = parsimonyGF(currTr,species,traits,criterion) + currT.fscore = parsimonyGF(currTr,species,traits,criterion) absDiff = tolAbs + 1 newT = deepcopy(currT) writelog && write(logfile, "\nBegins heuristic search of most parsimonious network------\n") @@ -1063,11 +1090,11 @@ function maxParsimonyNetRun1!(currT::HybridNetwork, tolAbs::Float64, Nfail::Inte if flag #no need else in general because newT always undone if failed, but needed for conflicts with root @debug "successful move and correct root placement" accepted = false - newT.loglik = parsimonyGF(newTr,species,traits,criterion) - accepted = (newT.loglik < currT.loglik && abs(newT.loglik-currT.loglik) > tolAbs) ? true : false + newT.fscore = parsimonyGF(newTr,species,traits,criterion) + accepted = (newT.fscore < currT.fscore && abs(newT.fscore-currT.fscore) > tolAbs) ? true : false #newT better parsimony score: need to check for error or keeps jumping back and forth if accepted - absDiff = abs(newT.loglik - currT.loglik) + absDiff = abs(newT.fscore - currT.fscore) currT = deepcopy(newT) failures = 0 movescount[move2int[move]+12] += 1 @@ -1093,20 +1120,36 @@ function maxParsimonyNetRun1!(currT::HybridNetwork, tolAbs::Float64, Nfail::Inte else writelog && write(logfile,"\nSTOPPED by number of failures criteria") end - writelog && write(logfile,"\nEND: found minimizer topology at step $(count) (failures: $(failures)) with parsimony score=$(round(newT.loglik, digits=5))") + writelog && write(logfile,"\nEND: found minimizer topology at step $(count) (failures: $(failures)) with parsimony score=$(round(newT.fscore, digits=5))") writelog && printCounts(movescount,zeros(Int,13),logfile) ## zeroes in lieu of movesgamma, not used in parsimony - setBLGammaParsimony!(newT) + #= to use snaq move functions, branch lengths and γ's were set randomly to + initialize optimization. Remove them before returning the MP network. + =# + remove_edgelengthsgammas!(newT) return newT end +""" + maxParsimonyNetRun1(input_network) + -## find the maximum parsimony network; -## transform the starting topology first -## does not allow multiple alleles -@doc (@doc maxParsimonyNetRun1!) maxParsimonyNetRun1 -function maxParsimonyNetRun1(currT0::HybridNetwork, df::DataFrame, Nfail::Integer, tolAbs::Float64, - hmax::Integer,seed::Integer,logfile::IO, writelog::Bool, probST::Float64, - outgroup::Union{AbstractString,Integer}, criterion=:softwired::Symbol) +Search for the most parsimonious network, starting from a neighbor network +of `input_network` after applying a move. The `input_network` is *not* modified. +Then calls `maxParsimonyNetRun1!` to search the network space. +""" +function maxParsimonyNetRun1( + currT0::HybridNetwork, + df::DataFrame, + Nfail::Integer, + tolAbs::Float64, + hmax::Integer, + seed::Integer, + logfile::IO, + writelog::Bool, + probST::Float64, + outgroup::Union{AbstractString,Integer}, + criterion::Symbol=:softwired +) Random.seed!(seed) currT = findStartingTopology!(currT0, probST, false,writelog, logfile, outgroup=outgroup) net = maxParsimonyNetRun1!(currT, tolAbs, Nfail, df, hmax,logfile,writelog, outgroup, criterion) @@ -1114,15 +1157,22 @@ function maxParsimonyNetRun1(currT0::HybridNetwork, df::DataFrame, Nfail::Intege end -## find the most parsimonious network over multiple runs + ## no multiple alleles for now; ## if rootname not defined, it does not save output files ## fixit: now it only works if currT0 is tree, or level-1 network ## also, throws an error if outgroup not compatible with starting network ## (instead of choosing another root) +=# """ maxParsimonyNet(T::HybridNetwork, df::DataFrame) +!!! warning "feature to be re-implemented" + This function has been disabled. + It will be re-implemented, without the level-1 restriction. + Please use version 0.16 of PhyloNetworks to access this older functionality, + until a better one is made available. + Search for the most parsimonious network (or tree). A level-1 network is assumed. `df` should be a data frame containing the species names in column 1, @@ -1167,15 +1217,22 @@ Optional arguments include 2. Fischer, M., van Iersel, L., Kelk, S., Scornavacca, C. (2015). On computing the Maximum Parsimony score of a phylogenetic network. SIAM J. Discrete Math., 29(1):559-585. - -For a roadmap of the functions inside maxParsimonyNet, see [`maxParsimonyNetRun1!`](@ref). """ -function maxParsimonyNet(currT::HybridNetwork, df::DataFrame; - tolAbs=fAbs::Float64, Nfail=numFails::Integer, - hmax=1::Integer, runs=10::Integer, outgroup="none"::Union{AbstractString,Integer}, - rootname="mp"::AbstractString, seed=0::Integer, probST=0.3::Float64, - criterion=:softwired::Symbol) - +function maxParsimonyNet( + currT::HybridNetwork, + df::DataFrame; + tolAbs::Float64=fAbsBL, + Nfail::Integer=numFails, + hmax::Integer=1, + runs::Integer=10, + outgroup::Union{AbstractString,Integer}="none", + rootname::AbstractString="mp", + seed::Integer=0, + probST::Float64=0.3, + criterion::Symbol=:softwired +) + error("Function is temporarily broken after refactoring. Use PhyloNetworks v0.16.4 for a working version") + #= currT0 = readTopologyUpdate(writeTopologyLevel1(currT)) # update all level-1 things flag = checkNet(currT0,true) # light checking only flag && error("starting topology suspected not level-1") @@ -1209,7 +1266,7 @@ function maxParsimonyNet(currT::HybridNetwork, df::DataFrame; ##but we need a semi-directed level-1 "good" network (currT0) for search str *= (writelog ? "rootname for files: $(rootname)\n" : "no output files\n") - str *= "BEGIN: $(runs) runs on starting tree $(writeTopology(currT0))\n" + str *= "BEGIN: $(runs) runs on starting tree $(writenewick(currT0))\n" if Distributed.nprocs()>1 str *= " using $(Distributed.nprocs()) processors\n" end @@ -1253,9 +1310,9 @@ function maxParsimonyNet(currT::HybridNetwork, df::DataFrame; try best = maxParsimonyNetRun1(currT0, df, Nfail, tolAbs, hmax, seeds[i],logfile,writelog_1proc, probST,outgroup,criterion); - logstr *= "\nFINISHED Max $(string(criterion)) parsimony for run $(i), parsimony of best: $(best.loglik)\n" + logstr *= "\nFINISHED Max $(string(criterion)) parsimony for run $(i), parsimony of best: $(best.fscore)\n" if writelog_1proc - logstr = writeTopology(best) + logstr = writenewick(best) logstr *= "\n---------------------\n" write(logfile, logstr) flush(logfile) @@ -1282,7 +1339,7 @@ function maxParsimonyNet(currT::HybridNetwork, df::DataFrame; end filter!(n -> n !== nothing, bestnet) # remove "nothing", failed runs if length(bestnet)>0 - ind = sortperm([n.loglik for n in bestnet]) + ind = sortperm([n.fscore for n in bestnet]) bestnet = bestnet[ind] maxNet = bestnet[1]::HybridNetwork # tell type to compiler else @@ -1291,21 +1348,21 @@ function maxParsimonyNet(currT::HybridNetwork, df::DataFrame; rootatnode!(maxNet,outgroup) writelog && - write(logfile,"\nMaxNet is $(writeTopology(maxNet)) \nwith $(string(criterion)) parsimony score $(maxNet.loglik)\n") - print(stdout,"\nMaxNet is $(writeTopology(maxNet)) \nwith $(string(criterion)) parsimony score $(maxNet.loglik)\n") + write(logfile,"\nMaxNet is $(writenewick(maxNet)) \nwith $(string(criterion)) parsimony score $(maxNet.fscore)\n") + print(stdout,"\nMaxNet is $(writenewick(maxNet)) \nwith $(string(criterion)) parsimony score $(maxNet.fscore)\n") s = writelog ? open(juliaout,"w") : stdout - str = writeTopology(maxNet) * """ - $(string(criterion)) parsimony score = $(maxNet.loglik) - Dendroscope: $(writeTopology(maxNet,di=true)) + str = writenewick(maxNet) * """ + $(string(criterion)) parsimony score = $(maxNet.fscore) + Dendroscope: $(writenewick(maxNet,di=true)) Elapsed time: $(telapsed) seconds, $(runs) attempted runs ------- List of estimated networks for all runs (sorted by $(string(criterion)) parsimony score; the smaller, the better): """ for n in bestnet str *= " " - str *= writeTopology(rootatnode!(n,outgroup)) - str *= ", with $(string(criterion)) parsimony $(n.loglik)\n" + str *= writenewick(rootatnode!(n,outgroup)) + str *= ", with $(string(criterion)) parsimony $(n.fscore)\n" end str *= "-------\n" write(s,str); @@ -1313,24 +1370,5 @@ function maxParsimonyNet(currT::HybridNetwork, df::DataFrame; writelog && close(logfile) return maxNet + =# end - - -## unused function: -## function to check if currT agrees with the outgroup -function correctRootPlace(currT::HybridNetwork, outgroup::AbstractString) - try - checkRootPlace!(currT,outgroup=outgroup) - catch err - if isa(err, RootMismatch) - println("RootMismatch: ", err.msg, - """\nThe starting topology has hybrid edges that are incompatible with the desired outgroup. - """) - else - println("error trying to reroot: ", err.msg); - end - return false - end - return true -end - diff --git a/src/phyLiNCoptimization.jl b/src/phyLiNCoptimization.jl deleted file mode 100644 index ec4221600..000000000 --- a/src/phyLiNCoptimization.jl +++ /dev/null @@ -1,1869 +0,0 @@ -# any change to these constants must be documented in phyLiNC! -const moveweights_LiNC = Distributions.aweights([0.6, 0.2, 0.05, 0.05, 0.1]) -const movelist_LiNC = ["nni", "addhybrid", "deletehybrid", "fliphybrid", "root"] -const likAbsAddHybLiNC = 0.0 #= loglik improvement required to retain a hybrid. - Greater values would raise the standard for newly-proposed hybrids, - leading to fewer proposed hybrids accepted during the search =# -const likAbsDelHybLiNC = 0.0 #= loglik decrease allowed when removing a hybrid - lower (more negative) values of lead to more hybrids removed during the search =# -const alphaRASmin = 0.02 -const alphaRASmax = 50.0 -const pinvRASmin = 1e-8 -const pinvRASmax = 0.99 -const kappamax = 20.0 -const BLmin = 1.0e-8 - # min_branch_length = 1.0e-6 in most cases in IQ-TREE v2.0 (see main/phyloanalysis.cpp) -const BLmax = 10.0 - # max_branch_length = 10.0 used in IQ-TREE v2.0 (see utils/tools.cpp) - -""" - CacheGammaLiNC - -Type to store intermediate values during γ optimization, -to limit time spent on garbage collection. -""" -struct CacheGammaLiNC - "conditional likelihood under focus hybrid edge, length nsites" - clike::Vector{Float64} - "conditional likelihood under partner edge, length nsites" - clikp::Vector{Float64} - """conditional likelihood under displayed trees that have - Neither the focus hybrid edge Nor its partner. Length: nsites""" - clikn::Vector{Float64} - """whether displayed trees have the focus hybrid edge (true) - the partner edge (false) or none of them (missing), - which can happen on non-tree-child networks""" - hase::Vector{Union{Missing, Bool}} -end -function CacheGammaLiNC(obj::SSM) - CacheGammaLiNC( - Vector{Float64}(undef, obj.nsites), - Vector{Float64}(undef, obj.nsites), - Vector{Float64}(undef, obj.nsites), - Vector{Union{Missing, Bool}}(undef, length(obj.displayedtree)) - ) -end - -""" - CacheLengthLiNC - -Type to store intermediate values during optimization of one branch length, -to limit time spent on garbage collection. Re-used across branches. -See constructor below, from a `StatisticalSubstitutionModel`. -""" -struct CacheLengthLiNC - """forward likelihood of descendants of focus edge: nstates x nsites x nrates x ntrees""" - flike::Array{Float64,4} - """likelihood of non-descendants of focus edge: direct * backwards * P(rate & tree). - size: nstates x nsites x nrates x ntrees""" - dblike::Array{Float64,4} - """whether displayed trees have the focus edge (true) or not (false), - which can happen for hybrid edges or on non-tree-child networks""" - hase::Vector{Bool} - "transition probability matrices: P(r*t) for each rate r" - Prt::Vector{StaticArrays.MMatrix} - "rQP(rt) for each rate r, for the gradient" - rQP::Vector{StaticArrays.MMatrix} - "site-specific gradient numerator for log-likelihood: nsites" - glik::Vector{Float64} - opt::NLopt.Opt -end - -""" - phyLiNC(net::HybridNetwork, fastafile::String, substitutionModel::Symbol) - -Estimate a phylogenetic network from concatenated DNA data using -maximum likelihood, ignoring incomplete lineage sorting -(phyLiNC: phylogenetic Likelihood Network from Concatenated data). -The network is constrained to have `maxhybrid` reticulations at most, -but can be of any level. -The search starts at (or near) the network `net`, -using a local hill-climbing search to optimize the topology -(nearest-neighbor interchange moves, add hybridizations, -and remove hybridizations). Also optimized are evolutionary rates, -amount of rate variation across sites, branch lengths and inheritance γs. -This search strategy is run `nruns` times, and the best of the `nruns` -networks is returned. - -Return a [`StatisticalSubstitutionModel`](@ref) object, say `obj`, which -contains the estimated network in `obj.net`. - -Required arguments: -- `net`: a network or tree of type `HybridNetwork`, to serve as a starting point - in the search for the best network. - Newick strings can be converted to this format with [`readTopology`] (@ref). -- `fastafile`: file with the sequence data in FASTA format. Ambiguous states are - treated as missing. -- `substitutionModel`: A symbol indicating which substitution model is used. - Choose `:JC69` [`JC69`](@ref) for the Jukes-Cantor model or `:HKY85` for - the Hasegawa, Kishino, Yano model [`HKY85`](@ref). - -The length of the edge below a reticulation is not identifiable. -Therefore, phyLiNC estimates the canonical version of the network: with -reticulations **unzipped**: edges below reticulations are set to 0, and -hybrid edges (parental lineages) have estimated lengths that are -increased accordingly. - -If any branch lengths are missing in the input network, phyLiNC estimates the -starting branch lengths using pairwise distances. Otherwise, it uses the input branch -lengths as starting branch lengths, only unzipping all reticulations, as -described above. - -Optional arguments (default value in parenthesis): -- symbol for the model of rate variation across sites - (`:noRV` for no rate variation): - use `:G` or `:Gamma` for Gamma-distributed rates, - `:I` or `:Inv` for a proportion of invariable sites, and - `:GI` or `:GammaInv` for a combination (not recommended). -- integer (4) for the number of categories to use in estimating - evolutionary rates using a discretized gamma model. When allowing for rate - variation, four categories is standard. With 1 category, - no rate variation is assumed. See [`RateVariationAcrossSites`] (@ref). - -Main optional keyword arguments (default value in parenthesis): -- `speciesfile` (""): path to a csv file with samples in rows and two columns: - species (column 1), individual (column 2) - Include this file to group individuals by species. -- `cladefile` (""): path to a csv file containing two columns: - clades and individuals used to create one or more clade topology - constraints to meet during the search. - (NOTE: clade contraints not yet implemented.) -- `filename` ("phyLiNC"): root name for the output files (`.out`, `.err`). - If empty (""), files are *not* created, progress log goes to the screen only - (standard out). -- `maxhybrid` (1): maximum number of hybridizations allowed. - `net` (starting network) must have `maxhybrid` or fewer reticulations. -- `nruns` (10): number of independent starting points for the search -- `no3cycle` (true): prevents 3-cycles, which are (almost) not - identifiable -- `nohybridladder` (true): prevents hybrid ladder in network. If true, - the input network must not have hybrid ladders. - Warning: Setting this to true will avoid most hybrid ladders, but some can still - occur in some cases when deleting hybrid edges. This might be replaced with an - option to avoid all non-tree-child networks in the future. - -Optional arguments controlling the search: -- `seed` (default 0 to get it from the clock): seed to replicate a given search -- `nreject` (75): maximum number of times that new topologies are - proposed and rejected in a row. Lower values of `nreject` result in a less - thorough but faster search. Controls when to stop proposing new - network topologies. -- `probST` (0.5): probability to use `net` as the starting topology - for each given run. If probST < 1, the starting topology is k NNI moves - away from `net`, where k is drawn from a geometric distribution: p (1-p)ᵏ, - with success probability p = `probST`. -- `maxmoves` (100): maximum number of topology moves before branch lengths, - hybrid γ values, evolutionary rates, and rate variation parameters are - reestimated. -- `verbose` (true): set to false to turn off screen output -- `alphamin` (0.02) and `alphamax` (50.0): minimum and maximum values for - the shape parameter alpha for Gamma-distributed rates across sites. -- `pinvmin` (1e-8) and `pinvmax` (0.99): minimum and maximum values for - the proportion of invariable sites, if included in the model. - -The following optional arguments control when to stop the optimization of branch -lengths and gamma values on each individual candidate network. Defaults in -parentheses. -- `ftolRel` (1e-6) and `ftolAbs` (1e-6): relative and absolute differences of the - network score between the current and proposed parameters -- `xtolRel` (1e-5) and `xtolAbs` (1e-5): relative and absolute differences - between the current and proposed parameters. -Greater values will result in a less thorough but faster search. These parameters -are used when evaluating candidate networks only. -Regardless of these arguments, once a final topology is chosen, branch lenghts -are optimized using stricter tolerances (1e-10, 1e-12, 1e-10, 1e-10) for better -estimates. -""" -function phyLiNC(net::HybridNetwork, fastafile::String, modSymbol::Symbol, - rvsymbol=:noRV::Symbol, rateCategories=4::Int; - maxhybrid=1::Int, no3cycle=true::Bool, - nohybridladder=true::Bool, - speciesfile=""::AbstractString, - cladefile=""::AbstractString, verbose=true::Bool, - kwargs...) - # create constraints and new network if speciesfile - if !isempty(speciesfile) - net, constraints = mapindividuals(net, speciesfile) - else - net = deepcopy(net) - constraints = TopologyConstraint[] - end - if !isempty(cladefile) - error("Clade constraints not yet implemented.") - end - # create starting object for all runs - obj = StatisticalSubstitutionModel(net, fastafile, modSymbol, - rvsymbol, rateCategories; maxhybrid=maxhybrid) - #= after SSM(), update constraint taxon names, taxonnums, edge, and node - because some leaves may be pruned, and check_matchtaxonnames calls - resetNodeNumbers! (changing leaf node numbers) and resetEdgeNumbers! =# - for i in 1:length(constraints) - constraints[i] = PhyloNetworks.TopologyConstraint(constraints[i].type, - constraints[i].taxonnames, obj.net) - end - checknetwork_LiNC!(obj.net, maxhybrid, no3cycle, nohybridladder, constraints, verbose) - #= checknetwork removes degree-2 nodes (including root) and 2- and 3-cycles - and requires that the network is preordered. - Warning: need to call updateSSM after using checknetwork_LiNC =# - updateSSM!(obj, true; constraints=constraints) - if any(e.length < 0.0 for e in obj.net.edge) # check for missing branch lengths - startingBL!(obj.net, obj.trait, obj.siteweight) - end - unzip_canonical!(obj.net) - for e in obj.net.edge # bring branch lengths inside bounds - if e.length < BLmin && !getparent(e).hybrid - e.length = BLmin - elseif e.length > BLmax - e.length = BLmax - end - end - phyLiNC!(obj; maxhybrid=maxhybrid, no3cycle=no3cycle, nohybridladder=nohybridladder, - constraints=constraints, verbose=verbose, kwargs...) -end - -""" - phyLiNC!(obj::SSM; kwargs...) - -Called by [`phyLiNC`](@ref) after `obj` is created (containing both the data -and the model) and after checks are made to start from a network that satisfies -all the constraints. Different runs are distributed to different processors, -if more than one are available. -""" -function phyLiNC!(obj::SSM; - maxhybrid=1::Int, no3cycle=true::Bool, - nohybridladder=true::Bool, maxmoves=100::Int, nreject=75::Int, - nruns=10::Int, filename="phyLiNC"::AbstractString, - verbose=true::Bool, seed=0::Int, probST=0.5::Float64, - ftolRel=1e-6::Float64, ftolAbs=1e-6::Float64, - xtolRel=1e-10::Float64, xtolAbs=1e-5::Float64, - constraints=TopologyConstraint[]::Vector{TopologyConstraint}, - alphamin=alphaRASmin::Float64, alphamax=alphaRASmax::Float64, - pinvmin=pinvRASmin::Float64, pinvmax=pinvRASmax::Float64) - writelog = true - writelog_1proc = false - if filename != "" - logfile = open(string(filename,".log"),"w") - juliaout = string(filename,".out") - if Distributed.nprocs() == 1 - writelog_1proc = true - juliaerr = string(filename,".err") - errfile = open(juliaerr,"w") - end - else - writelog = false - logfile = stdout - end - γcache = CacheGammaLiNC(obj) - # rough optimization of rates and alpha, for better starting values used by all runs - obj.loglik = -Inf - Random.seed!(0) # to re-run a single run (out of several) reproducibly - fit!(obj; optimizeQ=(nparams(obj.model) > 0), - optimizeRVAS=(nparams(obj.ratemodel) > 0), - verbose=false, maxeval=20, - ftolRel=ftolRel, ftolAbs=ftolAbs, xtolRel=xtolRel, xtolAbs=xtolAbs, - alphamin=alphamin, alphamax=alphamax, - pinvmin=pinvmin, pinvmax=pinvmax) - @debug "loglik = $(loglikelihood(obj)) at the start" - str = """ - PhyLiNC network estimation starting. Parameters: - maxhybrid = $(maxhybrid) - nohybridladder = $nohybridladder - no3cycle = $no3cycle - probST= $probST - max number of moves per cycle = $maxmoves - max number of consecutive failed proposals = $(nreject) - optimization tolerance: ftolRel=$(ftolRel), ftolAbs=$(ftolAbs), - xtolAbs=$(xtolAbs), xtolRel=$(xtolRel). - """ * - (writelog ? " filename for log and err files: $(filename)\n" : - " no output files\n") - io = IOBuffer(); showdata(io, obj, true) # true for full site information - str *= String(take!(io)) * "\n"; close(io) - str *= "\n$(nruns) run(s) starting near network topology:\n$(writeTopology(obj.net))\nstarting model:\n" * - replace(string(obj.model), r"\n" => "\n ") * "\n" * - replace(string(obj.ratemodel), r"\n" => "\n ") * "\n" - # fixit: add info about constraints: type and tip names for each constraint - if Distributed.nprocs()>1 - str *= "using $(Distributed.nworkers()) worker processors\n" - end - if writelog - write(logfile,str) - flush(logfile) - end - verbose && print(stdout,str) - verbose && print(stdout, "Time: " * Dates.format(Dates.now(), "yyyy-mm-dd H:M:S.s") * "\n") - # if 1 proc: time printed to logfile at start of every run, not here. - - if seed == 0 - t = time()/1e9 - a = split(string(t),".") - seed = parse(Int,a[2][end-4:end]) # seed based on clock - end - if writelog - write(logfile,"main seed = $(seed)\n---------------------\n") - flush(logfile) - end - verbose && print(stdout,"main seed = $(seed)\n---------------------\n") - Random.seed!(seed) - seeds = [seed; round.(Integer,floor.(rand(nruns-1)*100000))] - - if writelog && !writelog_1proc - for i in 1:nruns # workers won't write to logfile - write(logfile, "For run $(i), seed = $(seeds[i])\n") - end - flush(logfile) - end - - tstart = time_ns() - startingnet = obj.net - startingconstraints = constraints - netvector = Distributed.pmap(1:nruns) do i # for i in 1:nruns - msg = "BEGIN PhyLiNC run $(i)\nseed = $(seeds[i])\ntime = $(Dates.format(Dates.now(), "yyyy-mm-dd H:M:S.s"))\n" - if writelog_1proc # workers can't write on streams opened by master - write(logfile, msg) - flush(logfile) - end - verbose && print(stdout, msg) - GC.gc() - try - obj.net = deepcopy(startingnet) - obj.model = deepcopy(obj.model) - obj.ratemodel = deepcopy(obj.ratemodel) - constraints = deepcopy(startingconstraints) # problem: nodes were copied on previous line. when nodes copied again on this line, they are now different - phyLiNCone!(obj, maxhybrid, no3cycle, nohybridladder, maxmoves, - nreject, verbose, writelog_1proc, logfile, seeds[i], probST, - constraints, ftolRel, ftolAbs, xtolRel, xtolAbs, - alphamin, alphamax, pinvmin, pinvmax, γcache, - CacheLengthLiNC(obj, ftolRel,ftolAbs,xtolRel,xtolAbs, 20)) # 20=maxeval - # NLopt segfault if we pass a pre-allocated lcache to a worker - logstr = "\nFINISHED. loglik = $(obj.loglik)\n" - verbose && print(stdout, logstr) - if writelog_1proc - logstr *= writeTopology(obj.net) - logstr *= "\n---------------------\n" - write(logfile, logstr) - flush(logfile) - end - obj.net.loglik = obj.loglik - return [obj.net, obj.model, obj.ratemodel] - catch err - msg = "\nERROR found on PhyLiNC for run $(i) seed $(seeds[i]):\n" * - sprint(showerror,err) - logstr = msg * "\n---------------------\n" - print(stacktrace(catch_backtrace())) - println() - if writelog_1proc - write(logfile, logstr) - flush(logfile) - write(errfile, msg) - flush(errfile) - end - @warn msg # returns: nothing - end - end - tend = time_ns() # in nanoseconds - telapsed = round(convert(Int, tend-tstart) * 1e-9, digits=2) # in seconds - writelog_1proc && close(errfile) - msg = "All runs complete.\nend time: " * Dates.format(Dates.now(), "yyyy-mm-dd H:M:S.s") * - "\ntime elapsed: $telapsed seconds" *"\n---------------------\n" - writelog && write(logfile, msg) - verbose && print(stdout, msg) - - #= post processing of the networks - type of netvector: Array{Union{Nothing, Array{Int64,1}},1} - each item holds [net, model, ratemodel] if sucessful, nothing if failed =# - filter!(n -> n !== nothing, netvector) # remove "nothing": failed runs - !isempty(netvector) || error("all runs failed") - sort!(netvector, by = x -> x[1].loglik, rev=true) - # @debug "loglik from all runs:" [n[1].loglik for n in netvector] - obj.net = netvector[1][1]::HybridNetwork # best network, tell type to compiler - obj.model = netvector[1][2] - obj.ratemodel = netvector[1][3] - obj.loglik = obj.net.loglik - logstr = "Best topology:\n$(writeTopology(obj.net))\n" * - "with loglik $(obj.loglik) under:\n" * - replace(string(obj.model), r"\n" => "\n ") * "\n" * - replace(string(obj.ratemodel), r"\n" => "\n ") * - "\n---------------------\n" * - "Final optimization of branch lengths and gammas on this network... " - if writelog - write(logfile, logstr) - flush(logfile) - end - verbose && print(stdout,logstr) - (no3cycle ? shrink3cycles!(obj.net, true) : shrink2cycles!(obj.net, true)) # not done in phyLiNCone - # loglik changes after shrinkage, but recalculated below by optimizealllengths - updateSSM!(obj, true; constraints = constraints) - # warning: tolerance values from constants, not user-specified - lcache = CacheLengthLiNC(obj, fRelBL, fAbsBL, xRelBL, xAbsBL, 1000) # maxeval=1000 - optimizealllengths_LiNC!(obj, lcache) - ghosthybrid = optimizeallgammas_LiNC!(obj, fAbsBL, γcache, 100) - if ghosthybrid - (no3cycle ? shrink3cycles!(obj.net, true) : shrink2cycles!(obj.net, true)) - updateSSM!(obj, true; constraints=constraints) - discrete_corelikelihood!(obj) # to get likelihood exact, even if not optimum - end - obj.net.loglik = obj.loglik - toptimend = time_ns() # in nanoseconds - telapsed = round(convert(Int, toptimend-tstart) * 1e-9, digits=2) # in seconds - logstr = "complete.\nFinal log-likelihood: $(obj.loglik)\n" * - "Final network:\n" * "$(writeTopology(obj.net))\n" * - "Total time elapsed: $telapsed seconds (includes final branch length and gamma optimization)\n" * - "Final time: " * Dates.format(Dates.now(), "yyyy-mm-dd H:M:S.s") * "\n---------------------\n" * - "NOTE: This network should be interpreted as unrooted, since a likelihood model cannot identify\nthe root. The network can be rooted with an outgroup or other external information." * - "\n---------------------\n" - if writelog - write(logfile, logstr) - flush(logfile) - close(logfile) - end - verbose && print(stdout,logstr) - return obj -end - -""" - phyLiNCone!(obj::SSM, maxhybrid::Int, no3cycle::Bool, - nohybridladder::Bool, maxmoves::Int, nrejectmax::Int, - verbose::Bool, writelog_1proc::Bool, logfile::IO, - seed::Int, probST::Float64, - constraints::Vector{TopologyConstraint}, - ftolRel::Float64, ftolAbs::Float64, - xtolRel::Float64, xtolAbs::Float64, - alphamin::Float64, alphamax::Float64, - pinvmin::Float64, pinvmax::Float64, - γcache::CacheGammaLiNC) - -Estimate one phylogenetic network (or tree) from concatenated DNA data, -like [`phyLiNC!`](@ref), but doing one run only, and taking as input an -StatisticalSubstitutionModel object `obj`. The starting network is `obj.net` -and is assumed to meet all the requirements. - -`writelog_1proc` is passed by phyLiNC! an indicates if a log should be written. -If the number of processors is > 1, this will be false because workers can't -write on streams opened by master. `logfile` will be stdout if `writelog_1proc` -is false. Otherwise, it will be the log file created by `phyLiNC!`. - -See [`phyLiNC`](@ref) for other arguments. -""" -function phyLiNCone!(obj::SSM, maxhybrid::Int, no3cycle::Bool, - nohybridladder::Bool, maxmoves::Int, nrejectmax::Int, - verbose::Bool, writelog_1proc::Bool, logfile::IO, - seed::Int, probST::Float64, - constraints::Vector{TopologyConstraint}, - ftolRel::Float64, ftolAbs::Float64, - xtolRel::Float64, xtolAbs::Float64, - alphamin::Float64, alphamax::Float64, - pinvmin::Float64, pinvmax::Float64, - γcache::CacheGammaLiNC, - lcache::CacheLengthLiNC) - - Random.seed!(seed) - # update files inside topology constraint to match the deepcopied net in obj.net created by pmap - updateconstraintfields!(constraints, obj.net) - numNNI = (probST < 1.0 ? rand(Geometric(probST)) : 0) # number NNIs ~ geometric: p (1-p)^k - if numNNI > 0 # modify starting tree by k nni moves (if possible) - for i in 1:numNNI - nni_LiNC!(obj, no3cycle, nohybridladder, constraints, - ftolAbs, γcache, lcache) - end - logstr = "changed starting topology by $numNNI attempted NNI move(s)\n" - writelog_1proc && write(logfile, logstr) - verbose && print(stdout, logstr) - end - logstr = "starting at $(writeTopology(obj.net))\n" - if writelog_1proc - write(logfile, logstr) - flush(logfile) - end - verbose && print(stdout, logstr) - optQ = nparams(obj.model) > 0 - optRAS = nparams(obj.ratemodel) > 0 - nrejected = 0 - while nrejected < nrejectmax - nrejected = optimizestructure!(obj, maxmoves, maxhybrid, no3cycle, nohybridladder, - nrejected, nrejectmax, constraints, - ftolAbs, γcache, lcache) - fit!(obj; optimizeQ=optQ, optimizeRVAS=optRAS, maxeval=20, - ftolRel=ftolRel, ftolAbs=ftolAbs, xtolRel=xtolRel, xtolAbs=xtolAbs, - alphamin=alphamin,alphamax=alphamax, pinvmin=pinvmin,pinvmax=pinvmax) - optimizealllengths_LiNC!(obj, lcache) # 1 edge at a time, random order - for i in Random.shuffle(1:obj.net.numHybrids) - e = getparentedge(obj.net.hybrid[i]) - optimizelocalgammas_LiNC!(obj, e, ftolAbs, γcache) - end - ghosthybrid = false # find hybrid edges with γ=0, to delete them - for h in obj.net.hybrid - minorhybridedge = getparentedgeminor(h) - minorhybridedge.gamma == 0.0 || continue - ghosthybrid = true - deletehybridedge!(obj.net, minorhybridedge, false,true,false,false,false) - end - #= warning: after this while loop is done, phyLiNC only keeps net, model & likelihood. - After shrinking cycles, the loglik would be slightly wrong because 3-cycles - are nearly non-identifiable, not fully non-identifiable. Due to this, we - shrink cycles only in the middle of optimization, not when optimization is - finished. By avoiding shrinking cycles at the end, the final loglik is correct. - This can lead to confusing results for users: They could choose no3cycle=true, but - still have a 3-cycle in the final network. - Might want to add something to docs about this. =# - if ghosthybrid && (nrejected < nrejectmax) - shrink3cycles!(obj.net, true) - updateSSM!(obj, true; constraints=constraints) - end - end - return obj -end - -""" - checknetwork_LiNC!(net::HybridNetwork, maxhybrid::Int, no3cycle::Bool, - nohybridladder::Bool, - constraints=TopologyConstraint[]::Vector{TopologyConstraint}, - verbose::Bool=false) - -Check that `net` is an adequate starting network before `phyLiNC!`: -remove nodes of degree 2 (possibly including the root); -check that `net` meets the topological `constraints`, -has no polytomies (except at species constraints), -and `maxhybrid` of fewer reticulations. -According to user-given options, also check for the absence of -3-cycles and/or hybrid ladders. - -```jldoctest -julia> maxhybrid = 3; - -julia> net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); - -julia> preorder!(net) # for correct unzipping in checknetwork_LiNC! - -julia> PhyloNetworks.checknetwork_LiNC!(net, maxhybrid, true, true) -HybridNetwork, Rooted Network -8 edges -8 nodes: 4 tips, 1 hybrid nodes, 3 internal tree nodes. -tip labels: A, B, C, D -((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0,D:2.5); - -``` -""" -function checknetwork_LiNC!(net::HybridNetwork, maxhybrid::Int, no3cycle::Bool, - nohybridladder::Bool, - constraints=TopologyConstraint[]::Vector{TopologyConstraint}, - verbose::Bool=false) - - if maxhybrid > 0 - net.numTaxa >= 3 || - error("cannot estimate hybridizations in topologies with 3 or fewer tips: $(net.numTaxa) tips here.") - end - # checks for polytomies, constraint violations, nodes of degree 2 - checkspeciesnetwork!(net, constraints) || - error("The species or clade constraints are not satisfied in the starting network.") - # checkspeciesnetwork removes nodes of degree 2, need to renumber with updateSSM - !shrink2cycles!(net, true) || (verbose && @warn( - """The input network contains one or more 2-cycles - (after removing any nodes of degree 2 including the root). - These 2-cycles have been removed.""")) - if no3cycle - !shrink3cycles!(net, true) || (verbose && @warn( - """Options indicate there should be no 3-cycles in the returned network, - but the input network contains one or more 3-cycles - (after removing any nodes of degree 2 including the root). - These 3-cycles have been removed.""")) - # if nodes removed, need to renumber with updateSSM - end - if nohybridladder - !hashybridladder(net) || error( - """Options indicate there should be no hybrid ladders in the returned network, - but the input network contains one or more hybrid ladders.""") - end - if length(net.hybrid) > maxhybrid - error("""Options indicate a maximum of $(maxhybrid) reticulations, but - the input network contains $(length(net.hybrid)) hybrid nodes. Please - increase maxhybrid to $(length(net.hybrid)) or provide an input network - with $(maxhybrid) or fewer reticulations.""") - end - return net -end - -""" - optimizestructure!(obj::SSM, maxmoves::Integer, maxhybrid::Integer, - no3cycle::Bool, nohybridladder::Bool, - nreject::Integer, nrejectmax::Integer, - constraints::Vector{TopologyConstraint}, - ftolAbs::Float64, - γcache::CacheGammaLiNC, lcache::CacheLengthLiNC) - -Alternate NNI moves, hybrid additions / deletions, and root changes based on their -respective weights in `moveweights_LiNC` ([0.4, 0.2, 0.2, 0.2]). -Branch lengths and hybrid γs around the NNI focal edge or around the -added / deleted hybrid edge are optimized (roughly) on the proposed -network. Each proposed network is accepted --or not-- if the likelihood -improves (or doesn't decrease much for hybrid deletion). -After adding or removing a hybrid, `obj` is updated, to have correct -displayed `trees` and node/edge numberings: done by [`nni_LiNC!`](@ref), -[`addhybridedgeLiNC!`](@ref) and [`deletehybridedgeLiNC!`](@ref). - -Output: number of consecutive rejections so far. - -The percent of nni moves, hybrid additions, hybrid deletions, and root changes -to be performed is in `PhyloNetworks.moveweights_LiNC`. - -- `maxmoves`: maximum number of moves to be performed, including root changes, - which don't actually change the semi-directed topology and likelihood. -- `nreject`: number of consecutive rejections (ignoring root changes), prior - to starting the search (from a prior function call) -- `nrejectmax`: the search stops when there has been this number of moves that - have been rejected in a row (ignoring root changes) - -For a description of other arguments, see [`phyLiNC`](@ref). - -Assumptions: -- `checknetworkbeforeLiNC` and `discrete_corelikelihood!` have been called on - `obj.net`. -- starting with a network without 2- and 3- cycles - (checked by `checknetworkbeforeLiNC`) - -Note: When removing a hybrid edge, always removes the minor edge. -""" -function optimizestructure!(obj::SSM, maxmoves::Integer, maxhybrid::Integer, - no3cycle::Bool, nohybridladder::Bool, nreject::Integer, nrejectmax::Integer, - constraints::Vector{TopologyConstraint}, - ftolAbs::Float64, - γcache::CacheGammaLiNC, lcache::CacheLengthLiNC) - - nmoves = 0 - moveweights = copy(moveweights_LiNC) - if maxhybrid == 0 # prevent some moves, to avoid proposing non-admissible moves - moveweights[2] = 0.0 # addhybrid - moveweights[3] = 0.0 # deletehybrid - moveweights[4] = 0.0 # fliphybrid - moveweights ./= sum(moveweights) - end - while nmoves < maxmoves && nreject < nrejectmax # both should be true to continue - currLik = obj.loglik - movechoice = sample(movelist_LiNC, moveweights_LiNC) - if movechoice == "nni" - result = nni_LiNC!(obj, no3cycle, nohybridladder, - constraints, ftolAbs, γcache, lcache) - elseif movechoice == "addhybrid" - nh = obj.net.numHybrids - nh == maxhybrid && continue # skip & don't count towards nmoves if enough hybrids in net - # alternative: switch "add" and "delete" as appropriate (not chosen) - # would decrease the weight of NNIs compared to add/delete hybrid - nh < maxhybrid || # nh > maxhybrid should never happen - error("The network has $nh hybrids: more than the allowed max of $maxhybrid") - result = addhybridedgeLiNC!(obj, currLik, no3cycle, - nohybridladder, constraints, ftolAbs, γcache, lcache) - elseif movechoice == "deletehybrid" - obj.net.numHybrids == 0 && continue # skip & don't count towards nmoves if no hybrid in net - result = deletehybridedgeLiNC!(obj, currLik, - no3cycle, constraints, γcache, lcache) - elseif movechoice == "fliphybrid" - obj.net.numHybrids == 0 && continue # skip & don't count towards nmoves if no hybrid in net - result = fliphybridedgeLiNC!(obj, currLik, - nohybridladder, constraints, ftolAbs, γcache, lcache) - else # change root (doesn't affect likelihood) - result = moveroot!(obj.net, constraints) - isnothing(result) || updateSSM_root!(obj) # edge direction used by updatecache_edge - end - # optimize γ's - ghosthybrid = optimizeallgammas_LiNC!(obj, ftolAbs, γcache, 1) - if ghosthybrid # delete hybrid edges with γ=0 - (no3cycle ? shrink3cycles!(obj.net, true) : shrink2cycles!(obj.net, true)) - # loglik change ignored, but loglik recalculated below by optimizelocalBL - updateSSM!(obj, true; constraints=constraints) - end - # pick a random edge (internal or external), optimize adjancent lengths - e = Random.rand(obj.net.edge) - optimizelocalBL_LiNC!(obj, e, lcache) - nmoves += 1 - # next: update the number of consecutive rejections ignoring any root move - # (which don't change the semi-directed topology or loglik) - if !isnothing(result) && movechoice != "root" - if result # move successful and accepted (loglik increase) - nreject = 0 # reset - else # move made, rejected, and undone - nreject += 1 - end - end - @debug "$(movechoice) move was " * - (isnothing(result) ? "not permissible" : (result ? "accepted" : "rejected and undone")) * - ", $nmoves total moves, $nreject rejected,\nloglik = $(obj.loglik)" - end - return nreject -end - -""" - nni_LiNC!(obj::SSM, no3cycle::Bool, nohybridladder::Bool, - constraints::Vector{TopologyConstraint}, - ftolAbs::Float64, - γcache::CacheGammaLiNC, lcache::CacheLengthLiNC) - -Loop over possible edges for a nearest-neighbor interchange move until one is -found. Performs move and compares the original and modified likelihoods. If the -modified likelihood is greater than the original by `likAbs`, the move -is accepted. - -Return true if move accepted, false if move rejected. Return nothing if there -are no nni moves possible in the network. - -For arguments, see [`phyLiNC`](@ref). - -Called by [`optimizestructure!`](@ref), which is called by [`phyLiNC!`](@ref). - -Note: an RR move does not change the best likelihood. RR means that there's -a hybrid ladder, so it looks like a hard polytomy at the reticulation after -unzipping. Theoretically, we could avoid the re-optimizing the likelihood -accept the move: just change inheritance values to get same likelihood, -and update the tree priors. *Not* done. -""" -function nni_LiNC!(obj::SSM, no3cycle::Bool, nohybridladder::Bool, - constraints::Vector{TopologyConstraint}, - ftolAbs::Float64, - γcache::CacheGammaLiNC, lcache::CacheLengthLiNC) - currLik = obj.loglik - savedpriorltw = copy(obj.priorltw) # in case we need to undo move - saveddisplayedtree = obj.displayedtree # updateSSM creates a new "pointer" - edgefound = false - remainingedges = collect(1:length(obj.net.edge)) # indices in net.edge - while !edgefound - isempty(remainingedges) && return nothing - i_in_remaining = Random.rand(1:length(remainingedges)) - e1 = obj.net.edge[remainingedges[i_in_remaining]] - # save BLs and gammas in case we need to undo move - savededges = adjacentedges(e1) - savedlen = [e.length for e in savededges] - savedgam = [e.gamma for e in savededges] - undoinfo = nni!(obj.net,e1,nohybridladder,no3cycle,constraints) - #fixit: for clades, need to update cladeconstraints, then restore below - if isnothing(undoinfo) - deleteat!(remainingedges, i_in_remaining) - continue # edge not found yet, try again - end - edgefound = true - updateSSM!(obj, true; constraints=constraints) - optimizelocalgammas_LiNC!(obj, e1, ftolAbs, γcache) - # don't delete a hybrid edge with γ=0: to be able to undo the NNI - # but: there's no point in optimizing the length of such an edge (caught inside optimizelocalBL) - optimizelocalBL_LiNC!(obj, e1, lcache) - if obj.loglik < currLik - nni!(undoinfo...) # undo move - obj.displayedtree = saveddisplayedtree # restore displayed trees and weights - obj.priorltw = savedpriorltw - obj.loglik = currLik # restore to loglik before move - for (i,e) in enumerate(savededges) # restore edge lengths and gammas - e.length = savedlen[i] - if e.hybrid - setGamma!(e, savedgam[i]) # some hybrid partners are not adjacent to focus edge - else - savedgam[i] == 1.0 || @warn "A tree edge had saved gamma != 1.0. Something fishy has happened." - e.gamma = 1.0 # savedgam[i] should be 1.0 - end - end - return false # false means: move was rejected - else # keep nni move. If a γ became 0, optimizestructure will remove the edge - return true # move was accepted: # rejections will be reset to zero - end - end - return nothing # no NNI were available: none were DAGs or met constraints -end - -""" - addhybridedgeLiNC!(obj::SSM, currLik::Float64, - no3cycle::Bool, nohybridladder::Bool, - constraints::Vector{TopologyConstraint}, - ftolAbs::Float64, - γcache::CacheGammaLiNC, lcache::CacheLengthLiNC) - -Completes checks, adds hybrid in a random location, updates SSM object, and -optimizes branch lengths and gammas locally as part of PhyLiNC optimization. - -Return true if accepted add hybrid move. If move not accepted, return false. -If cannot add a hybrid, return nothing. - -For arguments, see [`phyLiNC`](@ref). -Called by [`optimizestructure!`](@ref). -""" -function addhybridedgeLiNC!(obj::SSM, currLik::Float64, - no3cycle::Bool, nohybridladder::Bool, - constraints::Vector{TopologyConstraint}, - ftolAbs::Float64, - γcache::CacheGammaLiNC, lcache::CacheLengthLiNC) - #= save displayed trees, priorltw, BLs, and gammas in case we need to undo move - branch lengths are changed by addhybridedge. We can't use - adjacentedges because newhybridedge is chosen randomly, so we - save all branch lengths and gammas here =# - saveddisplayedtree = obj.displayedtree - savedpriorltw = copy(obj.priorltw) - savedlen = [e.length for e in obj.net.edge] - savedgam = [e.gamma for e in obj.net.edge] - result = addhybridedge!(obj.net, nohybridladder, no3cycle, constraints; - maxattempts=max(10,size(obj.directlik,2)), fixroot=true) # maxattempt ~ numEdges - # fixroot=true: to restore edge2 if need be, with deletehybridedge! - # so hybridpartnernew is always true. This means that the order of edges - # in obj.net.edge can be restored by deletehybridedge below. - # Before doing anything, first check that addhybrid edge was successful. - # If not successful, result isnothing, so return nothing. - isnothing(result) && return nothing - newhybridnode, newhybridedge = result - # next: increase length of split edges if they became < BLmin - splitedges = getparent(newhybridedge).edge # new hybrid edge = splitedges[3] - # splitedges[1] and splitedges[2] have length 1/2 of original edge... - # except if hybrid ladder was created (and unzipped) - for e in splitedges[1:2] - if e.length < BLmin && !getparent(e).hybrid - e.length = BLmin - end - end - # unzip only at new node and its child edge - unzipat_canonical!(newhybridnode, getchildedge(newhybridnode)) - updateSSM!(obj) #, true; constraints=constraints) - optimizelocalgammas_LiNC!(obj, newhybridedge, ftolAbs, γcache) - if newhybridedge.gamma == 0.0 - deletehybridedge!(obj.net, newhybridedge, false,true) # nofuse,unroot - obj.displayedtree = saveddisplayedtree # restore displayed trees and tree weights - obj.priorltw = savedpriorltw - for (i,e) in enumerate(obj.net.edge) # restore - e.gamma = savedgam[i] - end - return false - elseif newhybridedge.gamma == 1.0 # ≃ subtree prune and regraft (SPR) move - # loglik better because γ=1 better than γ=0, yet without new reticulation: accept - deletehybridedge!(obj.net, getparentedgeminor(newhybridnode), false,true,false,false,false) - (no3cycle ? shrink3cycles!(obj.net, true) : shrink2cycles!(obj.net, true)) - # loglik will be updated in optimizeallgammas right after, in optimizestructure - updateSSM!(obj, true; constraints=constraints) - @debug "addhybrid resulted in SPR move: new hybrid edge had γ=1.0, its partner was deleted" - return true - end - optimizelocalBL_LiNC!(obj, newhybridedge, lcache) - if obj.loglik - currLik < likAbsAddHybLiNC # improvement too small or negative: undo - deletehybridedge!(obj.net, newhybridedge, false,true) # nofuse,unroot - #= rezip not needed because likelihood unchanged. - If hybrid edge addition used hybridpartnernew = false, the root was - changed and direction of edge2 was changed: but that doesn't affect - the likelihood. We don't restore the same rooted network, but we do - restore the same semi-directed version. The former displayed trees are fine - to use, even though they don't use the same root as that in the restored rooted network. - Further, fixroot=true so hybridpartnernew = true. - =# - obj.displayedtree = saveddisplayedtree # restore original displayed trees and weights - obj.priorltw = savedpriorltw - obj.loglik = currLik # restore to loglik before move - for (i,e) in enumerate(obj.net.edge) # restore edges and length (assumes same order) - e.length = savedlen[i] - e.gamma = savedgam[i] - end - return false - else - return true - end -end - -""" - deletehybridedgeLiNC!(obj::SSM, currLik::Float64, - no3cycle::Bool, - constraints::Vector{TopologyConstraint}, - γcache::CacheGammaLiNC, lcache::CacheLengthLiNC) - -Deletes a random hybrid edge and updates SSM object as part of -PhyLiNC optimization. -Return true if the move is accepted, false if not. - -Note: if net is tree-child and a hybrid edge is deleted, then the -resulting network is still tree-child. -But: if `net` has no hybrid ladders, deleting an existing reticulation -may create a hybrid ladder. It happens if there is a reticulation above a -W structure (tree node whose children are both hybrid nodes). -This creates a problem if the user asked for `nohybridladder`: -this request may not be met. -fixit: In future, we could check for this case and prevent it. - -For a description of arguments, see [`phyLiNC`](@ref). -Called by [`optimizestructure!`](@ref), which does some checks. -""" -function deletehybridedgeLiNC!(obj::SSM, currLik::Float64, - no3cycle::Bool, - constraints::Vector{TopologyConstraint}, - γcache::CacheGammaLiNC, lcache::CacheLengthLiNC) - - nh = length(obj.net.hybrid) - hybridnode = obj.net.hybrid[Random.rand(1:nh)] - minorhybridedge = getparentedgeminor(hybridnode) - #= if type-3 constraints: check that proposed deletion meets constraints - the constraint's stem edge must be a tree edge -> not disrupted - species (type 1) or clade type-2 constraints: no problem, because - the major tree displaying the constraint has major edges only - type-3 constraints: problem if the tree displaying the constraint - has the minor hybrid edge to be deleted. Not implemented. - hybindices = Random.shuffle(1:nh) - edgenotfound = true - for hi in hybindices - hybridnode = obj.net.hybrid[hi] - minorhybridedge = getparentedgeminor(hybridnode) - # edgenotfound = whether any type-3 constraints is violated - edgenotfound || break - end - if edgenotfound # tried all hybrids - return nothing - end - =# - # set γ to 0 to delete the hybrid edge: makes it easy to undo. - # update minor edge, and prior log tree weights in obj - γ0 = minorhybridedge.gamma - setGamma!(minorhybridedge, 0.0) - l1mγ = log(1.0-γ0) - nt, hase = updatecache_hase!(γcache, obj, minorhybridedge.number, - getparentedge(hybridnode).number) - for it in 1:nt - @inbounds h = hase[it] - ismissing(h) && continue # tree has unchanged weight: skip below - if h obj.priorltw[it] = -Inf - else obj.priorltw[it] -= l1mγ - end - end - #= warning: after setting γ=0, the 2 other edges connected to the minor - parent are non-identifiable -> do not optimize them. - if hybrid ladder (minor parent is hybrid node): not identifiable at all - otherwise: only their sum is identifiable, but not individual lengths - so: optimize length of major hybrid edge only =# - majhyb = getparentedge(hybridnode) - len0 = majhyb.length # to restore later if deletion rejected - update_logtrans(obj) # fixit: is that really needed? - optimizelength_LiNC!(obj, majhyb, lcache, Q(obj.model)) - # don't optimize gammas: because we want to constrain one of them to 0.0 - if obj.loglik - currLik > likAbsDelHybLiNC # -0.0: loglik can decrease for parsimony - deletehybridedge!(obj.net, minorhybridedge, false,true,false,false,false) # nofuse,unroot,multgammas,simplify - (no3cycle ? shrink3cycles!(obj.net, true) : shrink2cycles!(obj.net, true)) - updateSSM!(obj, true; constraints=constraints) - # obj.loglik will be updated by optimizeallgammas within optimizestructure - return true - else # keep hybrid - majhyb.length = len0 - setGamma!(minorhybridedge, γ0) - # note: transition probability for majhyb not updated here, but could be - # if we wanted to avoid full update before each branch length optim - updateSSM_priorltw!(obj) # displayedtree already correct - obj.loglik = currLik # restore to likelihood before move - return false - end -end - -""" - fliphybridedgeLiNC!(obj::SSM, currLik::Float64, nohybridladder::Bool, - constraints::Vector{TopologyConstraint}, ftolAbs::Float64, - γcache::CacheGammaLiNC, lcache::CacheLengthLiNC) - -Randomly chooses a minor hybrid edge and tries to flip its direction (that is, -reverse the direction of gene flow) using [`fliphybrid!`](@ref). -If the flip fails, it looks for the next minor hybrid edge. If all minor edges -fail, tries to flip major edges in random order. - -After a successful flip, optimize branch lengths and gammas, then compare -the likelihood of the previous network with the new one. - -Return: -- true if a flip hybrid move was completed and improved the likelihood -- false if a move was completed but did not improve the likelihoood -- nothing if no hybrid flip move was admissible in this network. - -Warning: Undoing this move may not recover the original root if -the root position was modified. - -For arguments, see [`phyLiNC`](@ref). -Called by [`optimizestructure!`](@ref). -""" -function fliphybridedgeLiNC!(obj::SSM, currLik::Float64, nohybridladder::Bool, - constraints::Vector{TopologyConstraint}, ftolAbs::Float64, γcache::CacheGammaLiNC, - lcache::CacheLengthLiNC) - # save displayed trees, priorltw, BLs, and gammas in case we need to undo move - saveddisplayedtree = obj.displayedtree - savedpriorltw = copy(obj.priorltw) - savedlen = [e.length for e in obj.net.edge] - savedgam = [e.gamma for e in obj.net.edge] - ## find admissible move ## - minor = true # randomly choose a minor hybrid edge - undoinfo = fliphybrid!(obj.net, minor, nohybridladder, constraints) # cycle through all hybrid nodes - if isnothing(undoinfo) # then try flipping a major edge - minor = false - undoinfo = fliphybrid!(obj.net, minor, nohybridladder, constraints) - isnothing(undoinfo) && return nothing # no edge can be flipped - end - newhybridnode, flippededge, oldchildedge = undoinfo - ## after an admissible flip, optimize branch lengths and gammas ## - # reassign old child edge to BLmin (was zero) - oldchildedge.length = BLmin # adjacent to flippedge, saved above - # unzip only at new node and its child edge - getchildedge(newhybridnode).length = 0.0 # adjacent to flippedge, saved above - updateSSM!(obj) #, true; constraints=constraints) # displayed trees have changed - optimizelocalgammas_LiNC!(obj, flippededge, ftolAbs, γcache) - # don't delete a flipped edge with γ=0: to be able to undo the flip - # but: no point in optimizing the length of such an edge. optimizelocalBL_LiNC won't. - optimizelocalBL_LiNC!(obj, flippededge, lcache) - if obj.loglik < currLik # then: undo the move - fliphybrid!(obj.net, newhybridnode, !flippededge.isMajor, nohybridladder, constraints) - obj.displayedtree = saveddisplayedtree # restore displayed trees and weights - obj.priorltw = savedpriorltw - obj.loglik = currLik # restore to loglik before move - for (i,e) in enumerate(obj.net.edge) # restore edges and length (assumes same order) - e.length = savedlen[i] - e.gamma = savedgam[i] - end - return false # move was rejected: # rejections incremented - else # keep hybrid flip move. If a γ became 0, optimizestructure will remove the edge - return true # move was accepted: # rejections will be reset to zero - end -end - -""" - updateSSM!(obj::SSM, renumber=false::Bool; - constraints=TopologyConstraint[]::Vector{TopologyConstraint}) - -After adding or removing a hybrid, displayed trees will change. Updates -the displayed tree list. Return SSM object. - -if `renumber`, reorder edge and internal node numbers. Only need -to renumber after deleting a hybrid (which could remove edges and nodes -from the middle of the edge and node lists). - -Assumptions: -- The SSM object has cache arrays of size large enough, that is, - the constructor [`StatisticalSubstitutionModel`](@ref) was previously - called with maxhybrid equal or greater than in `obj.net`. - `obj.priorltw` is not part of the "cache" arrays. - -Warning: -Does not update the likelihood. - -```jldoctest -julia> net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); - -julia> fastafile = abspath(joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "simple.aln")); - -julia> obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastafile, :JC69; maxhybrid=3); - -julia> PhyloNetworks.checknetwork_LiNC!(obj.net, 3, true, true); - -julia> using Random; Random.seed!(432); - -julia> PhyloNetworks.addhybridedge!(obj.net, obj.net.edge[8], obj.net.edge[1], true, 0.0, 0.4); - -julia> writeTopology(obj.net) -"(((B:1.0)#H1:0.1::0.9,(A:1.0)#H2:1.0::0.6):1.5,(C:0.6,#H1:1.0::0.1):1.0,(D:1.25,#H2:0.0::0.4):1.25);" - -julia> length(obj.displayedtree) # still as if 1 single reticulation -2 - -julia> PhyloNetworks.updateSSM!(obj); - -julia> length(obj.displayedtree) # now correct 4 displayed treess: 2 reticulations -4 -``` -""" -function updateSSM!(obj::SSM, renumber=false::Bool; - constraints=TopologyConstraint[]::Vector{TopologyConstraint}) - if renumber # traits are in leaf.number order, so leaf nodes not reordered - resetNodeNumbers!(obj.net; checkPreorder=false, type=:internalonly) - # preorder not used when type = internalonly - resetEdgeNumbers!(obj.net, false) # verbose=false - updateconstraintfields!(constraints, obj.net) - end - # extract displayed trees, with the default keeporiginalroot=false - # because PhyLiNC assumes a reversible model and moves the root around: - # displayed trees should not have any dangling node nor root of degree 1 - # (which are equivalent via re-rooting) - obj.displayedtree = displayedTrees(obj.net, 0.0; nofuse=true) - for tree in obj.displayedtree - preorder!(tree) # no need to call directEdges!: already correct in net - end - # log tree weights: sum log(γ) over edges, for each displayed tree - updateSSM_priorltw!(obj) - @debug begin - all(!ismissing, obj.priorltw) ? "" : - "one or more inheritance γ's are missing or negative. fix using setGamma!(network, edge)" - end - return obj -end - -# ! requires correct displayed trees. If not, first call updatedisplayedtrees! -function updateSSM_priorltw!(obj::SSM) - pltw = obj.priorltw - resize!(pltw, length(obj.displayedtree)) - for (i,t) in enumerate(obj.displayedtree) - @inbounds pltw[i] = inheritanceWeight(t) - end - return nothing -end - -# updates displayed trees when one gamma changes -function updatedisplayedtrees!(trees::Vector, enum::Int, pnum::Int, gammae::Float64, hase::Vector) - gammap = 1.0 - gammae - for (i,t) in enumerate(trees) - h = hase[i] - ismissing(h) && continue # tree doesn't have either e nor partner - ei = (h ? findfirst(e -> e.number == enum, t.edge) : - findfirst(e -> e.number == pnum, t.edge)) - t.edge[ei].gamma = (h ? gammae : gammap) - end -end - - -""" - updateSSM_root!(obj::SSM) - -Update root and direction of edges in displayed trees to match -the root in the network. -""" -function updateSSM_root!(obj::SSM) - netroot = obj.net.node[obj.net.root] - rnum = netroot.number - rootabsent = false - # The new root may have been a dangling node in one of the displayed trees, - # so would be absent. Dangling nodes need to be deleted (no data to - # initialize the tree traversal), so a root of degree 1 should be deleted - # too. Otherwise: could become a dangling node after re-rooting. - for tre in obj.displayedtree - r = findfirst(n -> n.number == rnum, tre.node) - if isnothing(r) - rootabsent = true - break - end - tre.root = r - directEdges!(tre) - preorder!(tre) - end - if rootabsent # then re-create all displayed trees: will be corrected rooted - obj.displayedtree = displayedTrees(obj.net, 0.0; nofuse=true) - for tree in obj.displayedtree - preorder!(tree) # no need to call directEdges!: already correct in net - end - # After re-extracting, the displayed trees come in the same order as before: - # no need to update the priorltw - end -end - -""" - startingBL!(net::HybridNetwork, - trait::AbstractVector{Vector{Union{Missings.Missing,Int}}}, - siteweight=ones(length(trait[1]))::AbstractVector{Float64}) - -Calibrate branch lengths in `net` by minimizing the mean squared error -between the JC-adjusted pairwise distance between taxa, and network-predicted -pairwise distances, using [`calibrateFromPairwiseDistances!`](@ref). -`siteweight[k]` gives the weight of site (or site pattern) `k` (default: all 1s). -Note: the network is not "unzipped". PhyLiNC unzips reticulations later. - -Assumptions: - -- all species have the same number of traits (sites): `length(trait[i])` constant -- `trait[i]` is for leaf with `node.number = i` in `net`, and - `trait[i][j] = k` means that leaf number `i` has state index `k` for trait `j`. - These indices are those used in a substitution model: - kth value of `getlabels(model)`. -- Hamming distances are < 0.75 with four states, or < (n-1)/n for n states. - If not, all pairwise hamming distances are scaled by `.75/(m*1.01)` where `m` - is the maximum observed hamming distance, to make them all < 0.75. -""" -function startingBL!(net::HybridNetwork, - trait::AbstractVector{Vector{Union{Missings.Missing,Int}}}, - siteweight=ones(length(trait[1]))::AbstractVector{Float64}) - nspecies = net.numTaxa - M = zeros(Float64, nspecies, nspecies) # pairwise distances initialized to 0 - # count pairwise differences, then multiply by pattern weight - ncols = length(trait[1]) # assumption: all species have same # columns - length(siteweight) == ncols || - error("$(length(siteweight)) site weights but $ncols columns in the data") - for i in 2:nspecies - species1 = trait[i] - for j in 1:(i-1) - species2 = trait[j] - for col in 1:ncols - if !(ismissing(species1[col]) || ismissing(species2[col])) && - (species1[col] != species2[col]) - M[i, j] += siteweight[col] - end - end - M[j,i] = M[i,j] - end - end - Mp = M ./ sum(siteweight) # to get proportion of sites, for each pair - - # estimate pairwise evolutionary distances using extended Jukes Cantor model - nstates = mapreduce(x -> maximum(skipmissing(x)), max, trait) - maxdist = (nstates-1)/nstates - Mp[:] = Mp ./ max(maxdist, maximum(Mp*1.01)) # values in [0,0.9901]: log(1-Mp) well defined - dhat = - maxdist .* log.( 1.0 .- Mp) - - taxonnames = [net.leaf[i].name for i in sortperm([n.number for n in net.leaf])] - # taxon names: to tell the calibration that row i of dhat if for taxonnames[i] - # ASSUMPTION: trait[i][j] = trait j for taxon at node number i: 'node.number' = i - calibrateFromPairwiseDistances!(net, dhat, taxonnames, - forceMinorLength0=true, ultrametric=false) - # force minor length to 0 to avoid non-identifiability at zippers - # works well if the true (or "the" best-fit) length of the minor parent - # edge is less than the true length of the parent edge. - # (zips all the way up instead of unzipping all the way down, as we do when the child edge = 0) - for e in net.edge # avoid starting at the boundary - if e.length < 1.0e-10 - e.length = 0.0001 - end - end - return net -end - -#--------------- optimization of branch lengths --------------# -""" - CacheLengthLiNC(obj::SSM, - ftolRel::Float64, ftolAbs::Float64, xtolRel::Float64, xtolAbs::Float64, - maxeval::Int) - -Constructor from a `StatisticalSubstitutionModel` object, with -tolerance values and parameters controlling the search. -""" -function CacheLengthLiNC(obj::SSM, - ftolRel::Float64, ftolAbs::Float64, xtolRel::Float64, xtolAbs::Float64, - maxeval::Int) - k = nstates(obj.model) - nt = size(obj._loglikcache, 3) # but: there might be fewer displayed trees - nr = length(obj.ratemodel.ratemultiplier) - ns = obj.nsites - Prt = [MMatrix{k,k, Float64}(undef) for i in 1:nr] - rQP = [MMatrix{k,k, Float64}(undef) for i in 1:nr] - # defaultinstep = NLopt.initial_step(optBL, getlengths(edges)) - # replace!(x -> min(x,0.1), defaultinstep) # 0.1 substitutions / site is kinda large - # NLopt.initial_step!(optBL, defaultinstep) - opt = NLopt.Opt(:LD_SLSQP, 1) # :LD_LBFGS would be another good choice - NLopt.ftol_rel!(opt,ftolRel) # relative criterion - NLopt.ftol_abs!(opt,ftolAbs) # absolute criterion - NLopt.xtol_rel!(opt,xtolRel) - NLopt.xtol_abs!(opt,xtolAbs) - NLopt.maxeval!(opt, maxeval) # max number of iterations - opt.lower_bounds = BLmin - opt.upper_bounds = BLmax - CacheLengthLiNC( - Array{Float64}(undef, (k, ns, nr, nt)), # flike - Array{Float64}(undef, (k, ns, nr, nt)), # dblike - Vector{Bool}(undef, nt), # hase - Prt, rQP, Vector{Float64}(undef, ns), opt, - ) -end - -""" - updatecache_edge!(lcache::CacheLengthLiNC, obj::SSM, focusedge) - -Update fields in `lcache`, to correspond to the forward likelihood -at the child node of the focus edge, -backwards (at parent node) x directional (at sister edges) likelihoods, -and keep track of which displayed trees do have the focus edge. -These don't change if the length of the focus edge is modified. -These quantities are then rescaled on the log scale (to get a max of 0) -and exponentiated to get back to the probability scale. - -Assumptions: the following fields of `obj` are up-to-date: -- displayed trees, with nodes preordered -- prior log tree weights in `.priorltw` -- log transition probabilities in `.logtrans` - -Output: -- missing, if the edge length does not affect the likelihood, -- constant used to rescale each site on the log scale, otherwise. -""" -function updatecache_edge!(lcache::CacheLengthLiNC, obj::SSM, focusedge) - flike = lcache.flike - dblike = lcache.dblike - hase = lcache.hase - tree = obj.displayedtree - k, ns, nr, nt = size(flike) - nt = length(tree) # could be less than dimensions in lcache - # ! a sister edge in network may be absent in a displayed tree - # but: edge & node numbers are the same in net and in trees - v = getparent(focusedge) # ! focus edge needs same direction in displayed trees - vnum = v.number - unum = getchild(focusedge).number - enum = focusedge.number - snum = Int[] - for e in v.edge - if e !== focusedge && v == getparent(e) # then e sister to focus edge - push!(snum, e.number) - end - end - nsis = length(snum) # normally 1, 0 below hybrid node, 2 at root or at polytomies - hassis = Array{Bool}(undef, (nsis,nt)) # is sister s in tree t? - @inbounds for it in 1:nt - hase[it] = any(x -> x.number == enum, tree[it].edge) - for j in 1:nsis - hassis[j,it] = any(x -> x.number == snum[j], tree[it].edge) - end - end - # check if the edge affects the likelihood. It may not if: - # the displayed trees that have the edge have a prior weight of 0. - # Would pruning edges with weight 0 make the focus edge dangle? - if all(i -> !hase[i] || obj.priorltw[i] == -Inf, 1:nt) - # @debug "edge $(focusedge.number) does not affect the likelihood: skip optimization" - return missing - end - lrw = obj.ratemodel.lograteweight - ltw = obj.priorltw - ftmp = obj.forwardlik - btmp = obj.backwardlik - dtmp = obj.directlik - clik = obj._loglikcache # conditional likelihood: conditional on tree & rate - fill!(flike, -Inf); fill!(dblike, -Inf) - for it in 1:nt - if hase[it] # we do need flike and dblike - for ir in 1:nr - ltrw = ltw[it] + lrw[ir] - for is in 1:ns - clik[is,ir,it] = discrete_corelikelihood_trait!(obj, it,is,ir) # ! +ltrw not needed - discrete_backwardlikelihood_trait!(obj, it,ir) - flike[:,is,ir,it] .= ftmp[:,unum] - dblike[:,is,ir,it] .= btmp[:,vnum] .+ ltrw - for isis in 1:nsis - @inbounds if hassis[isis,it] - dblike[:,is,ir,it] .+= dtmp[:,snum[isis]] # sum on log scale - end - end - end; end - else # tree does't have the focus edge: use clik only - for ir in 1:nr - ltrw = ltw[it] + lrw[ir] - for is in 1:ns - clik[is,ir,it] = discrete_corelikelihood_trait!(obj, it,is,ir) + ltrw - end; end - end - end - cf = maximum(flike) # unused values from trees without focus edge have -Inf - cg = maximum(dblike) - flike .= exp.(flike .- cf) - dblike .= exp.(dblike .- cg) - cfg = cf + cg # lcache.cadjust = cf + cg - clik .= exp.(clik .- cfg) - return cfg -end - -""" - optimizealllengths_LiNC!(obj::SSM, lcache::CacheLengthLiNC) - -Optimize all branch lengths, except those below hybrid edges -(whose lengths are not identifiable). -Same assumptions as in [`optimizelocalBL_LiNC!`](@ref). -""" -function optimizealllengths_LiNC!(obj::SSM, lcache::CacheLengthLiNC) - edges = copy(obj.net.edge) # shallow copy - # remove from edges - # - constrained edges: to keep network unzipped, add - # - and any hybrid edge with γ=0 - if !isempty(obj.net.hybrid) - @inbounds for i in length(edges):-1:1 - e = edges[i] - (getparent(e).hybrid || e.gamma == 0.0) && deleteat!(edges, i) - end - end - # reduce edge lengths beyond upper bounds - for e in edges - if e.length > BLmax e.length = BLmax; end - end - update_logtrans(obj) - qmat = Q(obj.model) - Random.shuffle!(edges) - for e in edges - optimizelength_LiNC!(obj, e, lcache, qmat) - end - return edges # excludes constrained edges -end - -""" - optimizelocalBL_LiNC!(obj::SSM, edge::Edge, lcache::CacheLengthLiNC) - -Optimize branch lengths in `net` locally around `edge`. Update all edges that -share a node with `edge` (including itself). -Constrains branch lengths to zero below hybrid nodes. -Return vector of updated `edges` (excluding constrained edges). -The tolerance values and parameters controlling the search are set in `lcache`. - -Used after `nni!` or `addhybridedge!` moves to update local branch lengths. -See [`phyLiNC!`](@ref). - -Assumptions: -- displayed trees in `obj` are up-to-date with nodes preordered, - and `obj.priorltw` are up-to-date. -- branch lengths are at or above the lower bound, and definitely non-negative. - -```jldoctest -julia> net = readTopology("(((A:2.0,(B:0.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); - -julia> fastafile = abspath(joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "simple.aln")); - -julia> obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastafile, :JC69); - -julia> obj.loglik = -Inf64; # not calculated yet - -julia> e = obj.net.edge[4]; - -julia> e.length -1.5 - -julia> using Random; Random.seed!(1234); - -julia> PhyloNetworks.optimizelocalBL_LiNC!(obj, e, PhyloNetworks.CacheLengthLiNC(obj, 1e-6,1e-6,1e-2,1e-2, 10)); - -julia> round(e.length, sigdigits=6) # we get the lower bound from PhyLiNC in this case -1.0e-8 - -julia> writeTopology(obj.net; round=true) -"(((A:0.338,(B:0.0)#H1:0.04::0.9):0.0,(C:0.6,#H1:1.0::0.1):0.0):0.0,D:2.0);" - -``` -""" -function optimizelocalBL_LiNC!(obj::SSM, focusedge::Edge, lcache::CacheLengthLiNC) - neighboredges = adjacentedges(focusedge) - # remove from neighboredges (shallow copy!) - # - constrained edges: to keep network unzipped, and - # - any hybrid edge with γ=0 - if !isempty(obj.net.hybrid) - @inbounds for i in length(neighboredges):-1:1 - e = neighboredges[i] - (getparent(e).hybrid || e.gamma == 0.0) && deleteat!(neighboredges, i) - end - end - # reduce edge lengths beyond upper bounds: can appear from unzipping, - for e in neighboredges # cycle shrinking, edges fused by deletehybridedge - if e.length > BLmax e.length = BLmax; end - end - # assume: correct preordered displayed trees & tree weights - update_logtrans(obj) # fixit: waste of time? avoid in some cases? - qmat = Q(obj.model) - for e in neighboredges - optimizelength_LiNC!(obj, e, lcache, qmat) - end - return neighboredges # excludes constrained edges -end - -""" - optimizelength_LiNC!(obj::SSM, edge::Edge, cache::CacheLengthLiNC, Qmatrix) - -Optimize the length of a single `edge` using a gradient method, if -`edge` is not below a reticulation (the unzipped canonical version should -have a length of 0 below reticulations). -Output: nothing. - -Warning: displayed trees are assumed up-to-date, with nodes preordered -""" -function optimizelength_LiNC!(obj::SSM, focusedge::Edge, - lcache::CacheLengthLiNC, qmat) - getparent(focusedge).hybrid && return nothing # keep the reticulation unzipped - # the length of focus edge should be 0. stay as is. - cfg = updatecache_edge!(lcache, obj, focusedge) - ismissing(cfg) && return nothing - flike = lcache.flike # P(descendants of e | state at child, rate, tree) - dblike = lcache.dblike # P(non-descendants & state at parent, rate, tree) - # if γ=0 then dblike starts as all -Inf because P(tree) = 0 -> problem - # this problem is caught earlier: cfg would have been missing. - hase = lcache.hase - Prt = lcache.Prt # to hold exp(rtQ) matrices (one matrix for each r) - rQP = lcache.rQP # d/dt of exp(rtQ) = rQ * Prt - glik = lcache.glik # d/dt of site likelihoods ulik. length: # sites - tree = obj.displayedtree - k, ns, nr, nt = size(flike) - nt = length(tree) # could be less than dimension in lcache (if network isn't tree-child) - rates = obj.ratemodel.ratemultiplier - ulik = obj._sitecache # will hold P(site): depends on length of e - clik = obj._loglikcache # P(site & rate, tree) using old length of e - adjustment = obj.totalsiteweight * cfg - - # use site weights, if any - wsum = (isnothing(obj.siteweight) ? sum : x -> sum(x .* obj.siteweight)) - - # objective to maximize: overall log-likelihood - function objective(t::Vector, grad::Vector) - len = t[1] # candidate branch length - @inbounds for ir in 1:nr - P!(Prt[ir], obj.model, len * rates[ir]) - lmul!(rates[ir], mul!(rQP[ir], qmat, Prt[ir])) # in-place multiplication - end - # integrate over trees & rates - fill!(ulik, 0.0); fill!(glik, 0.0) - for it in 1:nt - if hase[it] # tree has edge: contributes to gradient - for is in 1:ns - for ir in 1:nr - # dot(x,A,y) requires Julia 1.4, and fails with Optim v0.19.3 - # u += dot(dblike[:,is,ir,it], Prt[ir], flike[:,is,ir,it]) - # g += dot(dblike[:,is,ir,it], rQP[ir], flike[:,is,ir,it]) - @inbounds for i in 1:k for j in 1:k - ulik[is] += dblike[i,is,ir,it] * Prt[ir][i,j] * flike[j,is,ir,it] - glik[is] += dblike[i,is,ir,it] * rQP[ir][i,j] * flike[j,is,ir,it] - end; end - end - end - else # tree doesn't have focus edge: use clik only, gradient=0 - for is in 1:ns - for ir in 1:nr - ulik[is] += clik[is,ir,it] # already exp-ed inside updatecache_edge! - end - end - end - end - # product over sites (or sum on log scale) - loglik = wsum(log.(ulik)) - if length(grad) > 0 # finish gradient calculation - glik ./= ulik - grad[1] = wsum(glik) - #@show grad[1] - end - #@show loglik + adjustment - return loglik - end - #= - oldlik = objective([focusedge.length], [0.0]) + adjustment - oldlik ≈ obj.loglik || @warn "oldlik $oldlik != stored lik $(obj.loglik): starting NNI?" - # obj.loglik outdated at the start of an NNI move: - # it is for the older, not the newly proposed topology - =# - optBL = lcache.opt - NLopt.max_objective!(optBL, objective) - fmax, xmax, ret = NLopt.optimize(optBL, [focusedge.length]) - newlik = fmax + adjustment - if ret == :FORCED_STOP # || oldlik > newlik - @warn "failed optimization, edge $(focusedge.number): skipping branch length update." - return nothing - end - focusedge.length = xmax[1] - obj.loglik = newlik - update_logtrans(obj, focusedge) # obj.logtrans updated according to new edge length - return nothing -end - -#= -Note: This is an unused attempt to use the hessian and the Optim package. -function optimizelength_LiNC!(obj::SSM, focusedge::Edge, lcache::CacheLengthLiNC) - fun = objective(t) # returns vector [loglik,gradient,hessian] - f = x::Vector -> -fun(x[1])[1] # minimize -loglik - function g!(g,x::Vector) - g = [-fun(x[1])[2]] - end - function h!(h,x::Vector) - h = [-fun(x[1])[3]] - end - x0 = [focusedge.length] - df = TwiceDifferentiable(f, g!, h!, x0) - lx = [0.]; ux = [Inf]; - dfc = TwiceDifferentiableConstraints(lx, ux) - res = Optim.optimize(df, dfc, x0, IPNewton()) -end -=# - -#--------------- optimization of inheritance γ --------------# -""" - optimizeallgammas_LiNC!(obj::SSM, ftolAbs::Float64, - γcache::CacheGammaLiNC, maxeval=1000::Int) - -Optimize all γ's in a network, one by one using [`optimizegamma_LiNC!`] -until `maxeval` γ's have been optimized or until the difference in -log-likelihood falls below `ftolAbs`. - -At the end: hybrid edges with γ=0 are deleted (if any). - -Output: true if reticulations have been deleted, false otherwise. -If true, `updateSSM!` needs to be called afterwards, with constraints if any. -(Constraints are not known here). -Before updating the displayed trees in the SSM, [`shrink2cycles!`](@ref) or -[`shrink3cycles!`](@ref) could be called, if desired, despite the (slight?) -change in likelihood that this shrinking would cause. -2/3-cycles are *not* shrunk here. -""" -function optimizeallgammas_LiNC!(obj::SSM, ftolAbs::Float64, - γcache::CacheGammaLiNC, maxeval::Int) - hybnodes = obj.net.hybrid - nh = length(hybnodes) # also = obj.net.numHybrids - if nh==0 return false; end # no gammas to optimize - hybs = [getparentedgeminor(h) for h in hybnodes] - discrete_corelikelihood!(obj) # prerequisite for optimizegamma_LiNC! - nevals = 0 - ll = obj.loglik - llnew = +Inf; lldiff = +Inf - while nevals < maxeval && lldiff > ftolAbs - for he in hybs - llnew = optimizegamma_LiNC!(obj, he, ftolAbs, γcache) - end - lldiff = llnew - ll - ll = llnew - nevals += nh - end - ghosthybrid = false - hi = nh - while hi > 0 - he = getparentedgeminor(hybnodes[hi]) - if he.gamma == 0.0 - deletehybridedge!(obj.net, he, false,true,false,false,false) - ghosthybrid = true - nh = length(hybnodes) # normally nh-1, but could be less: deleting - # one hybrid may delete others indirectly, e.g. if hybrid ladder - # or if generation of a 2-cycle - end - hi -= 1 - if hi>nh hi=nh; end - end - return ghosthybrid -end - -""" - optimizelocalgammas_LiNC!(obj::SSM, edge::Edge, - ftolAbs::Float64, γcache::CacheGammaLiNC, - maxeval=1000::Int) - -Optimize γ's in `net` locally around `edge`. Update all edges adjacent to -`edge` (including itself), one by one using [`optimizegamma_LiNC!`] -until `maxeval` γ's have been optimized or until the difference in -log-likelihood falls below `ftolAbs`. -`nothing` is returned. - -Used after `nni!` or `addhybridedge!` moves to update local gammas. - -Assumptions: -- correct `isChild1` field for `edge` and for hybrid edges -- no in-coming polytomy: a node has 0, 1 or 2 parents, no more - -```jldoctest -julia> net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); - -julia> fastafile = abspath(joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "simple.aln")); - -julia> obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastafile, :JC69); - -julia> obj.net.edge[3].gamma -0.9 - -julia> using Random; Random.seed!(1234); - -julia> PhyloNetworks.optimizelocalgammas_LiNC!(obj, obj.net.edge[3], 1e-3, PhyloNetworks.CacheGammaLiNC(obj)); - -julia> obj.net.edge[3].gamma -0.0 -```` -""" -function optimizelocalgammas_LiNC!(obj::SSM, edge::Edge, - ftolAbs::Float64, γcache::CacheGammaLiNC, - maxeval=1000::Int) - # get edges that are: hybrid and adjacent to edge - neighborhybs = Edge[] - for e in edge.node[1].edge - e.hybrid || continue # below: e is a hybrid edge - push!(neighborhybs, e) - end - for e in edge.node[2].edge - e.hybrid || continue - e === edge && continue - push!(neighborhybs, e) - end - # next: keep minor edges, and replace major hybrid edges - # by their minor partner if not already in the list - for i in length(neighborhybs):-1:1 - e = neighborhybs[i] - e.isMajor || continue # skip below for minor edges - p = getpartneredge(e) # minor partner - j = findfirst(x -> x===p, neighborhybs) - if isnothing(j) - neighborhybs[i] = p # replace major e by its minor partner - else - deleteat!(neighborhybs,i) # delete e - end - end - nh = length(neighborhybs) - if nh==0 - return nothing - end - discrete_corelikelihood!(obj) # prerequisite for optimizegamma_LiNC! - nevals = 0 - ll = obj.loglik - llnew = +Inf; lldiff = +Inf - while nevals < maxeval && lldiff > ftolAbs - for he in neighborhybs - llnew = optimizegamma_LiNC!(obj, he, ftolAbs, γcache) - end - lldiff = llnew - ll - ll = llnew - nevals += nh - end - return nothing -end - -""" - optimizegamma_LiNC!(obj::SSM, focusedge::Edge, - ftolAbs::Float64, cache::CacheGammaLiNC, maxNR=10::Int) - -Optimize γ on a single hybrid `edge` using the Newton-Raphson method -(the log-likelihood is concave). -The new log-likelihood is returned after -updating `obj` and its fields with the new γ. - -The search stops if the absolute difference in log-likelihood -between two consecutive iterations is below `ftolAbs`, -or after `maxNR` Newton-Raphson iterations. - -Warnings: -- no check that `edge` is hybrid -- `obj._loglikcache` and displayed trees (etc.) are assumed to be up-to-date, - and is updated alongside the new γ. - -Used by [`optimizelocalgammas_LiNC!`](@ref) and -[`optimizeallgammas_LiNC!`](@ref). -""" -function optimizegamma_LiNC!(obj::SSM, focusedge::Edge, - ftolAbs::Float64, cache::CacheGammaLiNC, maxNR=10::Int) - ## step 1: prepare vectors constant during the search - edgenum = focusedge.number - partner = getpartneredge(focusedge) - partnernum = partner.number - clike = cache.clike # conditional likelihood under focus edge - clikp = cache.clikp # conditional likelihood under partner edge - clikn = cache.clikn # conditional lik under no focus edge nor partner edge - ulik = obj._sitecache # unconditional likelihood and more - llca = obj._loglikcache - fill!(clike, 0.0); fill!(clikp, 0.0) - fill!(clikn, 0.0) - nt, hase = updatecache_hase!(cache, obj, edgenum, partnernum) - γ0 = focusedge.gamma - visib = !any(ismissing, hase) # reticulation visible in *all* displayed trees? - # check that the likelihood depends on the edge's γ: may not be the case - # if displayed trees who have the edge or its partner have prior weight 0 - # Would pruning edges with weight 0 make the focus edge dangle? - if all(i -> ismissing(hase[i]) || obj.priorltw[i] == -Inf, 1:nt) - # @debug "γ does not affect the likelihood: skip optimization" - return obj.loglik - end - if γ0<1e-7 # then prior weight and loglikcachetoo small (-Inf if γ0=0) - # @debug "γ0 too small ($γ0): was changed to 1e-7 prior to optimization" - γ0 = 1e-7 - setGamma!(focusedge, γ0) - updatedisplayedtrees!(obj.displayedtree, edgenum, partnernum, γ0, hase) - updateSSM_priorltw!(obj) - discrete_corelikelihood!(obj) # to update obj._loglikcache - elseif γ0>0.9999999 - # @debug "γ0 too large ($γ0): was changed to 1 - 1e-7 prior to optimization" - γ0 = 0.9999999 - setGamma!(focusedge, γ0) - updatedisplayedtrees!(obj.displayedtree, edgenum, partnernum, γ0, hase) - updateSSM_priorltw!(obj) - discrete_corelikelihood!(obj) # to update obj._loglikcache - end - # obj._loglikcache[site,rate,tree] = log P(site & tree,rate) - cadjust = maximum(view(llca, :,:,1:nt)) # to avoid underflows - nr = length(obj.ratemodel.ratemultiplier) - for it in 1:nt # sum likelihood over all displayed trees - @inbounds h = hase[it] - if ismissing(h) # tree doesn't have e nor partner - for ir in 1:nr # sum over all rate categories - clikn .+= exp.(llca[:,ir,it] .- cadjust) - end - elseif h # tree has e - for ir in 1:nr # sum over all rate categories - clike .+= exp.(llca[:,ir,it] .- cadjust) - end - else # tree has partner edge - for ir in 1:nr - clikp .+= exp.(llca[:,ir,it] .- cadjust) - end - end - end - ## step 2: Newton-Raphson - clike ./= γ0 - clikp ./= 1.0 - γ0 - adjustment = obj.totalsiteweight * cadjust - ll = obj.loglik - adjustment - wsum = (obj.siteweight === nothing ? sum : x -> sum(obj.siteweight .* x)) - # evaluate if best γ is at the boundary: 0 or 1 - if visib # true most of the time (all the time if tree-child) - ulik .= (clike .- clikp) ./ clikp # avoids adding extra long vector of zeros - else ulik .= (clike .- clikp) ./ (clikp .+ clikn); end - # derivative of loglik at γ=0 - llg0 = wsum(ulik) - inside01 = true - if llg0 <= 0.0 # if llg0 = 0, something fishy is happening or data has no variation - γ = 0.0 - inside01 = false - ll = wsum((visib ? log.(clikp) : log.(clikp .+ clikn))) - # @debug "γ = 0 best, skip Newton-Raphson" - else # at γ=1 - if visib - ulik .= (clike .- clikp) ./ clike - else ulik .= (clike .- clikp) ./ (clike .+ clikn); end - llg1 = wsum(ulik) - if llg1 >= 0.0 # if llg1 = 0.0, data has no variation - γ = 1.0 - inside01 = false - ll = wsum((visib ? log.(clike) : log.(clike .+ clikn))) - # @debug "γ = 1 best, skip Newton-Raphson" - end - end - if inside01 - # use interpolation to get a good starting point? γ = llg0 / (llg0 - llg1) in [0,1] - γ = γ0 - if visib - ulik .= γ .* clike + (1.0-γ) .* clikp - else ulik .= γ .* clike + (1.0-γ) .* clikp .+ clikn; end - # ll: rescaled log likelihood. llg = gradient, llh = hessian below - for istep in 1:maxNR - # ll from above is also: sum(obj.siteweight .* log.(ulik))) - ulik .= (clike .- clikp) ./ ulik # gradient of unconditional lik - llg = wsum(ulik) - map!(x -> x^2, ulik, ulik) # now ulik = -hessian contributions - llh = - wsum(ulik) - cγ = γ - llg/llh # candidate γ: will be new γ if inside (0,1) - if cγ >= 1.0 - γ = γ/2 + 0.5 - elseif cγ <= 0.0 - γ = γ/2 - else - γ = cγ - end - if visib - ulik .= γ .* clike + (1.0-γ) .* clikp - else ulik .= γ .* clike + (1.0-γ) .* clikp + clikn; end - ll_new = wsum(log.(ulik)) - lldiff = ll_new - ll - ll = ll_new - lldiff < ftolAbs && break - end - end - ## step 3: update SSM object with new γ - focusedge.gamma = γ - partner.gamma = 1.0 - γ - newmajor = γ > 0.5 - if newmajor != focusedge.isMajor - focusedge.isMajor = newmajor - partner.isMajor = !newmajor - # fixit: check clade constraints. perhaps at the start: - # if this was problematic for constraints, restrict the search - # to interval [0,0.5] or [0.5,1] as appropriate - end - ll += adjustment - obj.loglik = ll - lγdiff = log(γ) - log(γ0); l1mγdiff = log(1.0-γ) - log(1.0-γ0) - for it in 1:nt - @inbounds h = hase[it] - ismissing(h) && continue # tree has unchanged weight: skip below - obj.priorltw[it] += (h ? lγdiff : l1mγdiff) - llca[:,:,it] .+= (h ? lγdiff : l1mγdiff) - end - return ll -end - -function updatecache_hase!(cache::CacheGammaLiNC, obj::SSM, - edgenum::Int, partnernum::Int) - nt = length(obj.displayedtree) # could change if non-tree-child net - hase = cache.hase - resize!(hase, nt) - for i in 1:nt - @inbounds t = obj.displayedtree[i] - @inbounds hase[i] = missing - for e in t.edge - if e.number == edgenum - @inbounds hase[i] = true - break - elseif e.number == partnernum - @inbounds hase[i] = false - break - end - end - end - return nt, hase -end diff --git a/src/pseudolik.jl b/src/pseudolik.jl deleted file mode 100644 index 6190969be..000000000 --- a/src/pseudolik.jl +++ /dev/null @@ -1,1390 +0,0 @@ -# functions to calculate the pseudolik function -# originally in functions.jl -# Claudia March 2015 - - -# -------------------- delete Leaf------------------------------------- - - -# aux function to make a hybrid node a tree node -# used in deleteLeaf -# input: hybrid node -function makeNodeTree!(net::Network, hybrid::Node) - hybrid.hybrid || error("cannot make node $(hybrid.number) tree node because it already is") - @debug "we make node $(hybrid.number) a tree node, but it can still have hybrid edges pointing at it, hasHybEdge set to false" - hybrid.gammaz = -1 - hybrid.isBadDiamondI = false - hybrid.isBadDiamondII = false - hybrid.isBadTriangle = false - hybrid.k = -1 - removeHybrid!(net,hybrid) - hybrid.hybrid = false - hybrid.hasHybEdge = false - hybrid.name = "" -end - -# aux function to make a hybrid edge tree edge -# used in deleteLeaf -# input: edge and hybrid node it pointed to -function makeEdgeTree!(edge::Edge, node::Node) - edge.hybrid || error("cannot make edge $(edge.number) tree because it is tree already") - node.hybrid || error("need the hybrid node at which edge $(edge.number) is pointing to, node $(node.number) is tree node") - @debug "we make edge $(edge.number) a tree edge, but it will still point to hybrid node $(node.number)" - edge.hybrid = false - edge.isMajor = true - edge.gamma = 1.0 - edge.inCycle = -1 #warn:changed recently because I believe it does not affect the parameters function for bad diamond I - other = getOtherNode(edge,node) - hyb = false - for e in other.edge #is it attached to other hybrid? - if(e.hybrid) - hyb = true - end - end - other.hasHybEdge = hyb - edge.istIdentifiable = isEdgeIdentifiable(edge) -end - -# function to delete internal nodes until there is no -# more internal node with only two edges -# calls deleteIntLeaf! inside a while -# returns middle node (see ipad drawing) -# negative=true allows negative branch lengths -function deleteIntLeafWhile!(net::Network, middle::Node, leaf::Node, negative::Bool) - while(size(middle.edge,1) == 2) - middle = deleteIntLeaf!(net,middle,leaf, negative) - end - return middle -end - -deleteIntLeafWhile!(net::Network, middle::Node, leaf::Node) = deleteIntLeafWhile!(net, middle, leaf, false) - -# function to delete internal nodes until there is no -# more internal node with only two edges -# calls deleteIntLeaf! inside a while -# negative=true allows negative branch lengths -function deleteIntLeafWhile!(net::Network, leafedge::Edge, leaf::Node, negative::Bool) - middle = getOtherNode(leafedge, leaf) - while(size(middle.edge,1) == 2) - middle = deleteIntLeaf!(net,middle,leaf, negative) - end -end - -deleteIntLeafWhile!(net::Network, leafedge::Edge, leaf::Node) = deleteIntLeafWhile!(net, leafedge, leaf, false) - -# function to delete an internal node in an external edge -# input: network, internal node and leaf -# returns the new middle -# note: leafedge is the edge that survives -# negative=true allows negative branch lengths -function deleteIntLeaf!(net::Network, middle::Node, leaf::Node, negative::Bool) - #println("calling deleteIntLeaf for middle $(middle.number) and leaf $(leaf.number)") - if(size(middle.edge,1) == 2) - if(isEqual(getOtherNode(middle.edge[1],middle),leaf)) - leafedge = middle.edge[1] - otheredge = middle.edge[2] - elseif(isEqual(getOtherNode(middle.edge[2],middle),leaf)) - leafedge = middle.edge[2] - otheredge = middle.edge[1] - else - error("leaf $(leaf.number) is not attached to internal node $(middle.number) by any edge") - end - othernode = getOtherNode(otheredge,middle) - setLength!(leafedge,leafedge.length + otheredge.length, negative) - removeNode!(middle,leafedge) - removeEdge!(othernode,otheredge) - setNode!(leafedge,othernode) - setEdge!(othernode,leafedge) - deleteNode!(net,middle) - deleteEdge!(net,otheredge) - return othernode - else - @error "internal node $(middle.number) does not have two edges only, it has $(size(middle.edge,1))" - end -end - -deleteIntLeaf!(net::Network, middle::Node, leaf::Node) = deleteIntLeaf!(net, middle, leaf, false) - -# function to delete an internal node in an external edge -# input: network, edge (from leaf.edge) to move in that direction and leaf -# returns the new middle -# note: leafedge is the edge that survives -# negative=true allows negative branch lengths -function deleteIntLeaf!(net::Network, leafedge::Edge, leaf::Node, negative::Bool) - middle = getOtherNode(leafedge,leaf) - if(size(middle.edge,1) == 2) - if(isEqual(getOtherNode(middle.edge[1],middle),leaf)) - otheredge = middle.edge[2] - elseif(isEqual(getOtherNode(middle.edge[2],middle),leaf)) - otheredge = middle.edge[1] - else - error("leaf $(leaf.number) is not attached to internal node $(middle.number) by any edge") - end - othernode = getOtherNode(otheredge,middle) - setLength!(leafedge,leafedge.length + otheredge.length, negative) - removeNode!(middle,leafedge) - removeEdge!(othernode,otheredge) - setNode!(leafedge,othernode) - setEdge!(othernode,leafedge) - deleteNode!(net,middle) - deleteEdge!(net,otheredge) - return othernode - else - @error "internal node $(middle.number) does not have two edges only, it has $(size(middle.edge,1))" - end -end - -deleteIntLeaf!(net::Network, leafedge::Edge, leaf::Node) = deleteIntLeaf!(net, leafedge, leaf, false) - -# fixit: still missing to test hybrid-> bad triangle II and -# normal case (not bad triangle/diamond) of hasHybEdge -# and normal case, delete not hybrid leaf bad triangle II -function deleteLeaf!(net::Network, leaf::Node) - leaf.leaf || error("node $(leaf.number) is not a leaf, cannot delete it") - isNodeNumIn(leaf,net.leaf) || error("node $(leaf.number) is not in net.leaf, cannot delete it") - size(leaf.edge,1) == 1 || error("strange leaf $(leaf.number) with $(size(leaf.edge,1)) edges instead of 1") - other = getOtherNode(leaf.edge[1],leaf); - DEBUGC && @debug "leaf is $(leaf.number) and other is $(other.number)" - if(other.hybrid) - DEBUGC && @debug "entra al caso other is hybrid node, other is $(other.number)" - edge1,edge2 = hybridEdges(other,leaf.edge[1]); - @debug "edge1 $(edge1.number), edge2 $(edge2.number)" - (edge1.hybrid && edge2.hybrid) || error("hybrid node $(other.node) does not have two hybrid edges, they are tree edges: $(edge1.number), $(edge2.number)") - other1 = getOtherNode(edge1,other); - other2 = getOtherNode(edge2,other); - @debug "in deleteLeaf, other hybrid node, other1 $(other1.number), other2 $(other2.number)" - removeEdge!(other1,edge1) - removeEdge!(other2,edge2) - deleteEdge!(net,edge1) - deleteEdge!(net,edge2) - deleteEdge!(net,leaf.edge[1]) - deleteNode!(net,other) - deleteNode!(net,leaf) - if(size(other1.edge,1) == 2 && isNodeNumIn(other1,net.node)) # need to delete internal nodes with only 2 edges (one of them external edge) - node = getOtherNode(other1.edge[1],other1) - leaf1 = node.leaf ? node : getOtherNode(other1.edge[2],other1) - DEBUGC && @debug "other1 si tiene solo dos edges, y leaf1 es $(leaf1.number)" - if(leaf1.leaf) - deleteIntLeafWhile!(net,other1,leaf1); - end - end - if(size(other2.edge,1) == 2 && isNodeNumIn(other2,net.node)) - node = getOtherNode(other2.edge[1],other2) - leaf1 = node.leaf ? node : getOtherNode(other2.edge[2],other2) - DEBUGC && @debug "other2 si tiene solo dos edges, y leaf1 es $(leaf1.number)" - if(leaf1.leaf) - deleteIntLeafWhile!(net,other2,leaf1); - end - end - if(length(other1.edge) == 1 && isNodeNumIn(other1,net.node)) #internal node with only one edge - !other1.leaf || error("node $(other1.number) was attached no hybrid edge, cannot be a leaf") - removeWeirdNodes!(net,other1) - end - if(length(other2.edge) == 1 && isNodeNumIn(other2,net.node)) - !other2.leaf || error("node $(other2.number) was attached no hybrid edge, cannot be a leaf") - removeWeirdNodes!(net,other2) - end - else - if(other.hasHybEdge) - @debug "entro a caso tree node has hyb edge" - edge1,edge2 = hybridEdges(other,leaf.edge[1]); - (edge1.hybrid || edge2.hybrid) || error("node $(other.number) has hybrid edge attribute true, but the edges $(edge1.number), $(edge2.number) are not hybrid (and the third edge has a leaf $(leaf.number)") - other1 = getOtherNode(edge1,other); - other2 = getOtherNode(edge2,other); - # warning: if something changed for other1, also need to do for other2 - if(other1.hybrid) - if(other1.isBadDiamondI) - edgemaj,edgemin,edgebla = hybridEdges(other1) - edge4 = isEqual(edge1,edgemaj) ? edgemin : edgemaj - other3 = getOtherNode(edge4,other1) - ind = isEqual(getOtherNode(edgemaj,other1),other3) ? 1 : 2 - edgebla,edge3,edge5 = hybridEdges(other3) - leaf5 = getOtherNode(edge5,other3) - DEBUGC && @debug "edge2 is $(edge2.number) and is identifiable $(edge2.istIdentifiable)" - edge2.fromBadDiamondI = true # to keep track of edges from bad diamondI - removeNode!(other,edge2) - removeEdge!(other1,edge1) - setNode!(edge2,other1) - setEdge!(other1,edge2) - other3.gammaz != -1 || error("hybrid node $(other1.number) is bad diamond, but for node $(other3.number), gammaz is not well updated, it is $(other3.gammaz)") - DEBUGC && @debug "entro a cambiar length en edge $(edge2.number) con gammaz $(other3.gammaz)" - setLength!(edge2,-log(1-other3.gammaz)) - edge2.number = parse(Int,string(string(other1.number),string(ind))) - DEBUGC && @debug "edge2 is $(edge2.number) should be not identifiable now $(edge2.istIdentifiable)" - makeEdgeTree!(edge4,other1) - makeNodeTree!(net,other1) - removeEdge!(other2,edge3) - removeEdge!(other3,edge3) - deleteNode!(net,other) - deleteEdge!(net,edge1) - deleteEdge!(net,edge3) - removeNode!(other3,edge4) - removeEdge!(leaf5,edge5) - setNode!(edge4,leaf5) - setEdge!(leaf5,edge4) - setLength!(edge4,edge5.length) - deleteNode!(net,other3) - deleteEdge!(net,edge5) - other1.hasHybEdge = false - @debug begin printEdges(net); "printed edged" end - else - removeEdge!(other,leaf.edge[1]) - edgebla,edgebla,treeedge = hybridEdges(other1) - if(getOtherNode(treeedge,other1).leaf) - setLength!(edge1,edge2.length+edge1.length) - removeEdge!(other2,edge2) - removeNode!(other,edge1) - setNode!(edge1,other2) - setEdge!(other2,edge1) - deleteEdge!(net,edge2) - deleteNode!(net,other) - end - end - deleteNode!(net,leaf) - deleteEdge!(net,leaf.edge[1]) - elseif(other2.hybrid) - if(other2.isBadDiamondI) - edgemaj,edgemin,edgebla = hybridEdges(other2) - edge4 = isEqual(edge2,edgemaj) ? edgemin : edgemaj - other3 = getOtherNode(edge4,other2) - ind = isEqual(getOtherNode(edgemaj,other2),other3) ? 1 : 2 - edgebla,edge3,edge5 = hybridEdges(other3) - leaf5 = getOtherNode(edge5,other3) - DEBUGC && @debug "edge1 is $(edge1.number) and is identifiable $(edge1.istIdentifiable)" - edge1.fromBadDiamondI = true # to keep track of edges from bad diamondI - removeNode!(other,edge1) - removeEdge!(other2,edge2) - setNode!(edge1,other2) - setEdge!(other2,edge1) - other3.gammaz != -1 || error("hybrid node $(other2.number) is bad diamond, but for node $(other3.number), gammaz is not well updated, it is $(other3.gammaz)") - setLength!(edge1,-log(1-other3.gammaz)) - edge1.number = parse(Int,string(string(other2.number),string(ind))) - DEBUGC && @debug "edge1 is $(edge1.number) should be not identifiable now $(edge1.istIdentifiable)" - makeEdgeTree!(edge4,other2) - makeNodeTree!(net,other2) - removeEdge!(other1,edge3) - removeEdge!(other3,edge3) - deleteNode!(net,other) - deleteEdge!(net,edge2) - deleteEdge!(net,edge3) - removeNode!(other3,edge4) - removeEdge!(leaf5,edge5) - setNode!(edge4,leaf5) - setEdge!(leaf5,edge4) - setLength!(edge4,edge5.length) - deleteNode!(net,other3) - deleteEdge!(net,edge5) - else - removeEdge!(other,leaf.edge[1]) - edgebla,edgebla,treeedge = hybridEdges(other2) - if(getOtherNode(treeedge,other2).leaf) - setLength!(edge2,edge2.length+edge1.length) - removeEdge!(other1,edge1) - removeNode!(other,edge2) - setNode!(edge2,other1) - setEdge!(other1,edge2) - deleteEdge!(net,edge1) - deleteNode!(net,other) - end - end - deleteNode!(net,leaf) - deleteEdge!(net,leaf.edge[1]) - else - error("node $(other.number) has hybrid edge, but neither of the other nodes $(other1.number), $(other2.number) are hybrid") - end - else # other is tree node without hybrid edges - DEBUGC && @debug "entra al caso other is tree node no hyb edges" - if(length(other.edge) == 2) - edge1 = isEqual(other.edge[1],leaf.edge[1]) ? other.edge[2] : other.edge[1] - other1 = getOtherNode(edge1,other) - removeEdge!(other1,edge1) - removeNode!(other1,edge1) - deleteNode!(net,other) - deleteNode!(net,leaf) - deleteEdge!(net,leaf.edge[1]) - deleteEdge!(net,edge1) - DEBUGC && @debug "other1 is $(other1.number)" - if(size(other1.edge,1) == 2 && isNodeNumIn(other1,net.node)) # need to delete internal nodes with only 2 edges (one of them external edge) - node = getOtherNode(other1.edge[1],other1) - leaf1 = node.leaf ? node : getOtherNode(other1.edge[2],other1) - DEBUGC && @debug "other1 si tiene solo dos edges, y leaf1 es $(leaf1.number)" - if(leaf1.leaf) - other1 = deleteIntLeafWhile!(net,other1,leaf1); - end - end - if(other1.hybrid && length(other1.edge) == 2) - DEBUGC && @debug "entra a tratar de arreglar a other1 $(other1.number)" - removeWeirdNodes!(net,other1) - end - if(length(other1.edge) == 1 && isNodeNumIn(other1,net.node)) #internal node with only one edge - DEBUGC && @debug "entra a tratar de arreglar a other1 $(other1.number)" - !other1.leaf || error("node $(other1.number) was attached no leaf edge, cannot be a leaf") - removeWeirdNodes!(net,other1) - end - else - edge1,edge2 = hybridEdges(other,leaf.edge[1]); - other1 = getOtherNode(edge1,other); - other2 = getOtherNode(edge2,other); - removeEdge!(other,leaf.edge[1]) - deleteNode!(net,leaf) - deleteEdge!(net,leaf.edge[1]) - if(other1.leaf || other2.leaf) - (!other1.leaf || !other2.leaf) || error("just deleted a leaf $(leaf.number) and its two attached nodes are leaves also $(other1.number), $(other2.number)") - newleaf = other1.leaf ? other1 : other2 - middle = other - DEBUGC && @debug "middle is $(middle.number), middle.hybrid $(middle.hybrid), middle.hasHybEdge $(middle.hasHybEdge)" - middle = deleteIntLeafWhile!(net,middle,newleaf) - DEBUGC && @debug "middle is $(middle.number), middle.hybrid $(middle.hybrid), middle.hasHybEdge $(middle.hasHybEdge)" - if(middle.hybrid) - edges = hybridEdges(middle) - edges[1].istIdentifiable = false - edges[2].istIdentifiable = false - end - end - end - end - end -end - -""" -`deleteLeaf!(net::HybridNetwork, leaf::AbstractString)` -`deleteLeaf!(net::Network, leaf::Node)` - -Deletes the leaf taxon from the network. The leaf argument is the name of the taxon to delete. - -Warnings: - -- requires a level-1 network with up-to-date attributes for snaq! (e.g. non-missing branch lengths, gammaz, etc.) -- does not care where the root is and does not update it to a sensible location if the root - is affected by the leaf removal. -- does not merge edges, i.e. does not remove all nodes of degree 2. Within snaq!, this - is used to extract quartets and to keep track of which - edge lengths in the original network map to the quartet network. -""" -function deleteLeaf!(net::Network, leaf::AbstractString) - found = false - for l in net.leaf - if(l.name == leaf) - found = true - deleteLeaf!(net,l) - break - end - end - found || error("cannot delete leaf $(leaf) because it was not found in the network") -end - - -# -------------------- extract quartet --------------------------------------- - -# function to update hasEdge attribute in a -# QuartetNetwork after leaves deleted -# with deleteLeaf! -function updateHasEdge!(qnet::QuartetNetwork, net::HybridNetwork) - #@warn "function to compare edges depends on edges number being unique" - edges = Bool[] - h = Bool[] - hz = Bool[] - for e in net.edge - if(e.istIdentifiable) - if(isEdgeNumIn(e,qnet.edge) && qnet.edge[getIndexEdge(e.number,qnet)].istIdentifiable) - #println("found identifiable edge $(e.number) in net and qnet") - push!(edges,true) - else - #println("not found identifiable edge $(e.number) in qnet but identifiable in net") - push!(edges,false) - end - end - if e.hybrid && !e.isMajor - node = e.node[e.isChild1 ? 1 : 2] - node.hybrid || error("strange thing, hybrid edge $(e.number) pointing at tree node $(node.number)") - if(!node.isBadDiamondI) - #println("found hybrid edge $(e.number) in net and qnet") - push!(h,isNodeNumIn(node,qnet.hybrid)) - else - if(isNodeNumIn(node,qnet.hybrid)) - push!(hz,true) - push!(hz,true) - else - ind1 = parse(Int,string(string(node.number),"1")) - ind2 = parse(Int,string(string(node.number),"2")) - found1 = true - found2 = true - try - getIndexEdge(ind1,qnet) - catch - found1 = false - end - try - getIndexEdge(ind2,qnet) - catch - found2 = false - end - if(!found1 && !found2) - push!(hz,false) - push!(hz,false) - elseif(found1 && !found2) - index = getIndexEdge(ind1,qnet) - if(!qnet.edge[index].istIdentifiable && all((n->!n.leaf), qnet.edge[index].node)) - push!(hz,true) - else - push!(hz,false) - end - push!(hz,false) - elseif(found2 && !found1) - push!(hz,false) - index = getIndexEdge(ind2,qnet) - if(!qnet.edge[index].istIdentifiable && all((n->!n.leaf), qnet.edge[index].node)) - push!(hz,true) - else - push!(hz,false) - end - else - index1 = getIndexEdge(ind1,qnet) - index2 = getIndexEdge(ind2,qnet) - if(!qnet.edge[index1].istIdentifiable && all((n->!n.leaf), qnet.edge[index1].node) && !qnet.edge[index2].istIdentifiable && all((n->!n.leaf), qnet.edge[index2].node)) - error("strange qnet when net has node $(node.number) Bad Diamond I: qnet should have only one of the gammaz if it does not have node, but it has two") - end - end - end - end - end - end # for in net.edge - #println("edges $(edges), h $(h), hz $(hz)") - qnet.hasEdge = vcat(h,edges,hz) -end - - -# function to extract a quartet from a network -# input: QuartetNetwork (already created from HybridNetwork) -# quartet: array with the 4 leaf nodes to keep -# return: QuartetNetwork with only 4 tips -# it updates qnet.hasEdge and qnet.indexht -function extractQuartet(net::HybridNetwork,quartet::Array{Node,1}) - size(quartet,1) == 4 || error("quartet array should have 4 nodes, it has $(size(quartet,1))") - (quartet[1].leaf && quartet[2].leaf && quartet[3].leaf && quartet[4].leaf) || error("all four nodes to keep when extracting the quartet should be leaves: $([q.number for q in quartet])") - qnet = QuartetNetwork(net) # fixit: try to re-use memory? quartetTaxon has not changed for instance. - leaves = copy(qnet.leaf) - for n in leaves - if(!isNodeNumIn(n,quartet)) - DEBUGC && @debug "delete leaf $(n.number)" - deleteLeaf!(qnet,n) - DEBUGC && printEdges(qnet) - end - end - DEBUGC && @debug "deletion of leaves successful" - return qnet -end - -# function to extract a quartet from a Quartet object -# it calls the previous extractQuartet -# returns qnet (check: maybe not needed later) and assigns -# quartet.qnet = qnet -function extractQuartet!(net::HybridNetwork, quartet::Quartet) - list = Node[] - for q in quartet.taxon - tax_in_net = findfirst(n -> n.name == q, net.node) - tax_in_net != nothing || error("taxon $(q) not in network") - push!(list, net.node[tax_in_net]) - end - qnet = extractQuartet(net,list) - @debug "EXTRACT: extracted quartet $(quartet.taxon)" - redundantCycle!(qnet) #removes no leaves, cleans external edges - updateHasEdge!(qnet,net) - parameters!(qnet,net) - qnet.quartetTaxon = quartet.taxon - quartet.qnet = qnet - #return qnet -end - - -# function to extract all quartets from net according -# to the array of quartets of a Data object -# it updates expCF, hasEdge, indexht -function extractQuartet!(net::HybridNetwork, quartet::Vector{Quartet}) - @debug "EXTRACT: begins extract quartets for network" - for q in quartet - extractQuartet!(net,q) - qnet = deepcopy(q.qnet); #there is a reason not to mess up with the original q.qnet, i believe to keep ht consistent - calculateExpCFAll!(qnet); - q.qnet.expCF[:] = qnet.expCF - end -end - -extractQuartet!(net::HybridNetwork, d::DataCF) = extractQuartet!(net, d.quartet) - -# function to check if there are potential redundant cycles in net -# return the flag (true=redundant cycle found) and the hybrid node for the redundant cycle -function hasRedundantCycle(net::Network) - length(net.hybrid) == net.numHybrids || error("found net with length net.hybrid of $(length(net.hybrid)) and net.numHybrids of $(net.numHybrids)") - if net.numHybrids > 0 - for h in net.hybrid - k = sum([(n.inCycle == h.number && length(n.edge) == 3) ? 1 : 0 for n in net.node]) - if k < 2 - return true,h - end - end - end - return false,nothing -end - - -# function to delete redundante cycles on all hybrid nodes in net -function redundantCycle!(net::Network) - length(net.hybrid) == net.numHybrids || error("found net with length net.hybrid of $(length(net.hybrid)) and net.numHybrids of $(net.numHybrids)") - if(length(net.hybrid) > 0) - redCycle, node = hasRedundantCycle(net) - while(redCycle) - !isa(node,Nothing) || error("redundant cycle found, but the hybrid node is set to nothing") - redundantCycle!(net,node) - DEBUGC && @debug "after redundante cycle for hybrid node $(n.number)" - DEBUGC && printEdges(net) - DEBUGC && printNodes(net) - redCycle, node = hasRedundantCycle(net) - end - end - cleanExtEdges!(net) -end - - -# function to delete redundant cycles (k=1,k=2), see ipad notes -# warning: should not modify the quartet too much because we need to extract ht afterwards -function redundantCycle!(net::Network,n::Node) - n.hybrid || error("cannot clean a cycle on a tree node $(n.number)") - edges = hybridEdges(n) - edges[1].hybrid && edges[2].hybrid || error("hybrid node $(n.number) does not have two hybrid edges $(edges[1].number), $(edges[2].number)") - @debug "search for redundantCycle for node $(n.number) with edges are $([e.number for e in edges])" - other = getOtherNode(edges[1],n) - if(length(other.edge) == 2) - e = edges[1] - while(length(other.edge) == 2) - ind = isEqual(e,other.edge[1]) ? 2 : 1 - e = other.edge[ind] - other = getOtherNode(e,other) - end - if(isEqual(n,other)) - n1 = getOtherNode(edges[1],n) - n2 = getOtherNode(edges[2],n) - @debug "redundant cycle found! n1 $(n1.number), n2 $(n2.number)" - deleteIntLeafWhile!(net,n1,n) - edge = n.edge[1].hybrid ? n.edge[1] : n.edge[2] - @debug "edge is $(edge.number), should be the first (or only) edge in hybrid node $(n.number)" - if(isEqual(edge.node[1],edge.node[2])) - @debug "entra a q son iguales los nodes de edge" - n3 = getOtherNode(edges[3],n) - @debug "edges[3] is $(edges[3].number), n3 is $(n3.number)" - removeEdge!(n3,edges[3]) - deleteNode!(net,n) - deleteEdge!(net,edge) - deleteEdge!(net,edges[3]) - if(!n3.leaf && length(n3.edge)==1) - removeNoLeafWhile!(net,n3); - end - end - end - end -end - -# function to delete an internal node with only one edge -function removeNoLeaf!(net::Network,n::Node) - !n.leaf || error("node $(n.number) is a leaf, so we cannot remove it") - length(n.edge) == 1 || error("node $(n.number) has $(length(n.edge)) edges (not 1), so we do not have to remove it") - node = getOtherNode(n.edge[1],n) - removeEdge!(node,n.edge[1]) - deleteNode!(net,n) - deleteEdge!(net,n.edge[1]) - return node -end - -# function to do a while for removeNoLeaf -# warning: we do not want to remove edges because we need to know -# exactly which edges in qnet are affected by changes in net.ht -function removeNoLeafWhile!(net::Network,n::Node) - while(!n.leaf && length(n.edge)==1) - n = removeNoLeaf!(net,n) - end - return n -end - -# Function to check that external edges do not have nodes with only two edges -function cleanExtEdges!(net::Network) -# if(net.numHybrids > 0) - for l in net.leaf - length(l.edge) == 1 || error("leaf $(l.number) with $(length(l.edge)) edges, not 1") - deleteIntLeafWhile!(net,getOtherNode(l.edge[1],l),l) - end -# end -end - -# function to delete a hybrid node that has only two edges: the hybrid ones -# it fixes other1,other2 for internal nodes with only 2 edges (one external), -# returns other1, other2 if they are internal nodes with only one edge -# returns array of nodes (to avoid treating o1,o2 as a tuple later) -function removeLoneHybrid!(net::Network, n::Node) - n.hybrid || error("cannot remove a lone hybrid if it is not hybrid: $(n.number)") - length(n.edge) == 2 || error("hybrid node $(n.number) should have only 2 edges to be deleted, it has $(length(n.edge))") - (n.edge[1].hybrid && n.edge[2].hybrid) || error("both edges have to be hybrid and they are not both: $(n.edge[1].number), $(n.edge[2].number)") - other1 = getOtherNode(n.edge[1],n) - other2 = getOtherNode(n.edge[2],n) - removeEdge!(other1,n.edge[1]) - removeEdge!(other2,n.edge[2]) - deleteEdge!(net,n.edge[1]) - deleteEdge!(net,n.edge[2]) - deleteNode!(net,n) - if(length(other1.edge) == 2 && isNodeNumIn(other1,net.node)) - leaf1 = getOtherNode(other1.edge[1],other1) - leaf = leaf1.leaf ? leaf1 : getOtherNode(other1.edge[2],other1) - if(leaf.leaf) - deleteIntLeafWhile!(net,other1,leaf) - end - end - if(length(other2.edge) == 2 && isNodeNumIn(other2,net.node)) - leaf1 = getOtherNode(other2.edge[1],other2) - leaf = leaf1.leaf ? leaf1 : getOtherNode(other2.edge[2],other2) - if(leaf.leaf) - deleteIntLeafWhile!(net,other2,leaf) - end - end - o1 = false - o2 = false - if(length(other1.edge) == 1) - !other1.leaf || error("node $(other1.number) should not be a leaf because it was attached to hybrid edge") - o1 = true - end - if(length(other2.edge) == 1) - !other2.leaf || error("node $(other2.number) should not be a leaf because it was attached to hybrid edge") - o2 = true - end - if(o1 && !o2) - return [other1] - elseif(!o1 && o2) - return [other2] - elseif(o1 && o2) - return [other1,other2] - else - return nothing - end -end - -function removeWeirdNode!(net::Network,n::Node) - other = nothing - @debug "calling removeWeirdNode in node $(n.number)" - if(length(n.edge) == 1 && !n.leaf) - @debug "node $(n.number) is not a leaf and has one edge" - n = removeNoLeafWhile!(net,n) - end - if(n.hybrid && length(n.edge) == 2) - @debug "node $(n.number) is hybrid with only two edges" - (n.edge[1].hybrid && n.edge[2].hybrid) || error("two edges for this hybrid node $(n.number) must be hybrid, and they are not") - other = removeLoneHybrid!(net,n) #returns array of nodes (length 1 or 2) or nothing - end - return other -end - -# function to remove internal nodes with only one edge -# keep deleting those nodes, and hybrid nodes without descendants -function removeWeirdNodes!(net::Network, n::Node) - @debug "calling removeWeirdNodes in node $(n.number)" - list = Node[] - push!(list,n) - while !isempty(list) - n = pop!(list) - if length(n.edge) == 1 && !n.leaf - n = removeWeirdNode!(net,n) - elseif n.hybrid && length(n.edge) == 2 - (n.edge[1].hybrid && n.edge[2].hybrid) || error("hybrid node $(n.number) only has two edges and they must be hybrids") - n = removeWeirdNode!(net,n) - else - @error "calling removeWeirdNode on normal node $(n.number)" - n = nothing - end - if n !== nothing && !isa(n,Vector{Nothing}) - @debug "typeof n $(typeof(n))" - for l in n - @debug "typeof l $(typeof(l))" - push!(list,l) - end - end - end -end -# ------------------------------- calculate expCF ------------------------------------- - -# ------- Identify Quartet - -# function to identify the type of hybridization of a given hybrid node -# in a quartet network -# sets node.k to the updated count -# sets the node.typeHyb (1,2,3,4,5 see ipad notes) and pushes into qnet.typeHyb -# sets node.prev = other to keep track of the "other" node -# fixit: I think qnet.typeHyb is never used -function identifyQuartet!(qnet::QuartetNetwork, node::Node) - node.hybrid || error("cannot identify the hybridization around node $(node.number) because it is not hybrid node.") - k = sum([(n.inCycle == node.number && size(n.edge,1) == 3) ? 1 : 0 for n in qnet.node]) - node.k = k - if k < 2 - @debug begin - printEdges(qnet) - printNodes(qnet) - "printed edges and nodes" - end - error("strange quartet network with a hybrid node $(node.number) but no cycle") - elseif(k == 2) - other = qnet.node[findfirst(n -> (n.inCycle == node.number && size(n.edge,1) == 3 && !isEqual(n,node)), qnet.node)] - edgebla,edgebla,edge1 = hybridEdges(node) - edgebla,edgebla,edge2 = hybridEdges(other) - if(getOtherNode(edge1,node).leaf || getOtherNode(edge2,other).leaf) - node.typeHyb = 1 - node.prev = other - push!(qnet.typeHyb,1) - else - node.typeHyb = 3 - node.prev = other - push!(qnet.typeHyb,3) - end - elseif(k == 3) - #println("identifyQuartet: entra a k=3") - edge1,edge2,edge3 = hybridEdges(node) - #println("node is $(node.number), edge3 is $(edge3.number)") - if(getOtherNode(edge3,node).leaf) - node.typeHyb = 2 - push!(qnet.typeHyb,2) - for n in qnet.node - if(n.inCycle == node.number && size(n.edge,1) == 3 && !isEqual(n,node)) - #println("found a node $(n.number)") - edge1,edge2,edge3 = hybridEdges(n) - #println("edge1,egde2,edge3 are $(edge1.number), $(edge2.number), $(edge3.number)") - if(getOtherNode(edge3,n).leaf) - node.prev = n - break - end - end - end - else - node.typeHyb = 4 - push!(qnet.typeHyb,4) - for n in qnet.node - if(n.inCycle == node.number && size(n.edge,1) == 3 && !isEqual(n,node)) - node.prev = n - break - end - end - end - elseif(k == 4) - node.typeHyb = 5 - push!(qnet.typeHyb,5) - node.prev = nothing - else - @debug begin - printEdges(qnet) - printNodes(qnet) - "printed edges and nodes" - end - error("strange quartet network with $(k) nodes in cycle, maximum should be 4") - end - DEBUGC && @debug "qnet identified as type $(node.typeHyb)" -end - -# function to identify the Quartet network as -# 1 (equivalent to tree), 2 (minor CF different) -function identifyQuartet!(qnet::QuartetNetwork) - #if(qnet.which == -1) - if(qnet.numHybrids == 0) - qnet.which = 1 - elseif(qnet.numHybrids == 1) - identifyQuartet!(qnet, qnet.hybrid[1]) - if(qnet.typeHyb[1] == 5) - qnet.which = 2 - else - qnet.which = 1 - end - else - for n in qnet.hybrid - cleanUpNode!(qnet,n) - identifyQuartet!(qnet, n) - end - if(all((n->(n.typeHyb != 5)), qnet.hybrid)) - qnet.which = 1 - else - if(all((n->(n.typeHyb == 5 || n.typeHyb == 1)), qnet.hybrid)) - #@warn "hybridization of type 5 found in quartet network along with other hybridizations of type 1. there is the possibility of overlapping cycles." - qnet.which = 2 - else - @debug begin - printEdges(qnet) - printNodes(qnet) - "warning: found in the same quartet, two hybridizations with overlapping cycles: types of hybridizations are $([n.typeHyb for n in qnet.hybrid]), maybe this will cause problems if the hyb do not become all but one type 1" - end - qnet.which = 2 - end - end - end - #end -end - -# function that will get rid of internal nodes with only -# two edges for all three directions of a node -function cleanUpNode!(net::Network,node::Node) - edge1,edge2,edge3 = hybridEdges(node) - deleteIntLeafWhile!(net,getOtherNode(edge1,node),node) - deleteIntLeafWhile!(net,getOtherNode(edge2,node),node) - deleteIntLeafWhile!(net,getOtherNode(edge3,node),node) -end - -# ----------------------- Eliminate Hybridizations - -# aux function to eliminate hybridizations -# in quartet -# input: quartet network, -# node correspond to the hybrid node -# internal: true if loop is in internal edge -function eliminateLoop!(qnet::QuartetNetwork, node::Node, internal::Bool) - node.hybrid || error("cannot eliminate loop around node $(node.number) since it is not hybrid") - edge1,edge2,edge3 = hybridEdges(node) - deleteIntLeafWhile!(qnet, edge1, node) - deleteIntLeafWhile!(qnet, edge2, node) - other = getOtherNode(edge1,node) - isEqual(getOtherNode(edge2,node),other) || error("node $(node.number) and other $(other.number) are not the two nodes in a cycle with k=2") - other.number == node.prev.number || error("something strange, other node $(other.number) should be the same as the stored in node.prev $(node.prev.number)") - removeEdge!(node,edge2) - removeEdge!(other,edge2) - deleteEdge!(qnet,edge2) - if(internal) - setLength!(edge1, -log(1-edge1.gamma*edge1.gamma*edge1.z-edge2.gamma*edge2.gamma*edge2.z)) - else - leaf = getOtherNode(edge3,node) - #if(leaf.leaf) - deleteIntLeafWhile!(qnet,node,leaf) - #else - # edge1,edge2,edge3 = hybridEdges(other) - # deleteIntLeafWhile!(qnet,other,getOtherNode(edge3,other)) - #end - end -end - -# aux function to identify intermediate edge between two nodes -function intermediateEdge(node1::Node,node2::Node) - edge = nothing - for e in node1.edge - if(isEqual(getOtherNode(e,node1),node2)) - edge = e - end - end - if(isa(edge, Nothing)) - error("nodes $(node1.number), $(node2.number) are not connected by an edge") - end - return edge -end - -# function to eliminate a triangle hybridization -# input: quartet network, -# node, other nodes in the hybridization -# case: 1 (global case 2),2 (global case 4), 1 (global case 5) -# warning: special treatment for bad diamond II -function eliminateTriangle!(qnet::QuartetNetwork, node::Node, other::Node, case::Integer) - #println("start eliminateTriangle----") - node.hybrid || error("cannot eliminate triangle around node $(node.number) since it is not hybrid") - #println("hybrid node is $(node.number), with edges $([e.number for e in node.edge]), with gammas $([e.gamma for e in node.edge])") - edgemaj, edgemin, treeedge = hybridEdges(node) - isa(edgemaj,Nothing) ? error("edge maj is nothing for node $(node.number), other $(other.number) and taxon $(qnet.quartetTaxon), $(printEdges(qnet))") : nothing - isa(edgemin,Nothing) ? error("edge min is nothing for node $(node.number), other $(other.number) and taxon $(qnet.quartetTaxon), $(printEdges(qnet))") : nothing - deleteIntLeafWhile!(qnet, edgemaj, node) - deleteIntLeafWhile!(qnet, edgemin, node) - if(isEqual(getOtherNode(edgemaj,node),other)) - hybedge = edgemaj - otheredge = edgemin - elseif(isEqual(getOtherNode(edgemin,node),other)) - hybedge = edgemin - otheredge = edgemaj - else - error("node $(node.number) and other node $(other.number) are not connected by an edge") - end - #println("hybedge is $(hybedge.number), otheredge is $(otheredge.number)") - middle = qnet.node[findfirst(n -> (n.inCycle == node.number && size(n.edge,1) == 3 && !isEqual(n,other) && !isEqual(n,node)), qnet.node)] - #println("middle node is $(middle.number) in eliminateTriangle") - ind = findfirst(e -> (e.inCycle == node.number && !isEqual(getOtherNode(e,middle),node)), middle.edge) - ind != nothing || error("edge number not found in middle edge") - edge = middle.edge[ind] - #println("edge is $(edge.number) with length $(edge.length) in eliminateTriangle, will do deleteIntLeaf from middle through edge") - deleteIntLeafWhile!(qnet,edge,middle) - #println("after deleteIntLeaf, edge $(edge.number) has length $(edge.length)") - isEqual(getOtherNode(edge,middle),other) || error("middle node $(middle.number) and other node $(other.number) are not connected by an edge") - if(case == 1) - setLength!(edge,-log(1 - hybedge.gamma*edge.z)) - #println("Case 1: edge $(edge.number) length is $(edge.length) after updating") - removeEdge!(middle,otheredge) - removeEdge!(other,hybedge) - removeEdge!(node,treeedge) - removeNode!(node,treeedge) - setEdge!(other, treeedge) - setNode!(treeedge, other) - deleteEdge!(qnet,otheredge) - deleteEdge!(qnet,hybedge) - deleteNode!(qnet,node) - elseif(case == 2) - (hybedge.hybrid && otheredge.hybrid) || error("hybedge $(hybedge.number) and otheredge $(otheredge.number) should by hybrid edges in eliminateTriangle Case 2") - setLength!(hybedge, -log(otheredge.gamma*otheredge.gamma*otheredge.y + hybedge.gamma*otheredge.gamma*(3-edge.y) + hybedge.gamma*hybedge.gamma*hybedge.y), true) - #println("Case 2: edge $(edge.number) length is $(edge.length) after updating") - removeEdge!(middle,otheredge) - removeEdge!(node,otheredge) - deleteEdge!(qnet,otheredge) - deleteIntLeafWhile!(qnet, node, getOtherNode(treeedge,node),true) - deleteIntLeafWhile!(qnet, edge, other) - else - error("unknown case $(case), should be 1 or 2") - end - #println("end eliminateTriangle ---") -end - -# function to polish quartet with hybridization type 5 -# (2 minor CF different) and calculate the expCF -# CF calculated in the order 12|34, 13|24, 14|23 of the qnet.quartet.taxon -function quartetType5!(qnet::QuartetNetwork, node::Node) - (node.hybrid && node.typeHyb == 5) || error("cannot polish the quartet type 5 hybridization since either the node is not hybrid: $(!node.hybrid) or it has type $(node.typeHyb), different than 5") - edge1,edge2,edge3 = hybridEdges(node); - if(!node.isBadDiamondI) - deleteIntLeafWhile!(qnet,edge1,node) - deleteIntLeafWhile!(qnet,edge2,node) - end - other1 = getOtherNode(edge1,node); - other2 = getOtherNode(edge2,node); - edgebla,edge5, edgetree1 = hybridEdges(other1); - edgebla,edge6, edgetree2 = hybridEdges(other2); - if(!node.isBadDiamondI) - deleteIntLeafWhile!(qnet,edge5,other1) - deleteIntLeafWhile!(qnet,edge6,other2) - end - if(node.isBadDiamondI) - (other1.gammaz != -1 && other2.gammaz != -1) || error("node $(node.number) is bad diamond I but gammaz are -1") - @debug "it will calculate the expCF in a bad diamond I case with gammaz: $(other1.gammaz) and $(other2.gammaz)" - cf1 = (1 + 2*other1.gammaz - other2.gammaz)/3 - cf2 = (1 + 2*other2.gammaz - other1.gammaz)/3 - cf3 = (1 - other1.gammaz - other2.gammaz)/3 - else - cf1 = edge1.gamma*(1-2/3*edge5.y) + edge2.gamma*1/3*edge6.y - cf2 = edge1.gamma*1/3*edge5.y + edge2.gamma*(1-2/3*edge6.y) - cf3 = edge1.gamma*1/3*edge5.y + edge2.gamma*1/3*edge6.y - end - #println("cf1,cf2,cf3: $(cf1),$(cf2),$(cf3)") - leaf1 = getOtherNode(edge3,node) - if(isa(edgetree1,Nothing)) - println("node $(node.number), edge3 $(edge3.number), other1 $(other1.number), leaf1 $(leaf1.number), other2 $(other2.number)") - println("edge1 $(edge1.number), edge2 $(edge2.number), edge5 $(edge5.number), edge6 $(edge6.number)") - printEdges(qnet) - printNodes(qnet) - end - leaf2 = getOtherNode(edgetree1,other1) - leaf3 = getOtherNode(edgetree2, other2) - leaf4 = qnet.leaf[findfirst(n -> (!isEqual(n,leaf1) && !isEqual(n,leaf2) && !isEqual(n,leaf3)), qnet.leaf)] - #println("leaf1 is $(leaf1.number)") - #println("leaf2 is $(leaf2.number)") - #println("leaf3 is $(leaf3.number)") - #println("leaf4 is $(leaf4.number)") - tx = whichLeaves(qnet,qnet.quartetTaxon[1],qnet.quartetTaxon[2], leaf1,leaf2,leaf3,leaf4) - #println("tx is $(tx)") - if(tx == (1,2) || tx == (2,1) || tx == (3,4) || tx == (4,3)) - qnet.expCF[1] = cf1 - tx = whichLeaves(qnet,qnet.quartetTaxon[1],qnet.quartetTaxon[3], leaf1,leaf2,leaf3,leaf4) - if(tx == (1,3) || tx == (3,1) || tx == (2,4) || tx == (4,2)) - qnet.expCF[2] = cf2 - qnet.expCF[3] = cf3 - elseif(tx == (1,4) || tx == (4,1) || tx == (3,2) || tx == (2,3)) - qnet.expCF[2] = cf3 - qnet.expCF[3] = cf2 - else - error("strange quartet network, could not find which leaves correspond to taxon1, taxon3") - end - elseif(tx == (1,3) || tx == (3,1) || tx == (2,4) || tx == (4,2)) - qnet.expCF[1] = cf2 - tx = whichLeaves(qnet,qnet.quartetTaxon[1],qnet.quartetTaxon[3], leaf1,leaf2,leaf3,leaf4) - if(tx == (1,2) || tx == (2,1) || tx == (3,4) || tx == (4,3)) - qnet.expCF[2] = cf1 - qnet.expCF[3] = cf3 - elseif(tx == (1,4) || tx == (4,1) || tx == (3,2) || tx == (2,3)) - qnet.expCF[2] = cf3 - qnet.expCF[3] = cf1 - else - error("strange quartet network, could not find which leaves correspond to taxon1, taxon3") - end - elseif(tx == (1,4) || tx == (4,1) || tx == (3,2) || tx == (2,3)) - qnet.expCF[1] = cf3 - tx = whichLeaves(qnet,qnet.quartetTaxon[1],qnet.quartetTaxon[3], leaf1,leaf2,leaf3,leaf4) - if(tx == (1,3) || tx == (3,1) || tx == (2,4) || tx == (4,2)) - qnet.expCF[2] = cf2 - qnet.expCF[3] = cf1 - elseif(tx == (1,2) || tx == (2,1) || tx == (3,4) || tx == (4,3)) - qnet.expCF[2] = cf1 - qnet.expCF[3] = cf2 - else - error("strange quartet network, could not find which leaves correspond to taxon1, taxon3") - end - else - error("strange quartet network, could not find which leaves correspond to taxon1, taxon2") - end - if(!approxEq(sum(qnet.expCF),1.)) - error("strange quartet network with hybridization in node $(node.number) of type 5: expCF do not add up to 1") - end -end - -# function to eliminate a hybridization around a given -# hybrid node -function eliminateHybridization!(qnet::QuartetNetwork, node::Node) - node.hybrid || error("cannot eliminate hybridization around node $(node.number) since it is not hybrid node") - if(node.typeHyb == 1) - eliminateLoop!(qnet,node,false) - elseif(node.typeHyb == 3) - eliminateLoop!(qnet,node,true) - elseif(node.typeHyb == 4) - #println("node is $(node.number), other node is $(node.prev.number)") - eliminateTriangle!(qnet,node,node.prev,2) - elseif(node.typeHyb == 2) - #println("node is $(node.number), other node is $(node.prev.number)") - eliminateTriangle!(qnet,node,node.prev,1) - elseif(node.typeHyb != 5) - error("node type of hybridization should be 1,2,3,4 or 5, but for node $(node.number), it is $(node.typeHyb)") - end -end - -# aux function to eliminate all internal nodes with only -# two edges in a quartet network with qnet.which=1 -# eliminate internal nodes in every direction -function internalLength!(qnet::QuartetNetwork) - if qnet.which == 1 - ind_3e = findfirst(n -> length(n.edge) == 3, qnet.node) - if isnothing(ind_3e) - printEdges(qnet) - printNodes(qnet) - error("not found internal node in qnet with 3 edges") - end - node = qnet.node[ind_3e] - ind_3eo = findfirst(n -> (size(n.edge,1) == 3 && n !== node), qnet.node) - if isnothing(ind_3eo) - println("first node found with 3 edges $(node.number)") - printEdges(qnet) - printNodes(qnet) - error("not found another internal node in qnet with 3 edges") - end - node2 = qnet.node[ind_3eo] - for e in node.edge - deleteIntLeafWhile!(qnet,e,node,true) - end - for e in node2.edge - deleteIntLeafWhile!(qnet,e,node2,true) - end - edge = nothing - for e in node.edge - if(!getOtherNode(e,node).leaf) - edge = e - end - end - !isa(edge,Nothing) || error("cannot find internal edge attached to node $(node.number) in qnet") - isEqual(getOtherNode(edge,node),node2) || error("strange internal edge $(edge.number) found in qnet, should have as nodes $(node.number), $(node2.number)") - qnet.t1 = edge.length - end -end - -# function to eliminate hybridizations in a quartet network -# first step to later calculate expCF -# input: quartet network -# fixit: need to add a loop, eliminate type1 until there are none, and then identify again -function eliminateHybridization!(qnet::QuartetNetwork) - qnet.which != -1 || error("qnet which has to be updated by now to 1 or 2, and it is $(qnet.which)") - if(qnet.numHybrids == 1) - eliminateHybridization!(qnet,qnet.hybrid[1]) - elseif(qnet.numHybrids > 1) - #eliminate in order: first type1 only - DEBUGC && @debug "starting eliminateHyb for more than one hybrid with types $([n.typeHyb for n in qnet.hybrid])" - while(qnet.numHybrids > 0 && any([n.typeHyb == 1 for n in qnet.hybrid])) - hybrids = copy(qnet.hybrid) - for n in hybrids - if(n.typeHyb == 1) #only delete type 1 hybridizations (non identifiable ones) - !isa(n.prev,Nothing) || error("hybrid node $(n.number) is type 1 hybridization, prev should be automatically set") - eliminateHybridization!(qnet,n) - end - end - qnet.typeHyb = Int[] - if(qnet.numHybrids > 0) - DEBUGC && @debug "need to identify hybridizations again after deleting type 1 hybridizations" - identifyQuartet!(qnet) - end - end - DEBUGC && @debug "now types are $([n.typeHyb for n in qnet.hybrid])" - hybrids = copy(qnet.hybrid) - for n in hybrids - eliminateHybridization!(qnet,n) - end - end - if(qnet.which == 1) - internalLength!(qnet) - end -end - -# ------------------------- update qnet.formula - -# function to identify to which of the 4 leaves -# two taxa correspond. this is to identify later -# if the two taxa correspond to major/minor CF -# input: qnet, taxon1,taxon2 -# returns leaf for taxon1, leaf for taxon2 (i.e. 12) -# warning: assumes that the numbers for the taxon in the output.csv table are the names -function whichLeaves(qnet::QuartetNetwork, taxon1::String, taxon2::String, leaf1::Node, leaf2::Node, leaf3::Node, leaf4::Node) - # danger: this quartet code assumes a particular correspondance between net.names and [n.name for n in net.node] - if(taxon1 == qnet.names[leaf1.number]) - if(taxon2 == qnet.names[leaf2.number]) - return 1,2 - elseif(taxon2 == qnet.names[leaf3.number]) - return 1,3 - elseif(taxon2 == qnet.names[leaf4.number]) - return 1,4 - else - error("taxon2 $(taxon2) is not one of the three remaining leaves: $(leaf2.number), $(leaf3.number), $(leaf4.number)") - end - elseif(taxon1 == qnet.names[leaf2.number]) - if(taxon2 == qnet.names[leaf1.number]) - return 2,1 - elseif(taxon2 == qnet.names[leaf3.number]) - return 2,3 - elseif(taxon2 == qnet.names[leaf4.number]) - return 2,4 - else - error("taxon2 $(taxon2) is not one of the three remaining leaves: $(leaf1.number), $(leaf3.number), $(leaf4.number)") - end - elseif(taxon1 == qnet.names[leaf3.number]) - if(taxon2 == qnet.names[leaf1.number]) - return 3,1 - elseif(taxon2 == qnet.names[leaf2.number]) - return 3,2 - elseif(taxon2 == qnet.names[leaf4.number]) - return 3,4 - else - error("taxon2 $(taxon2) is not one of the three remaining leaves: $(leaf2.number), $(leaf1.number), $(leaf4.number)") - end - elseif(taxon1 == qnet.names[leaf4.number]) - if(taxon2 == qnet.names[leaf2.number]) - return 4,2 - elseif(taxon2 == qnet.names[leaf3.number]) - return 4,3 - elseif(taxon2 == qnet.names[leaf1.number]) - return 4,1 - else - error("taxon2 $(taxon2) is not one of the three remaining leaves: $(leaf2.number), $(leaf3.number), $(leaf4.number)") - end - else - error("taxon1: $(taxon1) is not one of the 4 leaves in quartet: $(leaf1.number), $(leaf2.number), $(leaf3.number), $(leaf4.number)") - end -end - -# function to update the attribute split in qnet -# qnet.leaf is a vector [x,y,z,w] and qnet.split is a vector -# [1,1,2,2] that says in which side of the split is each leaf -# warning: it needs to be run after eliminating hybridization and uniting -# internal edge -function updateSplit!(qnet::QuartetNetwork) - if(qnet.which == 1) - if(qnet.split == [-1,-1,-1,-1]) - qnet.split = [2,2,2,2] - middle = qnet.node[findfirst(n -> size(n.edge,1) == 3, qnet.node)] - leaf1 = middle.edge[findfirst(e -> getOtherNode(e,middle).leaf, middle.edge)] - leaf2 = middle.edge[findfirst(e -> getOtherNode(e,middle).leaf && !isEqual(leaf1,e), middle.edge)] - leaf1 = getOtherNode(leaf1,middle) #leaf1 was edge, now it is node - leaf2 = getOtherNode(leaf2,middle) - ind1 = getIndex(leaf1,qnet.leaf) - ind2 = getIndex(leaf2,qnet.leaf) - qnet.split[ind1] = 1 - qnet.split[ind2] = 1 - end - elseif(qnet.which == -1) - error("cannot update split in quartet network if it has not been identified, and eliminated hybridizations") - end -end - -# function to know which formula (minor/major) to compute -# for qnet.expCF[1,2,3] depending on the order of taxa in -# qnet.quartet -# warning: needs qnet.split updated already -function updateFormula!(qnet::QuartetNetwork) - if(qnet.which == 1) - if(qnet.formula == [-1,-1,-1]) - qnet.split != [-1,-1,-1,-1] || error("cannot update qnet.formula if qnet.split is not updated: $(qnet.split)") - qnet.formula = [2,2,2] - for i in 2:4 - size(qnet.leaf,1) == 4 || error("strange quartet with $(size(qnet.leaf,1)) leaves instead of 4") - tx1,tx2 = whichLeaves(qnet,qnet.quartetTaxon[1],qnet.quartetTaxon[i], qnet.leaf[1], qnet.leaf[2], qnet.leaf[3], qnet.leaf[4]) # index of leaf in qnet.leaf - if(qnet.split[tx1] == qnet.split[tx2]) - qnet.formula[i-1] = 1 - break - end - end - end - elseif(qnet.which != 2) - error("qnet.which should be updated already to 1 or 2, and it is $(qnet.which)") - end -end - - -# --------------- calculate exp CF ---------------------- - - -# function to calculate expCF for a quartet network -# warning: needs qnet.formula and qnet.t1 already updated -function calculateExpCF!(qnet::QuartetNetwork) - if(qnet.which == 1) - if(qnet.formula != [-1,-1,-1] && qnet.t1 != -1) - for i in 1:3 - qnet.expCF[i] = qnet.formula[i] == 1 ? 1-2/3*exp(-qnet.t1) : 1/3*exp(-qnet.t1) - end - else - error("quartet network needs to have updated formula and t1 before computing the expCF") - end - elseif(qnet.which == 2) - if(qnet.numHybrids == 1) - if(qnet.hybrid[1].typeHyb == 5) - quartetType5!(qnet,qnet.hybrid[1]) - else - error("strange quartet network type $(qnet.which) with one hybrid node $(qnet.hybrid[1].number) but it is not type 5, it is type $(qnet.hybrid[1].typeHyb)") - end - else - error("quartet network with type $(qnet.which) but with $(qnet.numHybrids) hybrid nodes. all hybridizations type 1 (not identifiable) have been eliminated already, so there should only be one hybrid.") - end - end -end - -# function to compute all the process of calculating the expCF -# for a given qnet -function calculateExpCFAll!(qnet::QuartetNetwork) - identifyQuartet!(qnet) - eliminateHybridization!(qnet) - updateSplit!(qnet) - updateFormula!(qnet) - calculateExpCF!(qnet) -end - -# function to calculate expCF for all the quartets in data -# after extractQuartet(net,data) that updates quartet.qnet -# warning: only updates expCF for quartet.changed=true -function calculateExpCFAll!(data::DataCF) - !all((q->(q.qnet.numTaxa != 0)), data.quartet) ? error("qnet in quartets on data are not correctly updated with extractQuartet") : nothing - #@warn "assume the numbers for the taxon read from the observed CF table match the numbers given to the taxon when creating the object network" - for q in data.quartet - if(q.qnet.changed) - qnet = deepcopy(q.qnet); - calculateExpCFAll!(qnet); - q.qnet.expCF[:] = qnet.expCF - end - end -end - - -# function to calculate expCF for all the quartets in data -# after extractQuartet(net,data) that updates quartet.qnet -# first updates the edge lengths according to x -# warning: assumes qnet.indexht is updated already -# warning: only updates expCF for quartet.qnet.changed=true -function calculateExpCFAll!(data::DataCF, x::Vector{Float64},net::HybridNetwork) - !all((q->(q.qnet.numTaxa != 0)), data.quartet) ? error("qnet in quartets on data are not correctly updated with extractQuartet") : nothing - #println("calculateExpCFAll in x: $(x) with net.ht $(net.ht)") - for q in data.quartet - update!(q.qnet,x,net) - if(q.qnet.changed) - #println("enters to recalculate expCF for some quartet") - qnet = deepcopy(q.qnet); - calculateExpCFAll!(qnet); - q.qnet.expCF[:] = qnet.expCF - end - end -end - -# function to simply calculate the pseudolik of a given network -""" -`topologyQPseudolik!(net::HybridNetwork, d::DataCF)` - -Calculate the quartet pseudo-deviance of a given network/tree for -DataCF `d`. This is the negative log pseudo-likelihood, -up to an additive constant, such that a perfect fit corresponds to a deviance of 0.0. - -Be careful if the net object does -not have all internal branch lengths specified because then the -pseudolikelihood will be meaningless. - -The loglik attribute of the network is undated, and `d` is updated with the expected -concordance factors under the input network. -""" -function topologyQPseudolik!(net0::HybridNetwork,d::DataCF; verbose=false::Bool) - for ed in net0.edge - !ed.hybrid || (ed.gamma >= 0.0) || - error("hybrid edge has missing γ value. Cannot compute quartet pseudo-likelihood.\nTry `topologyMaxQPseudolik!` instead, to estimate these γ's.") - end - missingBL = any([e.length < 0.0 for e in net0.edge]) # at least one BL was missing - net = readTopologyUpdate(writeTopologyLevel1(net0)) # update level-1 attributes. Changes <0 BL into 1.0 - if(!isempty(d.repSpecies)) - expandLeaves!(d.repSpecies, net) - net = readTopologyLevel1(writeTopologyLevel1(net)) # dirty fix to multiple alleles problem with expandLeaves - end - missingBL && any([(e.length == 1.0 && e.istIdentifiable) for e in net.edge]) && - @warn "identifiable edges lengths were originally missing, so assigned default value of 1.0" - try - checkNet(net) - catch - error("starting topology not a level 1 network") - end - extractQuartet!(net,d) # quartets are all updated: hasEdge, expCF, indexht - all((q->(q.qnet.numTaxa != 0)), d.quartet) || error("qnet in quartets on data are not correctly updated with extractQuartet") - for q in d.quartet - if verbose println("computing expCF for quartet $(q.taxon)") # to stdout - else @debug "computing expCF for quartet $(q.taxon)"; end # to logger if debug turned on by user - qnet = deepcopy(q.qnet); - calculateExpCFAll!(qnet); - q.qnet.expCF[:] = qnet.expCF - if verbose println("$(qnet.expCF)") # to stdout - else @debug "$(qnet.expCF)"; end # to logger - end - val = logPseudoLik(d) - if verbose println("$the value of pseudolikelihood is $(val)") # to stdout - else @debug "$the value of pseudolikelihood is $(val)"; end # to logger - net0.loglik = val - return val -end - - -# ---------------------------- Pseudolik for a quartet ------------------------- - -# function to calculate the log pseudolikelihood function for a single -# quartet -# sum_i=1,2,3 (obsCF_i)*log(expCF_i/obsCF_i) -# warning: assumes that quartet.qnet is already updated with extractQuartet and -# calculateExpCF -function logPseudoLik(quartet::Quartet) - sum(quartet.qnet.expCF) != 0.0 || error("expCF not updated for quartet $(quartet.number)") - #@debug "quartet= $(quartet.taxon), obsCF = $(quartet.obsCF), expCF = $(quartet.qnet.expCF)" - suma = 0 - for i in 1:3 - if(quartet.qnet.expCF[i] < 0) - @debug "found expCF negative $(quartet.qnet.expCF[i]), will set loglik=-1.e15" - suma += -1.e15 - else - suma += quartet.obsCF[i] == 0 ? 0.0 : 100*quartet.obsCF[i]*log(quartet.qnet.expCF[i]/quartet.obsCF[i]) - # WARNING: 100 should be replaced by -2*ngenes to get the deviance. - # below: negative sign used below in logPseudoLik() when summing up across 4-taxon sets - end - end - ## to account for missing data: - ## if(quartet.ngenes > 0) - ## suma = quartet.ngenes*suma - ## end - quartet.logPseudoLik = suma - return suma -end - -# function to calculate the -log pseudolikelihood function for array of -# quartets -# sum_q [sum_i=1,2,3 (obsCF_i)*log(expCF_i)] -# warning: assumes that quartet.qnet is already updated with extractQuartet and -# calculateExpCF for all quartets -function logPseudoLik(quartet::Array{Quartet,1}) - suma = 0 - for q in quartet - suma += logPseudoLik(q) - end - return -suma -end - -logPseudoLik(d::DataCF) = logPseudoLik(d.quartet) - diff --git a/src/readData.jl b/src/readData.jl deleted file mode 100644 index 3c51151ab..000000000 --- a/src/readData.jl +++ /dev/null @@ -1,1339 +0,0 @@ -# function to write a csv table from the expCF of an -# array of quartets -# warning: does not check if the expCF have been calculated -function writeExpCF(quartets::Array{Quartet,1}) - df = DataFrames.DataFrame(t1=String[],t2=String[],t3=String[],t4=String[], - CF12_34=Float64[],CF13_24=Float64[],CF14_23=Float64[]) - for q in quartets - length(q.taxon) == 4 || error("quartet $(q.number) does not have 4 taxa") - length(q.qnet.expCF) == 3 || error("quartet $(q.number) does have qnet with 3 expCF") - push!(df, [q.taxon[1],q.taxon[2],q.taxon[3],q.taxon[4],q.qnet.expCF[1],q.qnet.expCF[2],q.qnet.expCF[3]]) - end - return df -end - -writeExpCF(d::DataCF) = writeExpCF(d.quartet) - -""" - writeTableCF(vector of Quartet objects) - writeTableCF(DataCF) - -Build a DataFrame containing observed quartet concordance factors, -with columns named: -- `t1`, `t2`, `t3`, `t4` for the four taxon names in each quartet -- `CF12_34`, `CF13_24`, `CF14_23` for the 3 quartets of a given four-taxon set -- `ngenes` if this information is available for some quartets -""" -function writeTableCF(quartets::Array{Quartet,1}) - df = DataFrames.DataFrame(t1=String[],t2=String[],t3=String[],t4=String[], - CF12_34=Float64[],CF13_24=Float64[],CF14_23=Float64[], - ngenes=Union{Missing, Float64}[]) - for q in quartets - length(q.taxon) == 4 || error("quartet $(q.number) does not have 4 taxa") - length(q.obsCF) == 3 || error("quartet $(q.number) does have qnet with 3 expCF") - push!(df, [q.taxon[1],q.taxon[2],q.taxon[3],q.taxon[4],q.obsCF[1],q.obsCF[2],q.obsCF[3], - (q.ngenes==-1.0 ? missing : q.ngenes)]) - end - if all(ismissing, df[!,:ngenes]) - select!(df, Not(:ngenes)) - end - return df -end - -writeTableCF(d::DataCF) = writeTableCF(d.quartet) - - -""" - writeTableCF(quartetlist::Vector{QuartetT} [, taxonnames]; colnames) - -Convert a vector of [`QuartetT`](@ref) objects to a data frame, with 1 row for -each four-taxon set in the list. Each four-taxon set contains quartet data of -some type `T`, which determines the number of columns in the data frame. -This data type `T` should be a vector of length 3 or 4, or a 3×n matrix. - -In the output data frame, the columns are, in this order: -- `qind`: contains the quartet's `number` -- `t1, t2, t3, t4`: contain the quartet's `taxonnumber`s if no `taxonnames` - are given, or the taxon names otherwise. The name of taxon number `i` is - taken to be `taxonnames[i]`. -- 3 columns for each column in the quartet's `data`. - The first 3 columns are named `CF12_34, CF13_24, CF14_23`. The next - columns are named `V2_12_34, V2_13_24, V2_14_23` and contain the data in - the second column of the quartet's data matrix. And so on. - For the data frame to have non-default column names, provide the desired - 3, 4, or 3×n names as a vector via the optional argument `colnames`. -""" -function writeTableCF(quartets::Vector{QuartetT{T}}, - taxa::AbstractVector{<:AbstractString}=Vector{String}(); - colnames=nothing) where - T <: Union{StaticVector{3}, StaticVector{4}, StaticMatrix{3,N} where N} - V = eltype(T) - colnames_data = quartetdata_columnnames(T) - if !isnothing(colnames) - if length(colnames) == length(colnames_data) - colnames_data = colnames - else - @error "'colnames' needs to be of length $(length(colnames_data)).\nwill use default column names." - end - end - translate = !isempty(taxa) - tnT = (translate ? eltype(taxa) : Int) # Type for taxon names - if translate - taxstring = x -> taxa[x] # will error if a taxonnumber > length(taxa): okay - else - taxstring = x -> x - end - df = DataFrames.DataFrame(qind=Int[], t1=tnT[],t2=tnT[],t3=tnT[],t4=tnT[]) - for cn in colnames_data - df[:,Symbol(cn)] = V[] - end - for q in quartets - push!(df, (q.number, taxstring.(q.taxonnumber)..., q.data...) ) - end - return df -end - -""" - quartetdata_columnnames(T) where T <: StaticArray - -Vector of column names to hold the quartet data of type `T` in a data frame. -If T is a length-3 vector type, they are "CF12_34","CF13_24","CF14_23". -If T is a length-4 vector type, the 4th name is "ngenes". -If T is a 3×n matrix type, the output vector contains 3×n names, -3 for each of "CF", "V2_", "V3_", ... "Vn_". - -Used by [`writeTableCF`](@ref) to build a data frame from a vector of -[`QuartetT`](@ref) objects. -""" -function quartetdata_columnnames(::Type{T}) where T <: StaticArray{Tuple{3},S,1} where S - return ["CF12_34","CF13_24","CF14_23"] -end -function quartetdata_columnnames(::Type{T}) where T <: StaticArray{Tuple{4},S,1} where S - return ["CF12_34","CF13_24","CF14_23","ngenes"] -end -function quartetdata_columnnames(::Type{T}) where # for a 3×N matrix: N names - T <: StaticArray{Tuple{3,N},S,2} where {N,S} - N > 0 || error("expected at least 1 column of data") - colnames_q = ["12_34","13_24","14_23"] - colnames = "CF" .* colnames_q - for i in 2:N append!(colnames, "V$(i)_" .* colnames_q); end - return colnames -end - - -""" - readTableCF(file) - readTableCF(data frame) - readTableCF!(data frame) - -Read a file or DataFrame object containing a table of concordance factors (CF), -with one row per 4-taxon set. The first 4 columns are assumed to give the labels -of the 4 taxa in each set (tx1, tx2, tx3, tx4). -Columns containing the CFs are assumed to be named -`CF12_34`, `CF13_24` and `CF14_23`; -or `CF12.34`, `CF13.24` and `CF14.23`; -or else are assumed to be columns 5,6,7. -If present, a column named 'ngenes' will be used to get the number of loci -used to estimate the CFs for each 4-taxon set. - -Output: [`DataCF`](@ref) object - -Optional arguments: - -- summaryfile: if specified, a summary file will be created with that name. -- delim (for the first form only): to specify how columns are delimited, - with single quotes: delim=';'. Default is a `csv` file, i.e. `delim=','`. -- `mergerows`: false by default. When true, will attempt to merge multiple rows - corresponding to the same four-taxon set (by averaging their quartet CFs) even - if none of the species is repeated within any row (that is, in any set of 4 taxa) - -The last version modifies the input data frame, if species are represented by multiple alleles -for instance (see [`readTableCF!`](@ref)(data frame, columns)). -""" -function readTableCF(file::AbstractString; delim=','::Char, summaryfile=""::AbstractString, kwargs...) - df = DataFrame(CSV.File(file, delim=delim); copycols=false) - readTableCF!(df; summaryfile=summaryfile, kwargs...) -end - -function readTableCF(df0::DataFrames.DataFrame; summaryfile=""::AbstractString, kwargs...) - df = deepcopy(df0) - readTableCF!(df; summaryfile=summaryfile, kwargs...) -end - -function readTableCF!(df::DataFrames.DataFrame; summaryfile=""::AbstractString, kwargs...) - @debug "assume the numbers for the taxon read from the observed CF table match the numbers given to the taxon when creating the object network" - taxoncolnames = [[:t1, :tx1, :tax1, :taxon1], [:t2, :tx2, :tax2, :taxon2], - [:t3, :tx3, :tax3, :taxon3], [:t4, :tx4, :tax4, :taxon4] ] - taxoncol = [findfirst(x-> x ∈ taxoncolnames[1], DataFrames.propertynames(df)), - findfirst(x-> x ∈ taxoncolnames[2], DataFrames.propertynames(df)), - findfirst(x-> x ∈ taxoncolnames[3], DataFrames.propertynames(df)), - findfirst(x-> x ∈ taxoncolnames[4], DataFrames.propertynames(df))] - alternativecolnames = [ # obsCF12 is as exported by fittedQuartetCF() - [:CF12_34, Symbol("CF12.34"), :obsCF12, :CF1234], - [:CF13_24, Symbol("CF13.24"), :obsCF13, :CF1324], - [:CF14_23, Symbol("CF14.23"), :obsCF14, :CF1423] - ] - obsCFcol = [findfirst(x-> x ∈ alternativecolnames[1], DataFrames.propertynames(df)), - findfirst(x-> x ∈ alternativecolnames[2], DataFrames.propertynames(df)), - findfirst(x-> x ∈ alternativecolnames[3], DataFrames.propertynames(df))] - ngenecol = findfirst(isequal(:ngenes), DataFrames.propertynames(df)) - withngenes = ngenecol !== nothing - nothing in taxoncol && error("columns for taxon names were not found") - nothing in obsCFcol && error( - """Could not identify columns with quartet concordance factors (qCFs). - Was expecting CF12_34, CF13_24 and CF14_23 for the columns with CF values, - or CF12.34 or obsCF12, etc.""") - columns = [taxoncol; obsCFcol] - if withngenes push!(columns, ngenecol) end - - d = readTableCF!(df, columns; kwargs...) - - if withngenes # && d.numTrees == -1 - m1 = minimum([q.ngenes for q in d.quartet]) - m2 = maximum([q.ngenes for q in d.quartet]) - if m1 typemax(Int), i.e. if 121,978+ taxa with Int64, 478+ taxa with Int32 - end - if(writeFile) - close(f) - end - return vquartet -end - -allQuartets(numTaxa::Integer, writeFile::Bool) = allQuartets(1:numTaxa, writeFile) - -# function to list num randomly selected quartets for a vector of all quartets -# return a vector of Quartet randomly chosen (and a file if writeFile=true) -function randQuartets(allquartets::Vector{Quartet},num::Integer, writeFile::Bool) - randquartets = Quartet[] - n = length(allquartets) - if num == 0 - num = Integer(floor(0.1*n)) - end - num <= n || error("you cannot choose a sample of $(num) quartets when there are $(n) in total") - indx = [ones(Bool,num); zeros(Bool,n-num)] - indx = indx[sortperm(randn(n))] - if writeFile - randName = "rand$(num)Quartets.txt" - println("list of randomly selected quartets in file $(randName)") - out = open(randName,"w") - end - for i in 1:n - if indx[i] - if writeFile - q = allquartets[i].taxon - write(out,"$(q[1]),$(q[2]),$(q[3]),$(q[4])\n") - end - push!(randquartets,allquartets[i]) - end - end - if writeFile - close(out) - end - return randquartets -end - -# function that will not use randQuartets(list of quartets,...) -# this function uses whichQuartet to avoid making the list of all quartets -# fixit: writeFile is not used. remove the option? -function randQuartets(taxon::Union{Vector{<:AbstractString},Vector{Int}},num::Integer, writeFile::Bool) - randquartets = Quartet[] - n = length(taxon) - ntotal = binom(n,4) - num <= ntotal || error("you cannot choose a sample of $(num) quartets when there are $(ntotal) in total") - # indx = [rep(1,num);rep(0,ntotal-num)] # requires much more memory than necessary: - # indx = indx[sortperm(randn(ntotal))] # several arrays of size ntotal !! - # rq = findall(x -> x==1, indx) - rq = sample(1:ntotal, num, replace=false, ordered=true) - randName = "rand$(num)Quartets.txt" - println("list of randomly selected quartets in file $(randName)") - out = open(randName,"w") - i = 1 - for q in rq - qind = whichQuartet(n,q) # vector of int - quartet = createQuartet(taxon,qind,i) - write(out,"$(quartet.taxon[1]), $(quartet.taxon[2]), $(quartet.taxon[3]), $(quartet.taxon[4])\n") - push!(randquartets,quartet) - i += 1 - end - close(out) - return randquartets -end - -randQuartets(numTaxa::Integer,num::Integer, writeFile::Bool) = randQuartets(1:numTaxa,num, writeFile) - -# function to read list of quartets from a file -# and create Quartet type objects -function readListQuartets(file::AbstractString) - try - f = open(file) - catch - error("could not open file $(file)") - end - f = open(file) - quartets = Quartet[]; - i = 1 - for line in eachline(f) - l = split(line,",") - length(l) == 4 || error("quartet with $(length(l)) elements, should be 4: $(line)") - push!(quartets,Quartet(i,string(l[1]),string(l[2]),string(l[3]),chomp(string(l[4])),[1.0,0.0,0.0])) - i += 1 - end - return quartets -end - -""" - sameTaxa(Quartet, HybridNetwork) - -Return `true` if all taxa in the quartet are represented in the network, -`false` if one or more taxa in the quartet does not appear in the network. - -warning: the name can cause confusion. A more appropriate name might be -"in", or "taxain", or "taxonsubset", or etc. -""" -function sameTaxa(q::Quartet, t::HybridNetwork) - for name in q.taxon - in(name,t.names) || return false - end - return true -end - -""" - taxadiff(Vector{Quartet}, network; multiplealleles=true) - taxadiff(DataCF, network; multiplealleles=true) - -Return 2 vectors: - -- taxa in at least 1 of the quartets but not in the network, and -- taxa in the network but in none of the quartets. - -When `multiplealleles` is true, the taxon names that end with "__2" -are ignored in the quartets: they are not expected to appear in the -networks that users give as input, or get as output. -""" -function taxadiff(quartets::Vector{Quartet}, t::HybridNetwork; - multiplealleles=true::Bool) - tq = tipLabels(quartets) - secondallele = occursin.(Ref(r"__2$"), tq) - for i in length(secondallele):-1:1 - secondallele[i] || continue - basetax = match(r"(.*)__2$", tq[i]).captures[1] - # if tq[i] = "mouse__2" for instance, then basetax = "mouse" - if basetax in tq # some other taxon is "mouse" - deleteat!(tq, i) # delete "mouse__2" from tq IF "mouse" is present - end - end - tn = tipLabels(t) - return (setdiff(tq,tn), setdiff(tn,tq)) -end - -taxadiff(d::DataCF, t::HybridNetwork; multiplealleles=true::Bool) = - taxadiff(d.quartet, t; multiplealleles=multiplealleles) - - -# extract & sort the union of taxa of list of gene trees -function unionTaxa(trees::Vector{HybridNetwork}) - taxa = reduce(union, tipLabels(t) for t in trees) - return sort_stringasinteger!(taxa) -end - -""" - sort_stringasinteger!(taxa) - -Sort a vector of strings `taxa`, numerically if -elements can be parsed as an integer, alphabetically otherwise. -""" -function sort_stringasinteger!(taxa) - sortby = x->parse(Int,x) - try - parse.(Int,taxa) - catch - sortby = identity - end - sort!(taxa, by=sortby) - return taxa -end - -# extract & sort the union of taxa of list of quartets -function unionTaxa(quartets::Vector{Quartet}) - taxa = reduce(union, q.taxon for q in quartets) - return sort_stringasinteger!(taxa) -end - -unionTaxaTree(file::AbstractString) = unionTaxa(readInputTrees(file)) - -tipLabels(t::Vector{HybridNetwork}) = unionTaxa(t) -tipLabels(q::Vector{Quartet}) = unionTaxa(q) -tipLabels(d::DataCF) = unionTaxa(d.quartet) - -""" - calculateObsCFAll!(DataCF, taxa::Union{Vector{<:AbstractString}, Vector{Int}}) - -Calculate observed concordance factors: -update the `.quartet[i].obsCF` values of the `DataCF` object based on its .tree vector. - - calculateObsCFAll!(vector of quartets, vector of trees, taxa) - -Calculate observed concordance factors: -update the `.obsCF` values of the quartets, based on the trees, and returns a new `DataCF` object -with these updated quartets and trees. - - calculateObsCFAll_noDataCF!(vector of quartets, vector of trees, taxa) - -update the `.obsCF` values of the quartets based on the trees, but returns nothing. - -Warning: all these functions need input trees (without any reticulations: h=0). - -See also: [`countquartetsintrees`](@ref), which uses a faster algorithm, -processing each input tree only once. -`calculateObsCFAll_noDataCF!` processes each input tree `# quartet` times. -""" -function calculateObsCFAll!(dat::DataCF, taxa::Union{Vector{<:AbstractString}, Vector{Int}}) - calculateObsCFAll_noDataCF!(dat.quartet, dat.tree, taxa) -end - -function calculateObsCFAll!(quartets::Vector{Quartet}, trees::Vector{HybridNetwork}, taxa::Union{Vector{<:AbstractString}, Vector{Int}}) - calculateObsCFAll_noDataCF!(quartets, trees, taxa) - d = DataCF(quartets,trees) - return d -end - -function calculateObsCFAll_noDataCF!(quartets::Vector{Quartet}, trees::Vector{HybridNetwork}, taxa::Union{Vector{<:AbstractString}, Vector{Int}}) - println("calculating obsCF from $(length(trees)) gene trees and for $(length(quartets)) quartets") - index = 1 - totalq = length(quartets) - println("Reading in quartets...") - r = round(1/totalq, digits=2) - numq = (r > 0.02 ? totalq : 50) - print("0+") - for i in 1:numq - print("-") - end - print("+100%") - println(" ") - print(" ") - for q in quartets - if round(index/totalq, digits=2) > 0.02 - print("*") - index = 1 - end - suma = 0 - sum12 = 0 - sum13 = 0 - sum14 = 0 - for t in trees - isTree(t) || error("gene tree found in file that is a network $(writeTopology(t))") - if sameTaxa(q,t) - M = tree2Matrix(t,taxa) #fixit: way to reuse M? length(t.edge) will be different across trees - res = extractQuartetTree(q,M,taxa) - @debug "res is $(res)" - if(res == 1) - sum12 += 1 - elseif(res == 2) - sum13 += 1 - elseif(res == 3) - sum14 += 1 - end - suma += (res == 0) ? 0 : 1 - end - end - q.obsCF = [sum12/suma, sum13/suma, sum14/suma] - q.ngenes = suma - index += 1 - end - println(" ") - return nothing -end - -""" - countquartetsintrees(trees [, taxonmap]; which=:all, weight_byallele=true) - -Calculate the quartet concordance factors (CF) observed in the `trees` vector. -If present, `taxonmap` should be a dictionary that maps each allele name to it's species name. -To save to a file, first convert to a data frame using [`writeTableCF`](@ref). -When `which=:all`, quartet CFs are calculated for all 4-taxon sets. -(Other options are not implemented yet.) - -The algorithm runs in O(mn⁴) where m is the number of trees and n is the number -of tips in the trees. - -CFs are calculated at the species level only, that is, considering 4-taxon sets -made of 4 distinct species, even if the gene trees may have multiple alleles -from the same species. For 4 distinct species `a,b,c,d`, all alleles from -each species (`a` etc.) will be considered to calculate the quartet CF. - -By default, each gene has a weight of 1. So if there are `n_a` alleles from `a`, -`n_b` alleles from `b` etc. in a given gene, then each set of 4 alleles has a -weight of `1/(n_a n_b b_c n_c)` in the calculation of the CF for `a,b,c,d`. -With option `weight_byallele=true`, then each set of 4 alleles is given a -weight of 1 instead. This inflates the total number of sets used to calculate -the quartet CFs (to something larger than the number of genes). This may also -affect the CF values if the number of alleles varies across genes: genes with -more alleles will be given more weight. - -# examples -```jldoctest -julia> tree1 = readTopology("(E,(A,B),(C,D),O);"); tree2 = readTopology("(((A,B),(C,D)),E);"); - -julia> q,t = countquartetsintrees([tree1, tree2]); -Reading in trees, looking at 15 quartets in each... -0+--+100% - ** - -julia> t # taxon order: t[i] = name of taxon number i -6-element Vector{String}: - "A" - "B" - "C" - "D" - "E" - "O" - -julia> length(q) # 15 four-taxon sets on 6 taxa -15 - -julia> q[1] # both trees agree on AB|CD: resolution 1 -4-taxon set number 1; taxon numbers: 1,2,3,4 -data: [1.0, 0.0, 0.0, 2.0] - -julia> q[8] # tree 2 is missing O (taxon 6), tree 1 wants resolution 3: AO|CD -4-taxon set number 8; taxon numbers: 1,3,4,6 -data: [0.0, 0.0, 1.0, 1.0] - -julia> q[11] # tree 1 has ACEO unresolved, and tree 2 is missing O: no data for this quartet -4-taxon set number 11; taxon numbers: 1,3,5,6 -data: [0.0, 0.0, 0.0, 0.0] - -julia> tree1 = readTopology("(E,(a1,B),(a2,D),O);"); tree2 = readTopology("(((a1,a2),(B,D)),E);"); - -julia> q,t = countquartetsintrees([tree1, tree2], Dict("a1"=>"A", "a2"=>"A"); showprogressbar=false); - -julia> t -5-element Vector{String}: - "A" - "B" - "D" - "E" - "O" - -julia> q[1] # tree 1 has discordance: a1B|DE and a2D|BE. tree 2 has AE|BD for both alleles of A -4-taxon set number 1; taxon numbers: 1,2,3,4 -data: [0.25, 0.25, 0.5, 2.0] - -julia> q[3] # tree 2 is missing O (taxon 5), and a2 is unresolved in tree 1. There's only a1B|EO -4-taxon set number 3; taxon numbers: 1,2,4,5 -data: [1.0, 0.0, 0.0, 0.5] - -julia> df = writeTableCF(q,t); # to get a DataFrame that can be saved to a file later - -julia> show(df, allcols=true) -5×9 DataFrame - Row │ qind t1 t2 t3 t4 CF12_34 CF13_24 CF14_23 ngenes - │ Int64 String String String String Float64 Float64 Float64 Float64 -─────┼─────────────────────────────────────────────────────────────────────────── - 1 │ 1 A B D E 0.25 0.25 0.5 2.0 - 2 │ 2 A B D O 0.5 0.5 0.0 1.0 - 3 │ 3 A B E O 1.0 0.0 0.0 0.5 - 4 │ 4 A D E O 1.0 0.0 0.0 0.5 - 5 │ 5 B D E O 0.0 0.0 0.0 0.0 - -julia> # using CSV; CSV.write(df, "filename.csv"); - -julia> tree2 = readTopology("((A,(B,D)),E);"); - -julia> q,t = countquartetsintrees([tree1, tree2], Dict("a1"=>"A", "a2"=>"A"); weight_byallele=true); -Reading in trees, looking at 5 quartets in each... -0+--+100% - ** - -julia> show(writeTableCF(q,t), allcols=true) -5×9 DataFrame - Row │ qind t1 t2 t3 t4 CF12_34 CF13_24 CF14_23 ngenes - │ Int64 String String String String Float64 Float64 Float64 Float64 -─────┼────────────────────────────────────────────────────────────────────────────── - 1 │ 1 A B D E 0.333333 0.333333 0.333333 3.0 - 2 │ 2 A B D O 0.5 0.5 0.0 2.0 - 3 │ 3 A B E O 1.0 0.0 0.0 1.0 - 4 │ 4 A D E O 1.0 0.0 0.0 1.0 - 5 │ 5 B D E O 0.0 0.0 0.0 0.0 -``` -""" -function countquartetsintrees(tree::Vector{HybridNetwork}, - taxonmap::Dict=Dict{String,String}(); - whichQ::Symbol=:all, weight_byallele::Bool=false, - showprogressbar::Bool=true) - whichQ in [:all, :intrees] || error("whichQ must be either :all or :intrees, but got $whichQ") - if isempty(taxonmap) - taxa = unionTaxa(tree) - else - taxa = sort!(collect(Set(haskey(taxonmap, l.name) ? taxonmap[l.name] : l.name - for t in tree for l in t.leaf))) - end - taxonnumber = Dict(taxa[i] => i for i in eachindex(taxa)) - ntax = length(taxa) - nCk = nchoose1234(ntax) # matrix used to ranks 4-taxon sets - qtype = MVector{4,Float64} # 4 floats: CF12_34, CF13_24, CF14_23, ngenes; initialized at 0.0 - if whichQ == :all - numq = nCk[ntax+1,4] - quartet = Vector{QuartetT{qtype}}(undef, numq) - ts = [1,2,3,4] - for qi in 1:numq - quartet[qi] = QuartetT(qi, SVector{4}(ts), MVector(0.,0.,0.,0.)) - # next: find the 4-taxon set with the next rank, - # faster than using the direct mapping function - ind = findfirst(x -> x>1, diff(ts)) - if ind === nothing ind = 4; end - ts[ind] += 1 - for j in 1:(ind-1) - ts[j] = j - end - end - else - error("whichQ = :intrees not implemented yet") - # fixit: read all the trees, go through each edge, check if the current quartet list covers the edge, if not: add a quartet - end - totalt = length(tree) - if showprogressbar - nstars = (totalt < 50 ? totalt : 50) - ntrees_perstar = (totalt/nstars) - println("Reading in trees, looking at $numq quartets in each...") - print("0+" * "-"^nstars * "+100%\n ") - stars = 0 - nextstar = Integer(ceil(ntrees_perstar)) - end - for i in 1:totalt # number of times each quartet resolution is seen in each tree - countquartetsintrees!(quartet, tree[i], whichQ, weight_byallele, nCk, taxonnumber, taxonmap) - if showprogressbar && i >= nextstar - print("*") - stars += 1 - nextstar = Integer(ceil((stars+1) * ntrees_perstar)) - end - end - showprogressbar && print("\n") - # normalize counts to frequencies & number of genes - for q in quartet - d = q.data - d[4] = d[1]+d[2]+d[3] # number of genes - if d[4] > 0.0 - d[1:3] /= d[4] - end # otherwise: no genes with data on this quartet (missing taxa or polytomy): leave all zeros (NaN if /0) - end - return quartet, taxa -end -function countquartetsintrees!(quartet::Vector{QuartetT{MVector{4,Float64}}}, - tree::HybridNetwork, whichQ::Symbol, weight_byallele::Bool, nCk::Matrix, - taxonnumber::Dict{<:AbstractString,Int}, taxonmap::Dict{<:AbstractString,<:AbstractString}) - tree.numHybrids == 0 || error("input phylogenies must be trees") - # next: reset node & edge numbers so that they can be used as indices: 1,2,3,... - resetNodeNumbers!(tree; checkPreorder=true, type=:postorder) # leaves first & post-order - resetEdgeNumbers!(tree) - # next: build list leaf number -> species ID, using the node name then taxon map - nleaves = length(tree.leaf) - nnodes = length(tree.node) - taxID = Vector{Int}(undef, nleaves) - for n in tree.leaf - taxID[n.number] = haskey(taxonmap, n.name) ? taxonnumber[taxonmap[n.name]] : taxonnumber[n.name] - end - # number of individuals from each species: needed to weigh the quartets at the individual level - # weight of t1,t2,t3,t4: 1/(taxcount[t1]*taxcount[t2]*taxcount[t3]*taxcount[t4]) - taxcount = zeros(Int, length(taxonnumber)) - for ti in taxID taxcount[ti] += 1; end - # next: build data structure to get descendant / ancestor clades - below,above = ladderpartition(tree) # re-checks that node numbers can be used as indices, with leaves first - # below[n][1:2 ]: left & clades below node number n - # above[n][1:end]: grade of clades above node n - for n in (nleaves+1):nnodes # loop through internal nodes indices only - bn = below[n] - an = above[n] - for c1 in 2:length(bn) # c = child clade, loop over all pairs of child clades - for t1 in bn[c1] # pick 1 tip from each child clade - s1 = taxID[t1] - for c2 in 1:(c1-1) - for t2 in bn[c2] - s2 = taxID[t2] - s1 != s2 || continue # skip quartets that have repeated species - t12max = max(t1,t2) - leftweight = 1/(taxcount[s1]*taxcount[s2]) - for p1 in 1:length(an) # p = parent clade - for t3i in 1:length(an[p1]) - t3 = an[p1][t3i] - s3 = taxID[t3] - (s3 != s1 && s3 != s2) || continue - for t4i in 1:(t3i-1) # pick 2 distinct tips from the same parent clade - t4 = an[p1][t4i] - t3 > t12max || t4 > t12max || continue # skip: would be counted twice otherwise - s4 = taxID[t4] - (s4 != s1 && s4 != s2 && s4 != s3) || continue - rank,res = quartetRankResolution(s1, s2, s3, s4, nCk) - weight = ( weight_byallele ? 1.0 : leftweight / (taxcount[s3]*taxcount[s4]) ) - quartet[rank].data[res] += weight - end - for p2 in 1:(p1-1) # distinct parent clade: no risk of counting twice - for t4 in an[p2] - s4 = taxID[t4] - (s4 != s1 && s4 != s2 && s4 != s3) || continue - rank,res = quartetRankResolution(s1, s2, s3, s4, nCk) - weight = ( weight_byallele ? 1.0 : leftweight / (taxcount[s3]*taxcount[s4]) ) - quartet[rank].data[res] += weight - end - end - end - end - end - end - end - end - end -end - -function quartetRankResolution(t1::Int, t2::Int, t3::Int, t4::Int, nCk::Matrix) - # quartet: t1 t2 | t3 t4, but indices have not yet been ordered: t1 t4 # make t3 smallest of t3, t4 - (t3,t4) = (t4,t3) - end - if t1 > t2 # make t1 smallest of t1, t2 - (t1,t2) = (t2,t1) - end - if t1 > t3 # swap t1 with t3, t2 with t4 - makes t1 smallest - (t1,t3) = (t3,t1) - (t2,t4) = (t4,t2) - end - if t2 < t3 # t2 2nd smallest: order t1 < t2 < t3 < t4 - resolution = 1; # 12|34 after ordering indices - rank = quartetrank(t1, t2, t3, t4, nCk) - else # t3 2nd smallest - if t2 < t4 # order t1 < t3 < t2 < t4 - resolution = 2; # 13|24 after ordering - rank = quartetrank(t1, t3, t2, t4, nCk); - else # order t1 < t3 < t4 < t2 - resolution = 3; # 14|23 after ordering - rank = quartetrank(t1, t3, t4, t2, nCk); - end - end - return rank, resolution -end - -""" - readInputData(trees, quartetfile, whichQuartets, numQuartets, writetable, tablename, writeQfile, writesummary) - readInputData(trees, whichQuartets, numQuartets, taxonlist, writetable, tablename, writeQfile, writesummary) - -Read gene trees and calculate the observed quartet concordance factors (CF), -that is, the proportion of genes (and the number of genes) that display each -quartet for a given list of four-taxon sets. - -Input: - -- `trees`: name of a file containing a list of input gene trees, - or vector of trees (`HybridNetwork` objects) - -Optional arguments (defaults): - -- `quartetfile`: name of a file containing a list of quartets, or more precisely, - a list of four-taxon sets -- `whichQuartets` (`:all`): which quartets to sample. - `:all` for all of them, `:rand` for a random sample. -- `numQuartets`: number of quartets in the sample. - default: total number of quartets if `whichQuartets=:all` - and 10% of total if `whichQuartets=:rand` -- `taxonlist` (all in the input gene trees): - If `taxonlist` is used, `whichQuartets` will consist of *all* sets of 4 taxa in the `taxonlist`. -- `writetable` (true): write the table of observed CF? -- `tablename` ("tableCF.txt"): if `writetable` is true, the table of observed CFs is write to file `tablename` -- `writeQfile` (false): write intermediate file with sampled quartets? -- `writesummary` (true): write a summary file? - if so, the summary will go in file "summaryTreesQuartets.txt". - -Uses [`calculateObsCFAll!`](@ref), which implements a slow algorithm. - -See also: -[`countquartetsintrees`](@ref), which uses a much faster algorithm; -[`readTrees2CF`](@ref), which is basically a re-naming of `readInputData`, and -[`readTableCF`](@ref) to read a table of quartet CFs directly. -""" -function readInputData(treefile::AbstractString, quartetfile::AbstractString, whichQ::Symbol, numQ::Integer, writetab::Bool, filename::AbstractString, writeFile::Bool, writeSummary::Bool) - if writetab - if(filename == "none") - filename = "tableCF.txt" # "tableCF$(string(integer(time()/1000))).txt" - end - if (isfile(filename) && filesize(filename) > 0) - error("""file $(filename) already exists and is non-empty. Cannot risk to erase data. - Choose a different CFfile name, use writeTab=false, or read the existing file - with readTableCF(\"$(filename)\")""") - end - end - println("read input trees from file $(treefile)\nand quartetfile $(quartetfile)") - trees = readInputTrees(treefile) - readInputData(trees, quartetfile, whichQ, numQ, writetab, filename, writeFile, writeSummary) -end - -readInputData(treefile::AbstractString, quartetfile::AbstractString, whichQ::Symbol, numQ::Integer, writetab::Bool) = readInputData(treefile, quartetfile, whichQ, numQ, writetab, "none", false, true) -readInputData(treefile::AbstractString, quartetfile::AbstractString, whichQ::Symbol, numQ::Integer) = readInputData(treefile, quartetfile, whichQ, numQ, true, "none", false, true) -readInputData(treefile::AbstractString, quartetfile::AbstractString, writetab::Bool, filename::AbstractString) = readInputData(treefile, quartetfile, :all, 0, writetab, filename, false, true) - -function readInputData(trees::Vector{HybridNetwork}, quartetfile::AbstractString, whichQ::Symbol, numQ::Integer, writetab::Bool, filename::AbstractString, writeFile::Bool, writeSummary::Bool) - if(whichQ == :all) - numQ == 0 || @warn "set numQ=$(numQ) but whichQ is not rand, so all quartets will be used and numQ will be ignored. If you want a specific number of 4-taxon subsets not random, you can input with the quartetfile option" - println("will use all quartets in file $(quartetfile)") - quartets = readListQuartets(quartetfile) - elseif(whichQ == :rand) - if(numQ == 0) - @warn "not specified numQ but whichQ=rand, so 10% of quartets will be sampled" #handled inside randQuartets - else - println("will take a random sample of $(numQ) 4-taxon sets from file $(quartetfile)") - end - allquartets = readListQuartets(quartetfile) - quartets = randQuartets(allquartets,numQ,writeFile) - else - error("unknown symbol for whichQ $(whichQ), should be either all or rand") - end - d = calculateObsCFAll!(quartets,trees, unionTaxa(trees)) - if(writetab) - if(filename == "none") - filename = "tableCF.txt" # "tableCF$(string(integer(time()/1000))).txt" - end - if (isfile(filename) && filesize(filename) > 0) - error("""file $(filename) already exists and is non-empty. Cannot risk to erase data. - Choose a different CFfile name, use writeTab=false, or read the existing file - with readTableCF(\"$(filename)\")""") - end - println("\ntable of obsCF printed to file $(filename)") - df = writeTableCF(d) - CSV.write(filename,df) - end - #descData(d,"summaryTreesQuartets$(string(integer(time()/1000))).txt") - writeSummary && descData(d,"summaryTreesQuartets.txt") - return d -end - - -function readInputData(treefile::AbstractString, whichQ::Symbol=:all, numQ::Integer=0, - taxa::Union{Vector{<:AbstractString}, Vector{Int}}=unionTaxaTree(treefile), - writetab::Bool=true, filename::AbstractString="none", - writeFile::Bool=false, writeSummary::Bool=true) - if writetab - if(filename == "none") - filename = "tableCF.txt" # "tableCF$(string(integer(time()/1000))).txt" - end - if (isfile(filename) && filesize(filename) > 0) - error("""file $(filename) already exists and is non-empty. Cannot risk to erase data. - Choose a different CFfile name, use writeTab=false, or read the existing file - with readTableCF(\"$(filename)\")""") - end - end - println("read input trees from file $(treefile). no quartet file given.") - trees = readInputTrees(treefile) - readInputData(trees, whichQ, numQ, taxa, writetab, filename, writeFile, writeSummary) -end - -readInputData(treefile::AbstractString, whichQ::Symbol, numQ::Integer, writetab::Bool) = readInputData(treefile, whichQ, numQ, unionTaxaTree(treefile), writetab, "none",false, true) -readInputData(treefile::AbstractString, taxa::Union{Vector{<:AbstractString}, Vector{Int}}) = readInputData(treefile, :all, 0, taxa, true, "none",false, true) -# above: the use of unionTaxaTree to set the taxon set -# is not good: need to read the tree file twice: get the taxa, then get the trees -# this inefficiency was fixed in readTrees2CF - -function readInputData(trees::Vector{HybridNetwork}, whichQ::Symbol, numQ::Integer, taxa::Union{Vector{<:AbstractString}, Vector{Int}}, writetab::Bool, filename::AbstractString, writeFile::Bool, writeSummary::Bool) - if(whichQ == :all) - numQ == 0 || @warn "set numQ=$(numQ) but whichQ=all, so all quartets will be used and numQ will be ignored. If you want a specific number of 4-taxon subsets not random, you can input with the quartetfile option" - quartets = allQuartets(taxa,writeFile) - println("will use all quartets on $(length(taxa)) taxa") - elseif(whichQ == :rand) - if(numQ == 0) - @warn "not specified numQ with whichQ=rand, so 10% of quartets will be sampled" #handled inside randQuartets - else - println("will use a random sample of $(numQ) 4-taxon sets ($(round((100*numQ)/binomial(length(taxa),4), digits=2)) percent) on $(length(taxa)) taxa") - end - quartets = randQuartets(taxa,numQ, writeFile) - else - error("unknown symbol for whichQ $(whichQ), should be either all or rand") - end - d = calculateObsCFAll!(quartets,trees,taxa) - if writetab - if(filename == "none") - filename = "tableCF.txt" - end - println("table of obsCF printed to file $(filename)") - df = writeTableCF(d) - CSV.write(filename,df) - end - #descData(d,"summaryTreesQuartets$(string(integer(time()/1000))).txt") - writeSummary && descData(d,"summaryTreesQuartets.txt") - return d -end - - - -# rename the function readInputData to make it more user-friendly -""" - readTrees2CF(treefile) - readTrees2CF(vector of trees) - -Read trees in parenthetical format from a file, or take a vector of trees already read, -and calculate the proportion of these trees having a given quartet (concordance factor: CF), -for all quartets or for a sample of quartets. -Optional arguments include: - -- quartetfile: name of text file with list of 4-taxon subsets to be analyzed. If none is specified, the function will list all possible 4-taxon subsets. -- whichQ="rand": to choose a random sample of 4-taxon subsets -- numQ: size of random sample (ignored if whichQ is not set to "rand") -- writeTab=false: does not write the observedCF to a table (default true) -- CFfile: name of file to save the observedCF (default tableCF.txt) -- writeQ=true: save intermediate files with the list of all 4-taxon subsets and chosen random sample (default false). -- writeSummary: write descriptive stats of input data (default: true) -- nexus: if true, it assumes the gene trees are written in nexus file (default: false) - -See also: -[`countquartetsintrees`](@ref), which uses a much faster algorithm; -[`readTableCF`](@ref) to read a table of quartet CFs directly. -""" -function readTrees2CF(treefile::AbstractString; quartetfile="none"::AbstractString, whichQ="all"::AbstractString, numQ=0::Integer, - writeTab=true::Bool, CFfile="none"::AbstractString, - taxa::AbstractVector=Vector{String}(), - writeQ=false::Bool, writeSummary=true::Bool, nexus=false::Bool) - trees = (nexus ? - readnexus_treeblock(treefile, readTopologyUpdate, false, false; reticulate=false) : - readInputTrees(treefile)) - if length(taxa)==0 # unionTaxa(trees) NOT default argument: - taxa = unionTaxa(trees) # otherwise: tree file is read twice - end - readTrees2CF(trees, quartetfile=quartetfile, whichQ=whichQ, numQ=numQ, writeTab=writeTab, - CFfile=CFfile, taxa=taxa, writeQ=writeQ, writeSummary=writeSummary) -end - -# same as before, but with input vector of HybridNetworks -function readTrees2CF(trees::Vector{HybridNetwork}; - quartetfile="none"::AbstractString, whichQ="all"::AbstractString, numQ=0::Integer, - writeTab=true::Bool, CFfile="none"::AbstractString, - taxa::AbstractVector=unionTaxa(trees), - writeQ=false::Bool, writeSummary=true::Bool) - whichQ == "all" || whichQ == "rand" || - error("whichQ should be all or rand, not $(whichQ)") - if(quartetfile == "none") - readInputData(trees, Symbol(whichQ), numQ, taxa, writeTab, CFfile, writeQ, writeSummary) - else - readInputData(trees, quartetfile, Symbol(whichQ), numQ, writeTab, CFfile, writeQ, writeSummary) - end -end - -# ---------------------- descriptive stat for input data ---------------------------------- - -# function to check how taxa is represented in the input trees -function taxaTreesQuartets(trees::Vector{HybridNetwork}, quartets::Vector{Quartet},s::IO) - taxaT = unionTaxa(trees) - taxaQ = unionTaxa(quartets) - dif = symdiff(taxaT,taxaQ) - isempty(dif) ? write(s,"\n same taxa in gene trees and quartets: $(taxaT)\n") : - write(s,"\n $(length(dif)) different taxa found in gene trees and quartets. \n Taxa $(intersect(taxaT,dif)) in trees, not in quartets; and taxa $(intersect(taxaQ,dif)) in quartets, not in trees\n") - u = union(taxaT,taxaQ) - for taxon in u - numT = taxonTrees(taxon,trees) - #numQ = taxonQuartets(taxon,quartets) - write(s,"Taxon $(taxon) appears in $(numT) input trees ($(round(100*numT/length(trees), digits=2)) %)\n") #and $(numQ) quartets ($(round(100*numQ/length(quartets), digits=2)) %)\n") - end -end - -taxaTreesQuartets(trees::Vector{HybridNetwork}, quartets::Vector{Quartet}) = taxaTreesQuartets(trees, quartets, stdout) - -# function that counts the number of trees in which taxon appears -function taxonTrees(taxon::AbstractString, trees::Vector{HybridNetwork}) - suma = 0 - for t in trees - suma += in(taxon,t.names) ? 1 : 0 - end - return suma -end - -# function that counts the number of quartets in which taxon appears -function taxonQuartets(taxon::AbstractString, quartets::Vector{Quartet}) - suma = 0 - for q in quartets - suma += in(taxon,q.taxon) ? 1 : 0 - end - return suma -end - - -# function to create descriptive stat from input data, will save in stream sout -# which can be a file or stdout -# default: send to stdout -# pc: only 4-taxon subsets with percentage of gene trees less than pc will be printed (default 70%) -function descData(d::DataCF, sout::IO, pc::Float64) - 0<=pc<=1 || error("percentage of missing genes should be between 0,1, not: $(pc)") - if !isempty(d.tree) - print(sout,"data consists of $(d.numTrees) gene trees and $(d.numQuartets) 4-taxon subsets\n") - taxaTreesQuartets(d.tree,d.quartet,sout) - print(sout,"----------------------------\n\n") - print(sout,"will print below only the 4-taxon subsets with data from <= $(round((pc)*100, digits=2))% genes\n") - for q in d.quartet - percent = q.ngenes == -1.0 ? 0.0 : round(q.ngenes/d.numTrees*100, digits=2) - if percent < pc - print(sout,"4-taxon subset $(q.taxon) obsCF constructed with $(round(q.ngenes)) gene trees ($(percent)%)\n") - end - end - print(sout,"----------------------------\n\n") - else - if !isempty(d.quartet) - print(sout,"data consists of $(d.numQuartets) 4-taxon subsets") - taxa=unionTaxa(d.quartet) - print(sout,"\nTaxa: $(taxa)\n") - print(sout,"Number of Taxa: $(length(taxa))\n") - numQ = binomial(length(taxa),4); - print(sout,"Maximum number of 4-taxon subsets: $(numQ). Thus, $(round(100*d.numQuartets/numQ, digits=2)) percent of 4-taxon subsets sampled\n") - end - end -end - -function descData(d::DataCF, filename::AbstractString,pc::Float64) - println("descriptive stat of input data printed to file $(filename)") - s = open(filename, "w") - descData(d,s,pc) - close(s) -end - -descData(d::DataCF, sout::IO=stdout) = descData(d, sout,0.7) -descData(d::DataCF,pc::Float64) = descData(d, stdout,pc) -descData(d::DataCF, filename::AbstractString) = descData(d, filename,0.7) - -""" -`summarizeDataCF(d::DataCF)` - -function to summarize the information contained in a DataCF object. It has the following optional arguments: -- filename: if provided, the summary will be saved in the filename, not to screen -- pc (number between (0,1)): threshold of percentage of missing genes to identify 4-taxon subsets with fewer genes than the threshold -""" -function summarizeDataCF(d::DataCF; filename="none"::AbstractString, pc=0.7::Float64) - 0<=pc<=1 || error("percentage of missing genes should be between 0,1, not: $(pc)") - if filename == "none" - descData(d,stdout,pc) - else - descData(d,filename,pc) - end -end - -# -------- branch length estimate in coalescent units on species tree ------ - -""" - updateBL!(net::HybridNetwork, d::DataCF) - -Update internal branch lengths of `net` based on the average quartet concordance -factor (CF) across all quartets that exactly correspond to a given branch: -new branch length = `-log(3/2(1-mean(CF observed in d)))`. -`net` is assumed to be a tree, such that the above equation holds. -""" -function updateBL!(net::HybridNetwork,d::DataCF) - if !isTree(net) - @error "updateBL! was created for a tree, and net here is not a tree, so no branch lengths updated" - end - parts = edgesParts(net) - df = makeTable(net,parts,d) - x = combine(groupby(df, :edge), nrow => :Nquartets, - :CF => (x -> -log(3/2*(1. - mean(x)))) => :edgeL) - edges = x[!,:edge] - lengths = x[!,:edgeL] - for i in 1:length(edges) - ind = getIndexEdge(edges[i],net) # helpful error if not found - if net.edge[ind].length < 0.0 || net.edge[ind].length==1.0 - # readTopologyLevel1 changes missing branch length to 1.0 - setLength!(net.edge[ind], (lengths[i] > 0 ? lengths[i] : 0.0)) - end - end - for e in net.edge - if e.length < 0.0 # some edges might have *no* quartet in the data - setLength!(e, 1.0) - end - end - return x -end - - -# function to get part1,part2,part3,part4 for each edge in net.edge -# returns a EdgeParts object -function edgesParts(net::HybridNetwork) - parts = EdgeParts[] #vector to hold part1,...,part4 for each edge - for e in net.edge - if(isInternalEdge(e)) - length(e.node) == 2 || error("strange edge with $(length(e.node)) nodes instead of 2") - n1 = e.node[1] - n2 = e.node[2] - e11,e12 = hybridEdges(n1,e) - e21,e22 = hybridEdges(n2,e) - part1 = Node[] - part2 = Node[] - part3 = Node[] - part4 = Node[] - getDescendants!(getOtherNode(e11,n1),e11,part1) - getDescendants!(getOtherNode(e12,n1),e12,part2) - getDescendants!(getOtherNode(e21,n2),e21,part3) - getDescendants!(getOtherNode(e22,n2),e22,part4) - push!(parts, EdgeParts(e.number,part1,part2,part3,part4)) - end - end - return parts -end - -# aux function to traverse the network from a node and an edge -# based on traverseContainRoot -# warning: it does not go accross hybrid node, minor hybrid edge -# there is another getDescendants in update.jl for updatePartition -function getDescendants!(node::Node, edge::Edge, descendants::Array{Node,1}) - if(node.leaf) - push!(descendants, node) - else - for e in node.edge - if(!isEqual(edge,e) && e.isMajor) - other = getOtherNode(e,node); - getDescendants!(other,e, descendants); - end - end - end -end - -# function to make table to later use in updateBL -# uses vector parts obtained from edgeParts function -function makeTable(net::HybridNetwork, parts::Vector{EdgeParts},d::DataCF) - df = DataFrame(edge=Int[],t1=AbstractString[],t2=AbstractString[],t3=AbstractString[],t4=AbstractString[],resolution=AbstractString[],CF=Float64[]) - sortedDataQ = [sort(q.taxon) for q in d.quartet] - for p in parts #go over internal edges too - for t1 in p.part1 - for t2 in p.part2 - for t3 in p.part3 - for t4 in p.part4 - tx1 = net.names[t1.number] - tx2 = net.names[t2.number] - tx3 = net.names[t3.number] - tx4 = net.names[t4.number] - nam = [tx1,tx2,tx3,tx4] - snam = sort(nam) - row = findall(isequal(snam), sortedDataQ) - for r in row # nothing if tax set not found: length(row)=0 - col,res = resolution(nam,d.quartet[r].taxon) - push!(df, [p.edgenum,tx1,tx2,tx3,tx4,res,d.quartet[r].obsCF[col]]) - end - end - end - end - end - end - return df -end - -# function to determine the resolution of taxa picked from part1,2,3,4 and DataCF -# names: taxa from part1,2,3,4 -# rownames: taxa from table of obsCF -function resolution(names::Vector{<:AbstractString},rownames::Vector{<:AbstractString}) - length(names) == length(rownames) || error("names and rownames should have the same length") - length(names) == 4 || error("names should have 4 entries, not $(length(names))") - bin = [n == names[1] || n == names[2] ? 1 : 0 for n in rownames] - if(bin == [1,1,0,0] || bin == [0,0,1,1]) - return 1,"12|34" - elseif(bin == [1,0,1,0] || bin == [0,1,0,1]) - return 2,"13|24" - elseif(bin == [1,0,0,1] || bin == [0,1,1,0]) - return 3,"14|23" - else - error("strange resolution $(bin)") - end -end - - -# function to extract a quartet from a matrix M -# obtained from tree2Matrix (defined in file compareNetworks.jl) -# this function is meant to replace extractQuartet! in calculateObsCFAll -# input: Quartet, Matrix, vector of taxa names -# returns 1 if quartet found is 12|34, 2 if 13|24, 3 if 14|23, and 0 if not found -function extractQuartetTree(q::Quartet, M::Matrix{Int},S::Union{Vector{<:AbstractString},Vector{Int}}) - @debug "extractQuartet: $(q.taxon)" - @debug "matrix: $(M)" - inds = indexin(q.taxon, S) - if any(isnothing, inds) - error("some taxon in quartet $(q.taxon) not found in list of all species $(S)") - end - subM = M[:, inds.+1] - @debug "subM: $(subM)" - for r in 1:size(subM,1) #rows in subM - @debug "subM[r,:]: $(subM[r,:])" - if subM[r,:] == [0,0,1,1] || subM[r,:] == [1,1,0,0] - return 1 - elseif subM[r,:] == [0,1,0,1] || subM[r,:] == [1,0,1,0] - return 2 - elseif subM[r,:] == [0,1,1,0] || subM[r,:] == [1,0,0,1] - return 3 - end - end - return 0 -end - - -# function that will give the qth quartet without making a list of all quartets -# input: n number of taxa, q desired index of quartet -# returns vector of int, e.g. 1234 -function whichQuartet(n::Int, q::Int) - p = 4 - q <= binom(n,p) || error("the index for the quartet $(q) needs to be less than choose(n,4)=$(binom(n,p))") - n > 4 || error("there must be at least 5 taxa, not $(n)") - quartet = Int[] - while(n > 1) - abs = binom(n-1,p) #fixit: we don't want to compute this, we want to look for it in a table - if(q > abs) - push!(quartet,n) - n -= 1 - p -= 1 - q = q-abs - else - n -= 1 - end - end - if(length(quartet) == 3) - push!(quartet,1) - end - quartet = quartet[[4,3,2,1]] #sort - return quartet -end - -# function to write a quartet on integer to taxon names -# it creates a Quartet type -# input: list of taxa names, vector of integers (each integer corresponds to a taxon name), -# num is the number of the Quartet -# assumes taxa is sorted already -function createQuartet(taxa::Union{Vector{<:AbstractString},Vector{Int}}, qvec::Vector{Int}, num::Int) - length(qvec) == 4 || error("a quartet should have only 4 taxa, not $(length(qvec))") - names = String[] - for i in qvec - i <= length(taxa) || error("want taxon number $(i) in list of taxon names $(taxa) which has only $(length(taxa)) names") - push!(names,string(taxa[i])) - end - return Quartet(num,names,[1.0,0.0,0.0]) -end diff --git a/src/readwrite.jl b/src/readwrite.jl index cfb8393ed..61043054c 100644 --- a/src/readwrite.jl +++ b/src/readwrite.jl @@ -45,7 +45,7 @@ function advance!(s::IO, numLeft::Array{Int,1}) end """ - readnexuscomment(s::IO, c::Char) + readnexus_comment(s::IO, c::Char) Read (and do nothing with) nexus-style comments: `[& ... ]` Assumption: 'c' is the next character to be read from s. @@ -54,7 +54,7 @@ Output: nothing. Comments can appear after (or instead of) a node or leaf name, before or after an edge length, and after another comment. """ -function readnexuscomment(s::IO, c::Char) +function readnexus_comment(s::IO, c::Char) while c == '[' # a comment could be followed by another # [ should be followed by &, otherwise bad newick string # read [ and next character: don't skip spaces @@ -69,7 +69,7 @@ function readnexuscomment(s::IO, c::Char) end """ - readnodename(s::IO, c::Char, net, numLeft) + readnewick_nodename(s::IO, c::Char, net, numLeft) Auxiliary function to read a taxon name during newick parsing. output: tuple (number, name, pound_boolean) @@ -81,10 +81,10 @@ hybrid nodes. Nexus-style comments following the node name, if any, are read and ignored. """ -function readnodename(s::IO, c::Char, net::HybridNetwork, numLeft::Array{Int,1}) +function readnewick_nodename(s::IO, c::Char, net::HybridNetwork, numLeft::Array{Int,1}) pound = 0 name = "" - while isValidSymbol(c) + while isvalidnewick_namesymbol(c) readskip!(s) # advance s past c (discard c, already read) if c == '#' pound += 1 @@ -106,13 +106,13 @@ function readnodename(s::IO, c::Char, net::HybridNetwork, numLeft::Array{Int,1}) a = read(s, String); error("strange node name with $(pound) # signs: $name. remaining: $(a).") end - readnexuscomment(s,c) + readnexus_comment(s,c) return size(net.names,1)+1, name, pound == 1 end # aux function to read floats like length or gamma values, to be read after a colon -function readFloat(s::IO, c::Char) +function readnewick_float(s::IO, c::Char) if !(isdigit(c) || c in ['.','e','-','E']) a = read(s, String); error("Expected float digit after ':' but found $(c). remaining is $(a)."); @@ -137,25 +137,25 @@ end # NOT allowed: white space () [] : ; ' , # according to richnewick.pdf # actually: ' is allowed. coded weirdly imo! -function isValidSymbol(c::Char) +function isvalidnewick_namesymbol(c::Char) return isletter(c) || isnumeric(c) || c=='_' || c=='#' || (!isspace(c) && c != '(' && c != ')' && c != '[' && c != ']' && c != ':' && c != ';' && c != ',') end """ - parseRemainingSubtree!(s::IO, numLeft, net, hybrids) + parsenewick_remainingsubtree!(s::IO, numLeft, net, hybrids) -Create internal node. Helper for [`readSubtree!`](@ref), -which creates the parent edge of the node created by `parseRemainingSubtree!`: -`readSubtree!` calls `parseRemainingSubtree!`, and vice versa. +Create internal node. Helper for [`readnewick_subtree!`](@ref), +which creates the parent edge of the node created by `parsenewick_remainingsubtree!`: +`readnewick_subtree!` calls `parsenewick_remainingsubtree!`, and vice versa. Called once a `(` has been read in a tree topology and reads until the corresponding `)` has been found. -This function performs the recursive step for `readSubtree!`. +This function performs the recursive step for `readnewick_subtree!`. Advances `s` past the subtree, adds discovered nodes and edges to `net`, and `hybrids`. Does *not* read the node name and the edge information of the subtree root: -this is done by [`readSubtree!`](@ref) +this is done by [`readnewick_subtree!`](@ref) """ -@inline function parseRemainingSubtree!(s::IO, numLeft::Array{Int,1}, net::HybridNetwork, hybrids::Vector{String}) +@inline function parsenewick_remainingsubtree!(s::IO, numLeft::Array{Int,1}, net::HybridNetwork, hybrids::Vector{String}) numLeft[1] += 1 # DEBUGC && @debug "" numLeft n = Node(-1*numLeft[1],false); @@ -163,7 +163,7 @@ this is done by [`readSubtree!`](@ref) keepon = true; c = readskip!(s) while (keepon) - bl = readSubtree!(s,n,numLeft,net,hybrids) + bl = readnewick_subtree!(s,n,numLeft,net,hybrids) c = advance!(s,numLeft) if c == ')' keepon = false @@ -176,22 +176,22 @@ this is done by [`readSubtree!`](@ref) end """ - parseHybridNode!(node, parentNode, hybridName, net, hybrids) + parsenewick_hybridnode!(node, parentNode, hybridName, net, hybrids) -Helper function for `readSubtree!`. Create the parent edge for `node`. +Helper function for `readnewick_subtree!`. Create the parent edge for `node`. Return this edge, and the hybrid node retained (`node` or its clone in the newick string). Insert new edge and appropriate node into `net` and `hybrids` accordingly. Handles any type of given hybrid node. Called after a `#` has been found in a tree topology. """ -@inline function parseHybridNode!(n::Node, parent::Node, name::String, net::HybridNetwork, hybrids::Vector{String}) +@inline function parsenewick_hybridnode!(n::Node, parent::Node, name::String, net::HybridNetwork, hybrids::Vector{String}) # @debug "found pound in $(name)" n.hybrid = true; # DEBUGC && @debug "got hybrid $(name)" # DEBUGC && @debug "hybrids list has length $(length(hybrids))" ind = findfirst(isequal(name), hybrids) # index of 'name' in the list 'hybrid'. nothing if not found - e = Edge(net.numEdges+1) # isMajor = true by default - if n.leaf e.isMajor = false; end + e = Edge(net.numedges+1) # ismajor = true by default + if n.leaf e.ismajor = false; end e.hybrid = true e.gamma = -1.0 if ind !== nothing # the hybrid name was seen before @@ -207,11 +207,11 @@ Called after a `#` has been found in a tree topology. # @debug "n is leaf" # @debug "creating hybrid edge $(e.number) attached to other $(other.number) and parent $(parent.number)" pushEdge!(net,e); - setNode!(e,[other,parent]); # isChild1 = true by default constructor + setNode!(e,[other,parent]); # ischild1 = true by default constructor setEdge!(other,e); setEdge!(parent,e); n = other # original 'n' dropped, 'other' retained: 'n' output to modify 'n' outside - # @debug "e $(e.number )istIdentifiable? $(e.istIdentifiable)" + # @debug "e $(e.number )boole1? $(e.boole1)" else # !n.leaf : delete 'other' from the network # @debug "n is not leaf, other is leaf" size(other.edge,1) == 1 || # other should be a leaf @@ -225,7 +225,7 @@ Called after a `#` has been found in a tree topology. deleteNode!(net,other); setNode!(otheredge,n); setEdge!(n,otheredge); - ## otheredge.istIdentifiable = true ## setNode should catch this, but when fixed, causes a lot of problems + ## otheredge.boole1 = true ## setNode should catch this, but when fixed, causes a lot of problems # @debug "setting otheredge to n $(n.number)" # @debug "creating hybrid edge $(e.number) between n $(n.number) and parent $(parent.number)" setNode!(e,[n,parent]); @@ -235,8 +235,8 @@ Called after a `#` has been found in a tree topology. pushEdge!(net,e); n.number = other.number; # modifies original negative node number, to positive node # n.name = other.name; - # @debug "edge $(e.number) istIdentifiable? $(e.istIdentifiable)" - # @debug "otheredge $(otheredge.number) istIdentifiable? $(otheredge.istIdentifiable)" + # @debug "edge $(e.number) boole1? $(e.boole1)" + # @debug "otheredge $(otheredge.number) boole1? $(otheredge.boole1)" end else # ind==nothing: hybrid name not seen before # @debug "$(name) not found in hybrids list" @@ -253,21 +253,21 @@ Called after a `#` has been found in a tree topology. setNode!(e,[n,parent]); setEdge!(n,e); setEdge!(parent,e); - # @debug "edge $(e.number) istIdentifiable? $(e.istIdentifiable)" + # @debug "edge $(e.number) boole1? $(e.boole1)" end - e.containRoot = !e.hybrid # not good: but necessay for SNaQ functions + e.containroot = !e.hybrid # not good: but necessay for SNaQ functions return (e,n) end """ - parseTreeNode!(node, parentNode, net) + parsenewick_treenode!(node, parentNode, net) -Helper function for `readSubtree!`. +Helper function for `readnewick_subtree!`. Insert the input tree node and associated edge (created here) into `net`. """ -@inline function parseTreeNode!(n::Node, parent::Node, net::HybridNetwork) +@inline function parsenewick_treenode!(n::Node, parent::Node, net::HybridNetwork) pushNode!(net,n); - e = Edge(net.numEdges+1); + e = Edge(net.numedges+1); pushEdge!(net,e); setNode!(e,[n,parent]); setEdge!(n,e); @@ -276,34 +276,34 @@ Insert the input tree node and associated edge (created here) into `net`. end """ - getdataValue!(s::IO, int, numLeft::Array{Int,1}) + parsenewick_getfloat!(s::IO, int, numLeft::Array{Int,1}) -Helper function for `parseEdgeData!`. +Helper function for `parsenewick_edgedata!`. Read a single floating point edge data value in a tree topology. Ignore (and skip) nexus-style comments before & after the value -(see [`readnexuscomment`](@ref)). +(see [`readnexus_comment`](@ref)). Return -1.0 if no value exists before the next colon, return the value as a float otherwise. Modifies s by advancing past the next colon character. Only call this function to read a value when you know a numerical value exists! """ -@inline function getDataValue!(s::IO, call::Int, numLeft::Array{Int,1}) +@inline function parsenewick_getfloat!(s::IO, call::Int, numLeft::Array{Int,1}) errors = ["one colon read without double in left parenthesis $(numLeft[1]-1), ignored.", "second colon : read without any double in left parenthesis $(numLeft[1]-1), ignored.", "third colon : without gamma value after in $(numLeft[1]-1) left parenthesis, ignored"] c = peekskip(s) if c == '[' # e.g. comments only, no value, but : after - readnexuscomment(s,c) + readnexus_comment(s,c) c = peekskip(s) end if isdigit(c) || c == '.' || c == '-' # value is present: read it, and any following comment(s) - val = readFloat(s, c) + val = readnewick_float(s, c) if val < 0.0 @error "expecting non-negative value but read '-', left parenthesis $(numLeft[1]-1). will set to 0." val = 0.0 end - readnexuscomment(s,peekskip(s)) + readnexus_comment(s,peekskip(s)) return val # No value elseif c == ':' @@ -315,27 +315,27 @@ Only call this function to read a value when you know a numerical value exists! end """ - parseEdgeData!(s::IO, edge, numberOfLeftParentheses::Array{Int,1}) + parsenewick_edgedata!(s::IO, edge, numberOfLeftParentheses::Array{Int,1}) -Helper function for readSubtree!. +Helper function for readnewick_subtree!. Modifies `e` according to the specified edge length and gamma values in the tree topology. Advances the stream `s` past any existing edge data. Edges in a topology may optionally be followed by ":edgeLen:bootstrap:gamma" where edgeLen, bootstrap, and gamma are decimal values. Nexus-style comments `[&...]`, if any, are ignored. """ -@inline function parseEdgeData!(s::IO, e::Edge, numLeft::Array{Int,1}) +@inline function parsenewick_edgedata!(s::IO, e::Edge, numLeft::Array{Int,1}) read(s, Char); # to read the first ":" - e.length = getDataValue!(s, 1, numLeft) + e.length = parsenewick_getfloat!(s, 1, numLeft) bootstrap = nothing; if peekskip(s) == ':' readskip!(s) - bootstrap = getDataValue!(s, 2, numLeft) + bootstrap = parsenewick_getfloat!(s, 2, numLeft) end - # e.gamma = -1.0 by default when e is created by parseHybridNode! + # e.gamma = -1.0 by default when e is created by parsenewick_hybridnode! if peekskip(s) == ':' readskip!(s) - e.gamma = getDataValue!(s, 3, numLeft) + e.gamma = parsenewick_getfloat!(s, 3, numLeft) end if e.gamma != -1.0 && !e.hybrid && e.gamma != 1.0 @warn "γ read for edge $(e.number) but it is not hybrid, so γ=$(e.gamma) ignored" @@ -344,19 +344,19 @@ Nexus-style comments `[&...]`, if any, are ignored. end """ - synchronizePartnersData!(e::Edge, n::Node) + synchronizepartnersdata!(e::Edge, n::Node) -Synchronize γ and isMajor for edges `e` and its partner, +Synchronize γ and ismajor for edges `e` and its partner, both hybrid edges with the same child `n`: - if one γ is missing and the other is not: set the missing γ to 1 - the other - γ's should sum up to 1.0 -- update `isMajor` to match the γ information: the major edge is the one with γ > 0.5. +- update `ismajor` to match the γ information: the major edge is the one with γ > 0.5. **Warnings**: does not check that `e` is a hybrid edge, nor that `n` is the child of `e`. """ -@inline function synchronizePartnersData!(e::Edge, n::Node) +@inline function synchronizepartnersdata!(e::Edge, n::Node) partners = Edge[] # The edges having n as a child, other than e for e2 in n.edge if e2.hybrid && e2!=e && n==getchild(e2) @@ -376,7 +376,7 @@ nor that `n` is the child of `e`. return nothing end # γ non-missing for e and/or partner, then - # update γ and isMajor of both edges, to be consistent with each other + # update γ and ismajor of both edges, to be consistent with each other if e.gamma == -1. if partner.gamma < 0.0 @warn "partners: $(e.number) with no γ, $(partner.number) with γ<0. will turn to 1 and 0" @@ -408,21 +408,21 @@ nor that `n` is the child of `e`. partner.gamma = 1. - e.gamma end end - # next: update isMajor, originally based on which node was a leaf and which was not - # if both γ are 0.5: keep isMajor as is. Otherwise: γ's take precedence. + # next: update ismajor, originally based on which node was a leaf and which was not + # if both γ are 0.5: keep ismajor as is. Otherwise: γ's take precedence. if !isapprox(e.gamma, 0.5) emajor = e.gamma > 0.5 - if e.isMajor != emajor # leaf status was inconsistent with γ info - e.isMajor = emajor - partner.isMajor = !emajor + if e.ismajor != emajor # leaf status was inconsistent with γ info + e.ismajor = emajor + partner.ismajor = !emajor end end end """ - readSubtree!(s::IO, parentNode, numLeft, net, hybrids) + readnewick_subtree!(s::IO, parentNode, numLeft, net, hybrids) -Recursive helper method for `readTopology`: +Recursive helper method for `readnewick`: read a subtree from an extended Newick topology. input `s`: IOStream/IOBuffer. @@ -430,24 +430,24 @@ Reads additional info formatted as: `:length:bootstrap:gamma`. Allows for name of internal nodes without # after closing parenthesis: (1,2)A. Warning if hybrid edge without γ, or if γ (ignored) without hybrid edge """ -function readSubtree!(s::IO, parent::Node, numLeft::Array{Int,1}, net::HybridNetwork, hybrids::Vector{String}) +function readnewick_subtree!(s::IO, parent::Node, numLeft::Array{Int,1}, net::HybridNetwork, hybrids::Vector{String}) c = peekskip(s) e = nothing; hasname = false; # to know if the current node has name pound = false; if c == '(' # read the rest of the subtree (perform the recursive step!) - n = parseRemainingSubtree!(s, numLeft, net, hybrids) + n = parsenewick_remainingsubtree!(s, numLeft, net, hybrids) c = peekskip(s); # read potential internal node name (and skip comments) - num, name, pound = readnodename(s, c, net, numLeft); + num, name, pound = readnewick_nodename(s, c, net, numLeft); if name != "" hasname = true; - n.number = num; # n was given <0 number by parseRemainingSubtree!, now >0 + n.number = num; # n was given <0 number by parsenewick_remainingsubtree!, now >0 end else # leaf, it should have a name hasname = true; - num, name, pound = readnodename(s, c, net, numLeft) + num, name, pound = readnewick_nodename(s, c, net, numLeft) if name == "" a = read(s, String); error("Expected digit, alphanum or # at the start of taxon name, but received $(c). remaining: $(a)."); @@ -457,22 +457,22 @@ function readSubtree!(s::IO, parent::Node, numLeft::Array{Int,1}, net::HybridNet end if pound # found pound sign in name # merge the 2 nodes corresponding the hybrid: make n the node that is retained - e,n = parseHybridNode!(n, parent, name, net, hybrids) # makes hybrid node number >0 + e,n = parsenewick_hybridnode!(n, parent, name, net, hybrids) # makes hybrid node number >0 else if hasname push!(net.names, name); n.name = name end - e = parseTreeNode!(n, parent, net) + e = parsenewick_treenode!(n, parent, net) end c = peekskip(s); e.length = -1.0 if c == ':' - parseEdgeData!(s, e, numLeft) + parsenewick_edgedata!(s, e, numLeft) end if e.hybrid # if hybrid edge: 'e' might have no info, but its partner may have had info - synchronizePartnersData!(e, n) # update γ and isMajor of e and/or its partner + synchronizepartnersdata!(e, n) # update γ and ismajor of e and/or its partner end return true end @@ -480,9 +480,9 @@ end # function to read topology from parenthetical format # input: file name or tree in parenthetical format -# calls readTopology(s::IO) +# calls readnewick(s::IO) # warning: crashes if file name starts with ( -function readTopology(input::AbstractString,verbose::Bool) +function readnewick(input::AbstractString,verbose::Bool) if(input[1] == '(') # input = parenthetical description s = IOBuffer(input) else # input = file name @@ -493,14 +493,14 @@ function readTopology(input::AbstractString,verbose::Bool) end s = open(input) end - net = readTopology(s,verbose) + net = readnewick(s,verbose) return net end """ - readTopology(file name) - readTopology(parenthetical description) - readTopology(IO) + readnewick(file name) + readnewick(parenthetical description) + readnewick(IO) Read tree or network topology from parenthetical format (extended Newick). If the root node has a single child: ignore (i.e. delete from the topology) @@ -515,9 +515,9 @@ after (or instead) of a node name, and before/after an edge length. A root edge, not enclosed within a pair a parentheses, is ignored. If the root node has a single edge, this one edge is removed. """ -readTopology(input::AbstractString) = readTopology(input,true) +readnewick(input::AbstractString) = readnewick(input,true) -function readTopology(s::IO,verbose::Bool) +function readnewick(s::IO,verbose::Bool) net = HybridNetwork() line = readuntil(s,";", keep=true); if(line[end] != ';') @@ -534,7 +534,7 @@ function readTopology(s::IO,verbose::Bool) c = readskip!(s) b = false; while(c != ';') - b |= readSubtree!(s,n,numLeft,net,hybrids) + b |= readnewick_subtree!(s,n,numLeft,net,hybrids) c = readskip!(s); if eof(s) error("Tree ended while reading in subtree beginning with left parenthesis number $(numLeft[1]-1).") @@ -543,7 +543,7 @@ function readTopology(s::IO,verbose::Bool) elseif c == ')' # read potential root name (or comments) c = peekskip(s); - num, name, pound = readnodename(s, c, net, numLeft) + num, name, pound = readnewick_nodename(s, c, net, numLeft) if name != "" n.name = name # log warning or error if pound > 0? @@ -558,30 +558,30 @@ function readTopology(s::IO,verbose::Bool) end end # @debug "after readsubtree:" - # @debug begin printEdges(net); "printed edges" end + # @debug begin printedges(net); "printed edges" end # delete the root edge, if present if size(n.edge,1) == 1 # root node n has only one edge edge = n.edge[1] child = getOtherNode(edge,n); removeEdge!(child,edge); - net.root = getIndex(child,net); + net.rooti = getIndex(child,net); deleteEdge!(net,edge); else pushNode!(net,n); - net.root = getIndex(n,net); + net.rooti = getIndex(n,net); end else - a = read(s, String) + a = read(s, String) error("Expected beginning of tree with ( but received $(c) instead, rest is $(a)") end storeHybrids!(net) checkNumHybEdges!(net) - directEdges!(net; checkMajor=true) # to update edges containRoot: true until hybrid, false below hybrid - net.isRooted = true + directedges!(net; checkMajor=true) # to update edges containroot: true until hybrid, false below hybrid + net.isrooted = true return net end -readTopology(s::IO) = readTopology(s,true) +readnewick(s::IO) = readnewick(s,true) """ checkNumHybEdges!(net) @@ -590,7 +590,7 @@ Check for consistency between hybrid-related attributes in the network: - for each hybrid node: 2 or more hybrid edges - exception: allows for a leaf to be attached to a single hybrid edge - exactly 2 incoming parent hybrid edges -Run after `storeHybrids!`. See also `check2HybEdges`. +Run after `storeHybrids!`. """ function checkNumHybEdges!(net::HybridNetwork) if isTree(net) return nothing; end @@ -598,10 +598,10 @@ function checkNumHybEdges!(net::HybridNetwork) for n in net.hybrid hyb = sum([e.hybrid for e in n.edge]); # number of hybrid edges attached to node if hyb == 1 - if net.numHybrids == 1 + if net.numhybrids == 1 error("only one hybrid node $(n.number) named $(n.name) found with one hybrid edge attached") else - error("hybrid node $(n.number) named $(n.name) has only one hybrid edge attached. there are $(net.numHybrids-1) other hybrids out there but this one remained unmatched") + error("hybrid node $(n.number) named $(n.name) has only one hybrid edge attached. there are $(net.numhybrids-1) other hybrids out there but this one remained unmatched") end elseif hyb == 0 if length(n.edge) == 0 @@ -618,7 +618,7 @@ function checkNumHybEdges!(net::HybridNetwork) if n == getchild(e) if e.hybrid nhybparents += 1 - else @error "node $(n.number) has parent tree edge $(e.number): wrong isChild1 for this edge?" + else @error "node $(n.number) has parent tree edge $(e.number): wrong ischild1 for this edge?" end end end @@ -632,193 +632,123 @@ function checkNumHybEdges!(net::HybridNetwork) return nothing end -# aux function to send an error if the number of hybrid attached to every -# hybrid node is >2 -function check2HybEdges(net::HybridNetwork) - for n in net.hybrid - hyb = sum([e.hybrid for e in n.edge]); - if hyb > 2 - error("hybrid node $(n.number) has more than two hybrid edges attached to it: polytomy that cannot be resolved without intersecting cycles.") - end - end +""" + resolvetreepolytomy!(net::HybridNetwork, n::Node, e1::Edge, e2::Edge) + +Create new node `v` and new edge `n --> v`, detach edges `e1` and `e2` from `n` +to connect them to `v` instead. Return the new edge, whose child is `v`. + +Warning: assumes that `n` is incident to both `e1` and `e2`. It is best if +these edges are originally children of `n` because the new edge is directed +from `n` to the newly created node. +""" +function resolvetreepolytomy!( + net::HybridNetwork, + n::Node, + ce1::Edge, + ce2::Edge, + b1::Bool=getparent(ce1)===n, + b2::Bool=getparent(ce2)===n +) + removeEdge!(n,ce1) + removeEdge!(n,ce2) + removeNode!(n,ce1) + removeNode!(n,ce2) + unused_enum = setdiff(1:net.numedges, e.number for e in net.edge) + new_enum = isempty(unused_enum) ? (net.numedges+1) : unused_enum[1] + e_new = Edge(new_enum, 0.0) + max_node = maximum(no.number for no in net.node) + n_new = Node(max_node+1,false,false,[ce1,ce2,e_new]) + setEdge!(n, e_new) + setNode!(ce1, n_new) # n_new is second in ce1.node + ce1.ischild1 = b1 # n_new is parent of ce1 if n was originally parent + setNode!(ce2, n_new) + ce2.ischild1 = b2 + setNode!(e_new, [n_new,n]) # ischild1 true, so `n` is the parent + pushNode!(net, n_new) + pushEdge!(net, e_new) + return e_new end +""" + resolvetreepolytomy!(net::HybridNetwork, n::Node) -# aux function to solve a polytomy -# warning: chooses one resolution at random -function solvePolytomyRecursive!(net::HybridNetwork, n::Node) - if(size(n.edge,1) == 4) - edge1 = n.edge[1]; - edge2 = n.edge[2]; - edge3 = n.edge[3]; - edge4 = n.edge[4]; - removeEdge!(n,edge3); - removeEdge!(n,edge4); - removeNode!(n,edge3); - removeNode!(n,edge4); - ednew = Edge(net.numEdges+1,0.0); - max_node = maximum([e.number for e in net.node]); - n1 = Node(max_node+1,false,false,[edge3,edge4,ednew]); - setEdge!(n,ednew); - setNode!(edge3,n1); - setNode!(edge4,n1); - setNode!(ednew,[n,n1]); - pushNode!(net,n1); - pushEdge!(net,ednew); - else - edge1 = n.edge[1]; - removeEdge!(n,edge1); - solvePolytomyRecursive!(net,n); - setEdge!(n,edge1); +Create new nodes and edges from a tree node `n`, until it has degree 3. +It is best if the network's tree edges are correctly directed beforehand. +""" +function resolvetreepolytomy!(net::HybridNetwork, n::Node) + !n.hybrid || error("cannot solve polytomy at a hybrid node $(n.number).") + while size(n.edge,1) > 3 + ce1, ce2, b1, b2 = find_twochildedges(n) + resolvetreepolytomy!(net, n, ce1, ce2, b1, b2) end end -# function to solve a polytomy among tree edges recursively -function solvePolytomy!(net::HybridNetwork, n::Node) - !n.hybrid || error("cannot solve polytomy in a hybrid node $(n.number).") - while(size(n.edge,1) > 3) - solvePolytomyRecursive!(net,n); - end +# tuple of 2 edges incident to n, +# children of n according to ischild1 *if possible* +function find_twochildedges(n::Node) + ee = n.edge + ischildofn = [getparent(e)===n for e in ee] + i2 = findlast(ischildofn) + if isnothing(i2) # pick edges 1 and 2 + return(ee[1], ee[2], false, false) # false: not children of n + end + i1 = findprev(ischildofn, i2-1) + i1_notfound = isnothing(i1) + if i1_notfound # set i1 to 1 (or 2 if i2=1) + i1 = (i2==1 ? 2 : 1) + end + return ee[i1], ee[i2], !i1_notfound, true end # aux function to add a child to a leaf hybrid function addChild!(net::HybridNetwork, n::Node) n.hybrid || error("cannot add child to tree node $(n.number).") - ed1 = Edge(net.numEdges+1,0.0); - n1 = Node(size(net.names,1)+1,true,false,[ed1]); - setEdge!(n,ed1); - setNode!(ed1,[n,n1]); - pushNode!(net,n1); - pushEdge!(net,ed1); + ed1 = Edge(net.numedges+1,0.0) + ed1.containroot = false + n1num = size(net.names,1)+1 + n1 = Node(n1num,true,false,[ed1]) + n1.name = "$(n.name)_$n1num" + push!(net.names, n1.name) + setEdge!(n,ed1) + setNode!(ed1,[n1,n]) + pushNode!(net,n1) + pushEdge!(net,ed1) + if n.leaf + n.leaf = false + i = findfirst(isequal(n), net.leaf) + deleteat!(net.leaf, i) + end + return n1 end -# aux function to expand the children of a hybrid node +# expand the children of a hybrid node: n -newedge-> newnode - -> previous children function expandChild!(net::HybridNetwork, n::Node) - if n.hybrid - suma = count([!e.hybrid for e in n.edge]); - #println("create edge $(net.numEdges+1)") - ed1 = Edge(net.numEdges+1,0.0); - n1 = Node(size(net.names,1)+1,false,false,[ed1]); - #println("create node $(n1.number)") - hyb = Edge[]; - for i in 1:size(n.edge,1) - if !n.edge[i].hybrid push!(hyb,n.edge[i]); end - end - #println("hyb tiene $([e.number for e in hyb])") - for e in hyb - #println("se va a borrar a $(e.number)") - removeEdge!(n,e); - removeNode!(n,e); - setEdge!(n1,e); - setNode!(e,n1); - end - #println("now node $(n1.number) has the edges $([e.number for e in n1.edge])") - setEdge!(n,ed1); - setNode!(ed1,[n,n1]); - pushNode!(net,n1); - pushEdge!(net,ed1); - if size(n1.edge,1) > 3 - solvePolytomy!(net,n1); - end - else - error("cannot expand children of a tree node.") - end -end - -# function to clean topology after readTopology -# looks for: -# TREE: -# - all tree edges must have gamma=1. fixit: cannot point out which doesn't, -# only shows error. -# - internal nodes with only 2 edges and solves this case. -# - polytomies and choose one resolution at random, issuing a warning -# NETWORK: -# - number of hybrid edges per hybrid node: -# if 0,1: error (with warning in old functions) -# if >2: error of hybrid polytomy -# if 2: check number of tree edges -# - number of tree edges per hybrid node: -# if 0: leaf hybrid, add child -# if >1: expand child -# if 1: check values of gamma: -# - gammas: need to sum to one and be present. -# error if they do not sum up to one -# default values of 0.1,0.9 if not present -# leaveRoot=true: leaves the root even if it has only 2 edges (for plotting), default=false -function cleanAfterRead!(net::HybridNetwork, leaveRoot::Bool) - # set e.containRoot to !e.hybrid: updated later by updateAllReadTopology as required by snaq! - for e in net.edge e.containRoot = !e.hybrid; end - nodes = copy(net.node) - for n in nodes - if isNodeNumIn(n,net.node) # very important to check - if size(n.edge,1) == 2 # delete n if: - if (!n.hybrid && (!leaveRoot || !isEqual(net.node[net.root],n)) || - (n.hybrid && sum(e.hybrid for e in n.edge) == 1)) - deleteIntNode!(net,n) - continue # n was deleted: skip the rest - end - end - if !n.hybrid - if size(n.edge,1) > 3 - @debug "warning: polytomy found in node $(n.number), random resolution chosen" - solvePolytomy!(net,n); - end - hyb = count([e.hybrid for e in n.edge]) - if hyb == 1 - n.hasHybEdge == true; - elseif hyb > 1 - @warn "strange tree node $(n.number) with more than one hybrid edge, intersecting cycles maybe" - end - else - hyb = count([e.hybrid for e in n.edge]); - tre = length(n.edge) - hyb - if hyb > 2 - error("hybrid node $(n.number) has more than two hybrid edges attached to it: polytomy that cannot be resolved without intersecting cycles.") - elseif hyb == 1 - hybnodes = count([n.hybrid for n in net.node]); - if hybnodes == 1 - error("only one hybrid node number $(n.number) with name $(net.names[n.number]) found with one hybrid edge attached") - else - error("current hybrid node $(n.number) with name $(net.names[n.number]) has only one hybrid edge attached. there are other $(hybnodes-1) hybrids out there but this one remained unmatched") - end - elseif hyb == 0 - @warn "hybrid node $(n.number) is not connected to any hybrid edges, it was transformed to tree node" - n.hybrid = false; - else # 2 hybrid edges - if tre == 0 #hybrid leaf - @warn "hybrid node $(n.number) is a leaf, so we add an extra child" - addChild!(net,n); - elseif tre > 1 - @warn "hybrid node $(n.number) has more than one child so we need to expand with another node" - expandChild!(net,n); - end - suma = sum([e.hybrid ? e.gamma : 0.0 for e in n.edge]); - # synchronizePartnersData! already made suma ≈ 1.0, when non-missing, - # and already synchronized isMajor, even when γ's ≈ 0.5 - if suma == -2.0 # hybrid edges have no gammas in newick description - println("hybrid edges for hybrid node $(n.number) have missing gamma's, set default: 0.9,0.1") - for e in n.edge - if e.hybrid - e.gamma = (e.isMajor ? 0.9 : 0.1) - end - end - end - end - end - end - end - for e in net.edge - if e.hybrid - if e.gamma < 0.0 || e.gamma > 1.0 # no -1.0 (missing) γ's by now - error("hybrid edge $(e.number) with γ = $(e.gamma) outside of [0,1]") - end - else - e.gamma == 1.0 || - error("tree edge $(e.number) with γ = $(e.gamma) instead of 1.0") - end + n.hybrid || error("cannot expand children of a tree node.") + suma = count(!e.hybrid for e in n.edge) + ed1 = Edge(net.numedges+1, 0.0) + ed1.containroot = false + n1num = size(net.names,1)+1 + n1 = Node(n1num, false, false, [ed1]) + n1.name = "$(n.name)_$n1num" + for e in reverse(n.edge) # n.edge is modified inside + e.hybrid && continue # skip hybrid edges: to skip parents of n + # now e is a tree edge: *assumes no hybrid ladder* + # println("se va a borrar a $(e.number)") + removeEdge!(n,e) + removeNode!(n,e) + setEdge!(n1,e) + setNode!(e,n1) + end + #println("now node $(n1.number) has the edges $([e.number for e in n1.edge])") + setEdge!(n,ed1) + setNode!(ed1,[n1,n]) # child is n1 + pushNode!(net,n1) + pushEdge!(net,ed1) + if size(n1.edge,1) > 3 + resolvetreepolytomy!(net,n1) end end -cleanAfterRead!(net::HybridNetwork) = cleanAfterRead!(net,false) # function to search for the hybrid nodes in a read network after cleaning it # and store this information as a network's attribute @@ -833,139 +763,14 @@ function storeHybrids!(net::HybridNetwork) end if(flag) net.hybrid = hybrid; - net.numHybrids = size(hybrid,1); + net.numhybrids = size(hybrid,1); end return nothing end -# function to update the read topology after reading -# it will go over the net.hybrid array and check each -# of the hybridization events defined to update: -# - in cycle -# - contain root -# - gammaz -# it uses updateAllNewHybrid! function that -# returns: success (bool), hybrid, flag, nocycle, flag2, flag3 -# if tree read, also check that contain root is true for all, ishybrid and hashybedge is false -# warning: needs to have run storeHybrids! before -# warning: it will stop when finding one conflicting hybrid -function updateAllReadTopology!(net::HybridNetwork) - if(isTree(net)) - #@warn "not a network read, but a tree as it does not have hybrid nodes" - all((e->e.containRoot), net.edge) ? nothing : error("some tree edge has contain root as false") - all((e->!e.hybrid), net.edge) ? nothing : error("some edge is hybrid and should be all tree edges in a tree") - all((n->!n.hasHybEdge), net.node) ? nothing : error("some tree node has hybrid edge true, but it is a tree, there are no hybrid edges") - else - if(!net.cleaned) - for n in net.hybrid - success,hyb,flag,nocycle,flag2,flag3 = updateAllNewHybrid!(n,net,false,true,false) - if(!success) - @warn "current hybrid $(n.number) conflicts with previous hybrid by intersecting cycles: $(!flag), nonidentifiable topology: $(!flag2), empty space for contain root: $(!flag3), or does not create a cycle (probably problem with the root placement): $(nocycle)." - #net.cleaned = false - end - end - @debug "before update partition" - @debug begin printPartitions(net); "printed partitions" end - for n in net.hybrid #need to updatePartition after all inCycle - nocycle, edgesInCycle, nodesInCycle = identifyInCycle(net,n); - updatePartition!(net,nodesInCycle) - @debug begin printPartitions(net); - "partitions after updating partition for hybrid node $(n.number)" - end - end - end - end -end - -# cleanAfterReadAll includes all the step to clean a network after read -function cleanAfterReadAll!(net::HybridNetwork, leaveRoot::Bool) - @debug "check for 2 hybrid edges at each hybrid node -----" - check2HybEdges(net) - @debug "cleanBL -----" - cleanBL!(net) - @debug "cleanAfterRead -----" - cleanAfterRead!(net,leaveRoot) - @debug "updateAllReadTopology -----" - updateAllReadTopology!(net) #fixit: it could break if leaveRoot = true (have not checked it), but we need to updateContainRoot - if(!leaveRoot) - @debug "parameters -----" - parameters!(net) - end - @debug "check root placement -----" - checkRootPlace!(net) - net.node[net.root].leaf && @warn "root node $(net.node[net.root].number) is a leaf, so when plotting net, it can look weird" - net.cleaned = true #fixit: set to false inside updateAllReadTopology if problem encountered - net.isRooted = false -end - -cleanAfterReadAll!(net::HybridNetwork) = cleanAfterReadAll!(net,false) - -# function to read a topology from file name/tree directly and update it -# by calling updateAllReadTopology after -# leaveRoot=true if the root will not be deleted even if it has only 2 edges -# used for plotting (default=false) -# warning: if leaveRoot=true, net should not be used outside plotting, things will crash -function readTopologyUpdate(file::AbstractString, leaveRoot::Bool,verbose::Bool) - @debug "readTopology -----" - net = readTopology(file,verbose) - cleanAfterReadAll!(net,leaveRoot) - return net -end - -readTopologyUpdate(file::AbstractString) = readTopologyUpdate(file, false, true) -readTopologyUpdate(file::AbstractString,verbose::Bool) = readTopologyUpdate(file, false, verbose) """ - readTopologyLevel1(filename) - readTopologyLevel1(parenthetical format) - -same as readTopology, reads a tree or network from parenthetical -format, but this function enforces the necessary conditions for any -starting topology in SNaQ: non-intersecting cycles, no polytomies, -unrooted. It sets any missing branch length to 1.0. - -If the network has a bad diamond II (in which edge lengths are γ's are not identifiable) -and if the edge below this diamond has a length `t` different from 0, then this length is -set back to 0 and the major parent hybrid edge is lengthened by `t`. -""" -readTopologyLevel1(file::AbstractString) = readTopologyUpdate(file, false, true) - - -# aux function to check if the root is placed correctly, and re root if not -# warning: it needs updateContainRoot set -function checkRootPlace!(net::HybridNetwork; verbose=false::Bool, outgroup="none"::AbstractString) - if(outgroup == "none") - if(!canBeRoot(net.node[net.root])) - verbose && println("root node $(net.node[net.root].number) placement is not ok, we will change it to the first found node that agrees with the direction of the hybrid edges") - for i in 1:length(net.node) - if(canBeRoot(net.node[i])) - net.root = i - break - end - end - end - else # outgroup - tmp = findall(n -> n.name == outgroup, net.leaf) - if length(tmp)==0 - error("leaf named $(outgroup) was not found in the network.") - elseif length(tmp)>1 - error("several leaves were found with name $(outgroup).") - end - leaf = net.leaf[tmp[1]] - leaf.leaf || error("found outgroup not a leaf: $(leaf.number), $(outgroup)") - length(leaf.edge) == 1 || error("found leaf with more than 1 edge: $(leaf.number)") - other = getOtherNode(leaf.edge[1],leaf); - if(canBeRoot(other)) - net.root = getIndexNode(other.number,net) - else - throw(RootMismatch("outgroup $(outgroup) contradicts direction of hybrid edges")) - end - end - canBeRoot(net.node[net.root]) || error("tried to place root, but couldn't. root is node $(net.node[net.root])") -end - -""" - writeSubTree!(IO, network, dendroscope::Bool, namelabel::Bool, + writesubtree!(IO, network, dendroscope::Bool, namelabel::Bool, round_branch_lengths::Bool, digits::Integer, internallabel::Bool) @@ -977,20 +782,20 @@ otherwise taxa are labelled by their number IDs. If unspecified, branch lengths and γ's are rounded to 3 digits. Use `internallabel=false` to suppress the labels of internal nodes. """ -function writeSubTree!(s::IO, net::HybridNetwork, di::Bool, namelabel::Bool, +function writesubtree!(s::IO, net::HybridNetwork, di::Bool, namelabel::Bool, roundBL::Bool, digits::Integer, internallabel::Bool) rootnode = getroot(net) - if net.numNodes > 1 + if net.numnodes > 1 print(s,"(") degree = length(rootnode.edge) for e in rootnode.edge - writeSubTree!(s,getOtherNode(e,rootnode),e,di,namelabel,roundBL,digits,internallabel) + writesubtree!(s,getOtherNode(e,rootnode),e,di,namelabel,roundBL,digits,internallabel) degree -= 1 degree == 0 || print(s,",") end print(s,")") end - if internallabel || net.numNodes == 1 + if internallabel || net.numnodes == 1 print(s, (namelabel ? rootnode.name : rootnode.number)) end print(s,";") @@ -999,36 +804,36 @@ end """ - writeSubTree!(IO, node, edge, dendroscope::Bool, namelabel::Bool, + writesubtree!(IO, node, edge, dendroscope::Bool, namelabel::Bool, round_branch_lengths::Bool, digits::Integer, internallabel::Bool) Write the extended newick format of the sub-network rooted at `node` and assuming that `edge` is a parent of `node`. -If the parent `edge` is `nothing`, the edge attribute `isChild1` is used +If the parent `edge` is `nothing`, the edge attribute `ischild1` is used and assumed to be correct to write the subtree rooted at `node`. This is useful to write a subtree starting at a non-root node. Example: ```julia -net = readTopology("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);") -directEdges!(net) +net = readnewick("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);") +directedges!(net) s = IOBuffer() -writeSubTree!(s, net.node[7], nothing, false, true) +writesubtree!(s, net.node[7], nothing, false, true) String(take!(s)) ``` -Used by [`writeTopology`](@ref). +Used by [`writenewick`](@ref). """ -writeSubTree!(s,n,parent,di,namelabel) = - writeSubTree!(s,n,parent,di,namelabel, true,3,true) +writesubtree!(s,n,parent,di,namelabel) = + writesubtree!(s,n,parent,di,namelabel, true,3,true) # "parent' is assumed to be adjancent to "node". not checked. # algorithm comes from "parent": do not traverse again. -function writeSubTree!(s::IO, n::Node, parent::Union{Edge,Nothing}, +function writesubtree!(s::IO, n::Node, parent::Union{Edge,Nothing}, di::Bool, namelabel::Bool, roundBL::Bool, digits::Integer, internallabel::Bool) # subtree below node n: - if !n.leaf && (parent == nothing || parent.isMajor) # do not descent below a minor hybrid edge + if !n.leaf && (parent == nothing || parent.ismajor) # do not descent below a minor hybrid edge print(s,"(") firstchild = true for e in n.edge @@ -1040,7 +845,7 @@ function writeSubTree!(s::IO, n::Node, parent::Union{Edge,Nothing}, firstchild || print(s, ",") firstchild = false child = getOtherNode(e,n) - writeSubTree!(s,child,e, di,namelabel, roundBL, digits, internallabel) + writesubtree!(s,child,e, di,namelabel, roundBL, digits, internallabel) end print(s,")") end @@ -1048,7 +853,7 @@ function writeSubTree!(s::IO, n::Node, parent::Union{Edge,Nothing}, if parent != nothing && parent.hybrid print(s, "#") print(s, (namelabel ? n.name : string("H", n.number))) - n.name != "" || parent.isMajor || @warn "hybrid node $(n.number) has no name" + n.name != "" || parent.ismajor || @warn "hybrid node $(n.number) has no name" elseif internallabel || n.leaf print(s, (namelabel ? n.name : n.number)) end @@ -1058,260 +863,21 @@ function writeSubTree!(s::IO, n::Node, parent::Union{Edge,Nothing}, print(s,string(":",(roundBL ? round(parent.length, digits=digits) : parent.length))) printBL = true end - if parent != nothing && parent.hybrid && !di # && (!printID || !n.isBadDiamondI)) + if !isnothing(parent) && parent.hybrid && !di # && (!printID || !n.booln2)) if(parent.gamma != -1.0) if(!printBL) print(s,":"); end print(s,string("::",(roundBL ? round(parent.gamma, digits=digits) : parent.gamma))) end end - if parent == nothing + if isnothing(parent) print(s, ";") end end -# see full docstring below -# Need HybridNetwork input, since QuartetNetwork does not have root. -function writeTopologyLevel1(net0::HybridNetwork, di::Bool, str::Bool, namelabel::Bool,outgroup::AbstractString, printID::Bool, roundBL::Bool, digits::Integer, multall::Bool) - s = IOBuffer() - writeTopologyLevel1(net0,s,di,namelabel,outgroup,printID,roundBL,digits, multall) - if str - return String(take!(s)) - else - return s - end -end - -# warning: I do not want writeTopologyLevel1 to modify the network if outgroup is given! thus, we have updateRoot, and undoRoot -# note that if printID is true, the function is modifying the network -function writeTopologyLevel1(net0::HybridNetwork, s::IO, di::Bool, namelabel::Bool, - outgroup::AbstractString, printID::Bool, roundBL::Bool, digits::Integer, multall::Bool) - global CHECKNET - net = deepcopy(net0) #writeTopologyLevel1 needs containRoot, but should not alter net0 - # net.numBad == 0 || println("network with $(net.numBad) bad diamond I. Some γ and edge lengths t are not identifiable, although their γ * (1-exp(-t)) are.") - if printID - setNonIdBL!(net) # changes non identifiable BL to -1.0, except those in/below bad diamonds/triangles. - end - assignhybridnames!(net) - if(net.numNodes == 1) - print(s,string(net.node[net.root].number,";")) # error if 'string' is an argument name. - else - if(!isTree(net) && !net.cleaned) - @debug "net not cleaned inside writeTopologyLevel1, need to run updateContainRoot" - for n in net.hybrid - flag,edges = updateContainRoot!(net,n) - flag || error("hybrid node $(n.hybrid) has conflicting containRoot") - end - end - updateRoot!(net,outgroup) - #@debug begin printEverything(net); "printed everything" end - CHECKNET && canBeRoot(net.node[net.root]) - if(multall) - mergeLeaves!(net) - ## make sure the root is not on a leaf - ## This is a band aid: need to check the order of write/root/merge leaves on multiple allele cases - if outgroup != "none" - try - checkRootPlace!(net,outgroup=outgroup) ## keeps all attributes - catch err - if isa(err, RootMismatch) - println("RootMismatch: ", err.msg, - """\nThe estimated network has hybrid edges that are incompatible with the desired outgroup. - Reverting to an admissible root position. - """) - else - println("error trying to reroot: ", err.msg); - end - checkRootPlace!(net,verbose=false) # message about problem already printed above - end - else - checkRootPlace!(net,verbose=false) #leave root in good place after snaq - end - end - writeSubTree!(s, net, di,namelabel, roundBL,digits,true) - end - # outgroup != "none" && undoRoot!(net) # not needed because net is deepcopy of net0 - # to delete 2-degree node, for snaq. -end - -writeTopologyLevel1(net::HybridNetwork,di::Bool,str::Bool,namelabel::Bool,outgroup::AbstractString,printID::Bool) = writeTopologyLevel1(net,di,str,namelabel,outgroup,printID, false,3, false) -# above: default roundBL=false (at unused digits=3 decimal places) -writeTopologyLevel1(net::HybridNetwork,printID::Bool) = writeTopologyLevel1(net,false, true,true,"none",printID, false, 3, false) -writeTopologyLevel1(net::HybridNetwork,outgroup::AbstractString) = writeTopologyLevel1(net,false, true,true,outgroup,true, false, 3, false) -writeTopologyLevel1(net::HybridNetwork,di::Bool,outgroup::AbstractString) = writeTopologyLevel1(net,di, true,true,outgroup,true, false, 3, false) - -""" -`writeTopologyLevel1(net::HybridNetwork)` - -Write the extended Newick parenthetical format of a -level-1 network object with many optional arguments (see below). -Makes a deep copy of net: does *not* modify `net`. - -- di=true: write in format for Dendroscope (default false) -- namelabel=true: If `namelabel` is true, taxa are labelled by their names; -otherwise taxa are labelled by their numbers (unique identifiers). -- outgroup (string): name of outgroup to root the tree/network. - if "none" is given, the root is placed wherever possible. -- printID=true, only print branch lengths for identifiable egdes - according to the snaq estimation procedure (default false) - (true inside of `snaq!`.) -- round: rounds branch lengths and heritabilities γ (default: true) -- digits: digits after the decimal place for rounding (defult: 3) -- string: if true (default), returns a string, - otherwise returns an IOBuffer object. -- multall: (default false). set to true when there are multiple - alleles per population. - -The topology may be written using a root different than net.root, -if net.root is incompatible with one of more hybrid node. -Missing hybrid names are written as "#Hi" where "i" is the hybrid node number if possible. -""" #" -writeTopologyLevel1(net::HybridNetwork; di=false::Bool, string=true::Bool, namelabel=true::Bool, - outgroup="none"::AbstractString, printID=false::Bool, round=false::Bool, digits=3::Integer, - multall=false::Bool) = -writeTopologyLevel1(net, di, string, namelabel, outgroup, printID, round, digits, multall) - -# function to check if root is well-placed -# and look for a better place if not -# searches on net.node because net.root is the index in net.node -# if we search in net.edge, we then need to search in net.node -# this function is only used inside writeTopologyLevel1 -function updateRoot!(net::HybridNetwork, outgroup::AbstractString) - checkroot = false - if(outgroup == "none") - @debug "no outgroup defined" - checkroot = true - else - println("outgroup defined $(outgroup)") - index = findfirst(n -> outgroup == n.name, net.node) - index != nothing || - error("outgroup $(outgroup) not in net.names $(net.names)") - node = net.node[index] - node.leaf || error("outgroup $(outgroup) is not a leaf in net") - length(net.node[index].edge) == 1 || error("strange leaf $(outgroup), node number $(net.node[index].number) with $(length(net.node[index].edge)) edges instead of 1") - edge = net.node[index].edge[1] - if(edge.containRoot) - DEBUGC && @debug "creating new node in the middle of the external edge $(edge.number) leading to outgroup $(node.number)" - othernode = getOtherNode(edge,node) - removeEdge!(othernode,edge) - removeNode!(othernode,edge) - max_edge = maximum([e.number for e in net.edge]); - max_node = maximum([e.number for e in net.node]); - newedge = Edge(max_edge+1) #fixit: maybe this edge not identifiable, need to add that check - newnode = Node(max_node+1,false,false,[edge,newedge]) - if(net.cleaned && !isTree(net) && !isempty(net.partition)) # fixit: this will crash if network estimated with snaq, and then manipulated - part = whichPartition(net,edge) - push!(net.partition[part].edges,newedge) - end - setNode!(edge,newnode) - setNode!(newedge,newnode) - setEdge!(othernode,newedge) - setNode!(newedge,othernode) - pushEdge!(net,newedge) - pushNode!(net,newnode) - t = edge.length - if t == -1 - edge.length = -1 - newedge.length = -1 - else - setLength!(edge,t/2) - setLength!(newedge,t/2) - end - net.root = length(net.node) #last node is root - else - @warn "external edge $(net.node[index].edge[1].number) leading to outgroup $(outgroup) cannot contain root, root placed wherever" - checkroot = true - end - end - if(checkroot && !isTree(net)) - checkRootPlace!(net) - end - end - -# function to check if a node could be root -# by the containRoot attribute of edges around it -function canBeRoot(n::Node) - !n.hybrid || return false - #!n.hasHybEdge || return false #need to allow for some reason, check ipad notes - !n.leaf || return false - return any([e.containRoot for e in n.edge]) -end - -# function to delete the extra node created in updateRoot -# this extra node is needed to be able to compare networks with the distance function -# but if left in the network, everything crashes (as everything assumes three edges per node) -# fromUpdateRoot=true if called after updateRoot (in which case leaf has to be a leaf), ow it is used in readTopUpdate -function undoRoot!(net::HybridNetwork, fromUpdateRoot::Bool) - if(length(net.node[net.root].edge) == 2) - root = net.node[net.root] - leaf = getOtherNode(root.edge[1],root).leaf ? getOtherNode(root.edge[1],root) : getOtherNode(root.edge[2],root) - (fromUpdateRoot && leaf.leaf) || error("root should have one neighbor leaf which has to be the outgroup defined") - deleteIntLeafWhile!(net,root,leaf); - end -end - -undoRoot!(net::HybridNetwork) = undoRoot!(net, true) - -# .out file from snaq written by optTopRuns -""" - readSnaqNetwork(output file) - -Read the estimated network from a `.out` file generated by `snaq!`. -The network score is read also, and stored in the network's field `.loglik`. - -Warning: despite the name "loglik", this score is only proportional -to the network's pseudo-deviance: the lower, the better. -Do NOT use this score to calculate an AIC or BIC (etc.) value. -""" -function readSnaqNetwork(file::AbstractString) - open(file) do s - line = readline(s) - line[1] == '(' || - error("output file $(file) does not contain a tree in the first line, instead it has $(line); or we had trouble finding ploglik.") - # println("Estimated network from file $(file): $(line)") - net = readTopology(line) - # readTopologyUpdate is inadequate: would replace missing branch lengths, which are unidentifiable, by 1.0 values - try - vec = split(line,"-Ploglik = ") - net.loglik = parse(Float64,vec[2]) - catch e - @warn "could not find the network score; the error was:" - rethrow(e) - end - return net - end -end - -# function to change negative branch lengths to 1.0 for starting topology -# and to change big branch lengths to 10.0 -# also uses setLength for all edges -function cleanBL!(net::HybridNetwork) - ##println("missing branch lengths will be set to 1.0") - for e in net.edge - if(e.length < 0) - setLength!(e,1.0) - elseif(e.length > 10.0) - setLength!(e,10.0) - else - setLength!(e,e.length) - end - end -end - - -# function to read multiple topologies -# - calls readInputTrees in readData.jl, which -# calls readTopologyUpdate here, for level 1 networks. -# - read a file and create one object per line read -# (each line starting with "(" will be considered a topology) -# the file can have extra lines that are ignored -# returns an array of HybridNetwork objects (that can be trees) -function readMultiTopologyLevel1(file::AbstractString) - readInputTrees(file) -end """ - readMultiTopology(filename::AbstractString, fast=true) - readMultiTopology(newicktrees_list::Vector{<:AbstractString}) + readmultinewick(filename::AbstractString, fast=true) + readmultinewick(newicktrees_list::Vector{<:AbstractString}) Read a list of networks in parenthetical format, either from a file @@ -1323,7 +889,7 @@ reading the newick trees into of HybridNetwork-type objects. The option `fast=false` corresponds to the behavior up until v0.14.3: with a file name as input, it prints a message (without failing) when a phylogeny cannot be parsed, and allows for empty lines. -Each network is read with [`readTopology`](@ref). +Each network is read with [`readnewick`](@ref). Return an array of HybridNetwork objects. @@ -1331,20 +897,20 @@ Return an array of HybridNetwork objects. ```julia julia> multitreepath = joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "multitrees.newick"); -julia> multitree = readMultiTopology(multitreepath) # vector of 25 HybridNetworks -julia> multitree = readMultiTopology(multitreepath, false) # same but slower & safer +julia> multitree = readmultinewick(multitreepath) # vector of 25 HybridNetworks +julia> multitree = readmultinewick(multitreepath, false) # same but slower & safer julia> treestrings = readlines(multitreepath) # vector of 25 strings -julia> multitree = readMultiTopology(treestrings) -julia> readMultiTopology(treestrings, false) # same, but slower +julia> multitree = readmultinewick(treestrings) +julia> readmultinewick(treestrings, false) # same, but slower ``` """ -function readMultiTopology(topologies::Vector{<:AbstractString}, fast::Bool=true) - return (fast ? fmap(readTopology, topologies) : map(readTopology, topologies)) +function readmultinewick(topologies::Vector{<:AbstractString}, fast::Bool=true) + return (fast ? fmap(readnewick, topologies) : map(readnewick, topologies)) end -function readMultiTopology(file::AbstractString, fast::Bool=true) +function readmultinewick(file::AbstractString, fast::Bool=true) if fast - return readMultiTopology(readlines(file), true) + return readmultinewick(readlines(file), true) end s = open(file) numl = 1 @@ -1354,7 +920,7 @@ function readMultiTopology(file::AbstractString, fast::Bool=true) c = isempty(line) ? "" : line[1] if(c == '(') try - push!(vnet, readTopology(line,false)) # false for non-verbose + push!(vnet, readnewick(line,false)) # false for non-verbose catch err print("skipped phylogeny on line $(numl) of file $file: ") if :msg in fieldnames(typeof(err)) println(err.msg); else println(typeof(err)); end @@ -1368,7 +934,7 @@ end @doc raw""" - readnexus_treeblock(filename, treereader=readTopology, args...; + readnexus_treeblock(filename, treereader=readnewick, args...; reticulate=true, stringmodifier=[r"#(\d+)" => s"#H\1"]) Read the *first* "trees" block of a nexus-formatted file, using the translate @@ -1399,7 +965,7 @@ or like this, as output by SpeciesNetwork In this example, the corresponding edge to hybrid H11 has γ=0.08. """ -function readnexus_treeblock(file::AbstractString, treereader=readTopology::Function, args...; +function readnexus_treeblock(file::AbstractString, treereader::Function=readnewick, args...; reticulate=true, stringmodifier=[r"#(\d+)\b" => s"#H\1"]) # add H vnet = HybridNetwork[] rx_start = r"^\s*begin\s+trees\s*;"i @@ -1559,7 +1125,7 @@ function readnexus_assigngammas!(net::HybridNetwork, id2gamma::Dict) hn = net.hybrid[j] he = getparentedgeminor(hn) if he.gamma == -1.0 - setGamma!(he, gam) + setgamma!(he, gam) else @warn "hybrid edge number $(he.number) has γ=$(he.gamma). won't erase with $gam." end @@ -1568,40 +1134,40 @@ function readnexus_assigngammas!(net::HybridNetwork, id2gamma::Dict) end """ - writeMultiTopology(nets, file_name; append=false) - writeMultiTopology(nets, IO) + writemultinewick(nets, file_name; append=false) + writemultinewick(nets, IO) Write an array of networks in parenthetical extended Newick format, one network per line. Use the option append=true to append to the file. Otherwise, the default is to create a new file or overwrite it, if it already existed. -Each network is written with `writeTopology`. +Each network is written with `writenewick`. # Examples ```julia -julia> net = [readTopology("(D,((A,(B)#H7:::0.864):2.069,(F,E):3.423):0.265,(C,#H7:::0.1361111):10);"), - readTopology("(A,(B,C));"),readTopology("(E,F);"),readTopology("(G,H,F);")]; +julia> net = [readnewick("(D,((A,(B)#H7:::0.864):2.069,(F,E):3.423):0.265,(C,#H7:::0.1361111):10);"), + readnewick("(A,(B,C));"),readnewick("(E,F);"),readnewick("(G,H,F);")]; -julia> writeMultiTopology(net, "fournets.net") # to (over)write to file "fournets.net" -julia> writeMultiTopology(net, "fournets.net", append=true) # to append to this file -julia> writeMultiTopology(net, stdout) # to write to the screen (standard out) +julia> writemultinewick(net, "fournets.net") # to (over)write to file "fournets.net" +julia> writemultinewick(net, "fournets.net", append=true) # to append to this file +julia> writemultinewick(net, stdout) # to write to the screen (standard out) (D,((A,(B)#H7:::0.864):2.069,(F,E):3.423):0.265,(C,#H7:::0.1361111):10.0); (A,(B,C)); (E,F); (G,H,F); ``` """ -function writeMultiTopology(n::Vector{HybridNetwork},file::AbstractString; append::Bool=false) +function writemultinewick(n::Vector{HybridNetwork},file::AbstractString; append::Bool=false) mode = (append ? "a" : "w") open(file, mode) do s - writeMultiTopology(n,s) + writemultinewick(n,s) end # closes file safely end -function writeMultiTopology(net::Vector{HybridNetwork},s::IO) +function writemultinewick(net::Vector{HybridNetwork},s::IO) for i in 1:length(net) try # writeTopologyLevel1(net[i],s,false,true,"none",false,false,3) - writeTopology(net[i],s) # no rounding, not for dendroscope + writenewick(net[i],s) # no rounding, not for dendroscope write(s,"\n") catch err if isa(err, RootMismatch) # continue writing other networks in list @@ -1613,9 +1179,9 @@ end """ - writeTopology(net) - writeTopology(net, filename) - writeTopology(net, IO) + writenewick(net) + writenewick(net, filename) + writenewick(net, IO) Write the parenthetical extended Newick format of a network, as a string, to a file or to an IO buffer / stream. @@ -1630,35 +1196,50 @@ Optional arguments (default values): If the current root placement is not admissible, other placements are tried. The network is updated with this new root placement, if successful. -Uses lower-level function [`writeSubTree!`](@ref). +Uses lower-level function [`writesubtree!`](@ref). """ -function writeTopology(n::HybridNetwork, file::AbstractString; append::Bool=false, - round=false::Bool, digits=3::Integer, di=false::Bool, # keyword arguments - internallabel=true::Bool) +function writenewick( + n::HybridNetwork, + file::AbstractString; + append::Bool=false, + round::Bool=false, + digits::Integer=3, + di::Bool=false, + internallabel::Bool=true +) mode = (append ? "a" : "w") s = open(file, mode) - writeTopology(n,s,round,digits,di,internallabel) + writenewick(n,s,round,digits,di,internallabel) write(s,"\n") close(s) end -function writeTopology(n::HybridNetwork; - round=false::Bool, digits=3::Integer, di=false::Bool, # keyword arguments - internallabel=true::Bool) +function writenewick( + n::HybridNetwork; + round::Bool=false, + digits::Integer=3, + di::Bool=false, + internallabel::Bool=true +) s = IOBuffer() - writeTopology(n,s,round,digits,di,internallabel) + writenewick(n,s,round,digits,di,internallabel) return String(take!(s)) end -function writeTopology(net::HybridNetwork, s::IO, - round=false::Bool, digits=3::Integer, di=false::Bool, # optional arguments - internallabel=true::Bool) +function writenewick( + net::HybridNetwork, + s::IO, + round::Bool=false, + digits::Integer=3, + di::Bool=false, + internallabel::Bool=true +) # check/find admissible root: otherwise could be trapped in infinite loop - rootsaved = net.root + rootsaved = net.rooti changeroot = false msg = "" try - directEdges!(net) + directedges!(net) catch err if isa(err, RootMismatch) println(err.msg * "\nCannot write topology with current root.") @@ -1670,10 +1251,10 @@ function writeTopology(net::HybridNetwork, s::IO, # parents of hybrid edges should be sufficient, but gives weird look #if e.hybrid i = getIndex(getparent(e), net) - net.root = i + net.rooti = i try - directEdges!(net) - print("Setting root at node $(net.node[i].number) (net.root = $i)\n\n") + directedges!(net) + print("Setting root at node $(net.node[i].number) (net.rooti = $i)\n\n") print(msg) changeroot = false break # stop loop over edges @@ -1683,18 +1264,18 @@ function writeTopology(net::HybridNetwork, s::IO, #end end if changeroot # none of hybrid edges worked - net.root = rootsaved + net.rooti = rootsaved throw(RootMismatch("Could not find admissible root. Cannot write topology.")) changeroot=false # safety exit of while (but useless) end end - if net.node[net.root].leaf + if net.node[net.rooti].leaf @warn """Root is placed at a leaf node, so the parenthetical format will look strange. Use rootatnode! or rootonedge! to change the root position """ end # finally, write parenthetical format - writeSubTree!(s,net,di,true,round,digits,internallabel) + writesubtree!(s,net,di,true,round,digits,internallabel) # namelabel = true: to print leaf & node names (labels), not numbers end @@ -1722,7 +1303,7 @@ See [`nameinternalnodes!`](@ref) to add node names. # examples ```jldoctest -julia> net = readTopology("((a:1,(b:1)#H1:1::0.8):5,(#H1:0::0.2,c:1):1);"); +julia> net = readnewick("((a:1,(b:1)#H1:1::0.8):5,(#H1:0::0.2,c:1):1);"); julia> hybridlambdaformat(net) # net is unchanged here "((a:1.0,(b:1.0)H1#0.8:1.0)I1:5.0,(H1#0.8:0.0,c:1.0)I2:1.0)I3;" @@ -1731,15 +1312,15 @@ julia> # using PhyloPlots; plot(net, shownodenumber=true) # shows that node -2 i julia> rotate!(net, -2) -julia> writeTopology(net) # now the minor edge with γ=0.2 appears first +julia> writenewick(net) # now the minor edge with γ=0.2 appears first "((#H1:0.0::0.2,c:1.0):1.0,(a:1.0,(b:1.0)#H1:1.0::0.8):5.0);" julia> hybridlambdaformat(net) "((H1#0.2:0.0,c:1.0)I2:1.0,(a:1.0,(b:1.0)H1#0.2:1.0)I1:5.0)I3;" -julia> net = readTopology("((((B)#H1:::.6)#H2,((D,C,#H2:::0.8),(#H1,A))));"); # 2 reticulations, no branch lengths +julia> net = readnewick("((((B)#H1:::.6)#H2,((D,C,#H2:::0.8),(#H1,A))));"); # 2 reticulations, no branch lengths -julia> writeTopology(net, round=true) +julia> writenewick(net, round=true) "(#H2:::0.2,((D,C,((B)#H1:::0.6)#H2:::0.8),(#H1:::0.4,A)));" julia> hybridlambdaformat(net; prefix="int") @@ -1748,13 +1329,13 @@ julia> hybridlambdaformat(net; prefix="int") """ function hybridlambdaformat(net::HybridNetwork; prefix="I") startswith(prefix, r"[a-zA-GI-Z]") || error("unsafe prefix $prefix: please start with a letter, but not H") - leafnames = tipLabels(net) + leafnames = tiplabels(net) length(Set(leafnames)) == length(leafnames) || error("taxon names must be unique: $(sort(leafnames))") net = deepcopy(net) # binding to new object for e in net.edge - if e.hybrid && e.isMajor && e.gamma == -1.0 + if e.hybrid && e.ismajor && e.gamma == -1.0 @error("edge number $(e.number) is missing gamma: will use 0.5") - setGamma!(e, 0.5) + setgamma!(e, 0.5) end end for no in net.node @@ -1762,7 +1343,7 @@ function hybridlambdaformat(net::HybridNetwork; prefix="I") no.name = "" # erase any exisiting name: especially bootstrap values end nameinternalnodes!(net, prefix) - str1 = writeTopology(net, round=true, digits=15) # internallabels=true by default + str1 = writenewick(net, round=true, digits=15) # internallabels=true by default rx_noBL = r"#(H[\w\d]+)::\d*\.?\d*(?:e[+-]?\d+)?:(\d*\.?\d*(?:e[+-]?\d+)?)" subst_noBL = s"\1#\2" rx_withBL = r"#(H[\w\d]+):(\d*\.?\d*(?:e[+-]?\d+)?):\d*\.?\d*(?:e[+-]?\d+)?:(\d*\.?\d*(?:e[+-]?\d+)?)" @@ -1785,35 +1366,36 @@ function hybridlambdaformat(net::HybridNetwork; prefix="I") end """ - nameinternalnodes!(net::HybridNetwork, prefix) + nameinternalnodes!(net::HybridNetwork, prefix="i") Add names to nodes in `net` that don't already have a name. Leaves already have names; but if not, they will be given names as well. -New node names will be of the form "prefixI" where I is an integer. +New node names will be of the form "prefixk" where `k` is an integer. +So by default, new node names will be of the form "i1", "i2", etc. # examples ```jldoctest -julia> net = readTopology("((a:1,(b:1)#H1:1::0.8):5,(#H1:0::0.2,c:1):1);"); +julia> net = readnewick("((a:1,(b:1)#H1:1::0.8):5,(#H1:0::0.2,c:1):1);"); -julia> PhyloNetworks.nameinternalnodes!(net, "I") # by default, shown without internal node names +julia> nameinternalnodes!(net, "I") # by default, shown without internal node names HybridNetwork, Rooted Network 7 edges 7 nodes: 3 tips, 1 hybrid nodes, 3 internal tree nodes. tip labels: a, b, c ((a:1.0,(b:1.0)#H1:1.0::0.8)I1:5.0,(#H1:0.0::0.2,c:1.0)I2:1.0)I3; -julia> writeTopology(net; internallabel=false) # by default, writeTopology shows internal names if they exist +julia> writenewick(net; internallabel=false) # by default, writenewick shows internal names if they exist "((a:1.0,(b:1.0)#H1:1.0::0.8):5.0,(#H1:0.0::0.2,c:1.0):1.0);" -julia> net = readTopology("((int5:1,(b:1)#H1:1::0.8):5,(#H1:0::0.2,c:1):1);"); # one taxon name starts with "int" +julia> net = readnewick("((int5:1,(b:1)#H1:1::0.8):5,(#H1:0::0.2,c:1):1);"); # one taxon name starts with "int" -julia> PhyloNetworks.nameinternalnodes!(net, "int"); +julia> nameinternalnodes!(net, "int"); -julia> writeTopology(net) +julia> writenewick(net) "((int5:1.0,(b:1.0)#H1:1.0::0.8)int6:5.0,(#H1:0.0::0.2,c:1.0)int7:1.0)int8;" ``` """ -function nameinternalnodes!(net::HybridNetwork, prefix) +function nameinternalnodes!(net::HybridNetwork, prefix="i") # get maximum index I of nodes whose names are already like: prefixI rx = Regex("^$(prefix)(\\d+)\$") nexti = 1 diff --git a/src/recursion_matrices.jl b/src/recursion_matrices.jl new file mode 100644 index 000000000..8b82e1b7d --- /dev/null +++ b/src/recursion_matrices.jl @@ -0,0 +1,317 @@ +""" + MatrixTopologicalOrder + +Matrix associated to a [`HybridNetwork`](@ref) in which rows and/or columns +correspond to nodes in the network. In this matrix, nodes are indexed by +their topological order. +For example, if rows list nodes in network `net`, then `V[i,:]` corresponds to +node `net.vec_node[i]`. + +The following functions and extractors can be applied to it: +[`tiplabels`](@ref), +`obj[:Tips]`, `obj[:InternalNodes]`, `obj[:TipsNodes]`. +See documentation for [`getindex(::MatrixTopologicalOrder, ::Symbol)`](@ref)). + +A `MatrixTopologicalOrder` object has field +`V` (the matrix of interest) +and fields for mapping indices in `V` to node numbers +`nodeNumbersTopOrder`, +`internalNodeNumbers`, +`tipNumbers`, +`tipNames`, +`indexation`. +Type in "?MatrixTopologicalOrder.field" to get documentation on a specific field. +""" +struct MatrixTopologicalOrder + "V: the matrix per se. V[i,:] and/or V[:,i] has data for the i-th node in topological order." + V::Matrix + "vector of node numbers, with nodes listed in topological order as in V" + nodeNumbersTopOrder::Vector{Int} # for ordering of the matrix + "vector of internal node numbers, as listed in net.node" + internalNodeNumbers::Vector{Int} + "vector of tip numbers, listed in the same order as in net.node (should be same as in net.leaf...)" + tipNumbers::Vector{Int} + "vector of tip names, listed in the same order as in net.node" + tipNames::Vector + """ + indexation: a string giving the type of matrix `V`: + - `:r`: rows only are indexed by the network nodes + - `:c`: columns only are indexed by the network nodes + - `:b`: both rows and columns are indexed by nodes. + """ + indexation::Symbol +end + +function Base.show(io::IO, obj::MatrixTopologicalOrder) + println(io, "$(typeof(obj)):\n$(obj.V)") +end + +tiplabels(obj::MatrixTopologicalOrder) = obj.tipNames + +function MatrixTopologicalOrder(V::Matrix, net::HybridNetwork, indexation) + length(net.vec_node) == length(net.node) || + error("run preorder! on the network first") + nodenumbers_internal = Int[] + nodenumbers_leaves = Int[] + for n in net.node + push!((n.leaf ? nodenumbers_leaves : nodenumbers_internal), n.number) + end + return MatrixTopologicalOrder( + V, + [n.number for n in net.vec_node], + nodenumbers_internal, + nodenumbers_leaves, + [n.name for n in net.leaf], + indexation + ) +end + +""" + getindex(obj::MatrixTopologicalOrder, + d::Symbol,[ indTips, nonmissing]) + +Get submatrices of a [`MatrixTopologicalOrder`](@ref) object. +In `obj.V`, row and/column `i` corresponds to the `i`th node in topological order. +In contrast, in matrix `obj[:tips]` for example, +row and/or column `i` corresponds to the `i`th tip when tips are listed in the +same order as in the network's original `.node` vector. + +Arguments: + +- `obj::MatrixTopologicalOrder`: the matrix from which to extract. +- `d::Symbol`: a symbol specifying which sub-matrix to extract. Can be: + * `:Tips` columns and/or rows corresponding to the tips + * `:InternalNodes` columns and/or rows corresponding to the internal nodes + Includes tips not listed in `indTips` or missing data according to `nonmissing`. + * `:TipsNodes` columns corresponding to internal nodes, and row to tips (works only is indexation="b") +- `indTips::Vector{Int}`: optional argument precising a specific order for the tips (internal use). +- `nonmissing::BitArray{1}`: optional argument saying which tips have data (internal use). + Tips with missing data are treated as internal nodes. +""" +function Base.getindex( + obj::MatrixTopologicalOrder, + d::Symbol, + indTips::Vector{Int}=collect(1:length(obj.tipNumbers)), + nonmissing::BitArray{1}=trues(length(obj.tipNumbers)) +) + tipnums = obj.tipNumbers[indTips][nonmissing] + maskTips = indexin(tipnums, obj.nodeNumbersTopOrder) + if d == :Tips # Extract rows and/or columns corresponding to the tips with data + obj.indexation == :b && return obj.V[maskTips, maskTips] # both columns and rows are indexed by nodes + obj.indexation == :c && return obj.V[:, maskTips] # Only the columns + obj.indexation == :r && return obj.V[maskTips, :] # Only the rows + end + intnodenums = [obj.internalNodeNumbers ; setdiff(obj.tipNumbers, tipnums)] + maskNodes = indexin(intnodenums, obj.nodeNumbersTopOrder) + #= indices in obj.nodeNumbersTopOrder, in this order: + 1. internal nodes, in the same order as in obj.internalNodeNumbers, + that is, same order as in net.node (excluding leaves) + 2. tips absent from indTips or missing data according to nonmissing, + in the same order as in obj.tipNumbers. + =# + if d == :InternalNodes # Idem, for internal nodes + obj.indexation == :b && return obj.V[maskNodes, maskNodes] + obj.indexation == :c && return obj.V[:, maskNodes] + obj.indexation == :r && return obj.V[maskNodes, :] + end + if d == :TipsNodes + obj.indexation == :b && return obj.V[maskTips, maskNodes] + obj.indexation == :c && error("""Both rows and columns must be net + ordered to take the submatrix tips vs internal nodes.""") + obj.indexation == :r && error("""Both rows and columns must be net + ordered to take the submatrix tips vs internal nodes.""") + end + d == :All && return obj.V +end + +""" + vcv(net::HybridNetwork; model::AbstractString="BM", + corr::Bool=false, + checkpreorder::Bool=true) + +This function computes the variance covariance matrix between the tips of the +network, assuming a Brownian model of trait evolution (with unit variance). +If optional argument `corr` is set to `true`, then the correlation matrix is returned instead. + +The function returns a `DataFrame` object, with columns named by the tips of the network. + +The calculation of the covariance matrix requires a pre-ordering of nodes to be fast. +If `checkpreorder` is true (default), then [`preorder!`](@ref) is run on the network beforehand. +Otherwise, the network is assumed to be already in pre-order. + +This function internally calls [`sharedpathmatrix`](@ref), which computes the variance +matrix between all the nodes of the network. + +# Examples + +```jldoctest +julia> tree_str = "(((t2:0.14,t4:0.33):0.59,t3:0.96):0.14,(t5:0.70,t1:0.18):0.90);"; + +julia> tree = readnewick(tree_str); + +julia> C = vcv(tree) +5×5 DataFrame + Row │ t2 t4 t3 t5 t1 + │ Float64 Float64 Float64 Float64 Float64 +─────┼───────────────────────────────────────────── + 1 │ 0.87 0.73 0.14 0.0 0.0 + 2 │ 0.73 1.06 0.14 0.0 0.0 + 3 │ 0.14 0.14 1.1 0.0 0.0 + 4 │ 0.0 0.0 0.0 1.6 0.9 + 5 │ 0.0 0.0 0.0 0.9 1.08 + +``` + +The following block needs `ape` to be installed (not run): + +```julia +julia> using RCall # Comparison with ape vcv function + +julia> R"ape::vcv(ape::read.tree(text = \$tree_str))" +RCall.RObject{RCall.RealSxp} + t2 t4 t3 t5 t1 +t2 0.87 0.73 0.14 0.0 0.00 +t4 0.73 1.06 0.14 0.0 0.00 +t3 0.14 0.14 1.10 0.0 0.00 +t5 0.00 0.00 0.00 1.6 0.90 +t1 0.00 0.00 0.00 0.9 1.08 + +``` + +The covariance can also be calculated on a network +(for the model, see Bastide et al. 2018) +```jldoctest +julia> net = readnewick("((t1:1.0,#H1:0.1::0.30):0.5,((t2:0.9)#H1:0.2::0.70,t3:1.1):0.4);"); + +julia> C = vcv(net) +3×3 DataFrame + Row │ t1 t2 t3 + │ Float64 Float64 Float64 +─────┼─────────────────────────── + 1 │ 1.5 0.15 0.0 + 2 │ 0.15 1.248 0.28 + 3 │ 0.0 0.28 1.5 +``` +""" +function vcv( + net::HybridNetwork; + model::AbstractString="BM", + corr::Bool=false, + checkpreorder::Bool=true +) + @assert (model == "BM") "The 'vcv' function only works for a BM process (for now)." + V = sharedpathmatrix(net; checkpreorder=checkpreorder) + C = V[:Tips] + corr && StatsBase.cov2cor!(C, sqrt.(diag(C))) + Cd = DataFrame(C, map(Symbol, V.tipNames)) + return(Cd) +end + + +""" + sharedpathmatrix(net::HybridNetwork; checkpreorder::Bool=true) + +This function computes the shared path matrix between all the nodes of a +network. It assumes that the network is in the pre-order. If checkpreorder is +true (default), then it runs function `preorder!` on the network beforehand. + +Returns an object of type [`MatrixTopologicalOrder`](@ref). + +""" +function sharedpathmatrix(net::HybridNetwork; checkpreorder::Bool=true) + check_nonmissing_nonnegative_edgelengths(net, + """The variance-covariance matrix of the network is not defined. + A phylogenetic regression cannot be done.""") + checkpreorder && preorder!(net) + V = traversal_preorder( + net.vec_node, + init_sharedpathmatrix, + traversalupdate_default!, + updatetree_sharedpathmatrix!, + updatehybrid_sharedpathmatrix!, + ) + M = MatrixTopologicalOrder(V, net, :b) # nodes in both columns & rows + return M +end + +function init_sharedpathmatrix(nodes::Vector{Node},) + n = length(nodes) + return(zeros(Float64,n,n)) +end + +function updatetree_sharedpathmatrix!( + V::Matrix, + i::Int, + parentIndex::Int, + edge::Edge, +) + for j in 1:(i-1) + V[i,j] = V[j,parentIndex] + V[j,i] = V[j,parentIndex] + end + V[i,i] = V[parentIndex,parentIndex] + edge.length + return true +end + +function updatehybrid_sharedpathmatrix!( + V::Matrix, + i::Int, + parindx::AbstractVector{Int}, + paredge::AbstractVector{Edge}, +) + for j in 1:(i-1) + for (pi,pe) in zip(parindx, paredge) + V[i,j] += pe.gamma * V[pi,j] + end + V[j,i] = V[i,j] + end + for k1 in eachindex(paredge) + p1i = parindx[k1] + p1e = paredge[k1] + V[i,i] += p1e.gamma^2 * (V[p1i,p1i] + p1e.length) + for k2 in (k1+1):length(paredge) + V[i,i] += 2 * p1e.gamma * paredge[k2].gamma * V[p1i,parindx[k2]] + end + end + return true +end + +""" + descendencematrix(net::HybridNetwork; checkpreorder::Bool=true) + +Descendence matrix between all the nodes of a network: +object `D` of type [`MatrixTopologicalOrder`](@ref) in which +`D[i,j]` is the proportion of genetic material in node `i` that can be traced +back to node `j`. If `D[i,j]>0` then `j` is a descendent of `i` (and `j` is +an ancestor of `i`). +The network is assumed to be pre-ordered if `checkpreorder` is false. +If `checkpreorder` is true (default), `preorder!` is run on the network beforehand. +""" +function descendencematrix(net::HybridNetwork; checkpreorder::Bool=true) + checkpreorder && preorder!(net) + V = traversal_postorder( + net.vec_node, + initDescendenceMatrix, + traversalupdate_default!, # does nothing + updateNodeDescendenceMatrix!, + ) + M = MatrixTopologicalOrder(V, net, :r) # nodes in rows + return M +end + +function updateNodeDescendenceMatrix!( + V::Matrix, + i::Int, + childrenIndex::Vector{Int}, + edges::Vector{Edge}, +) + for j in 1:length(edges) + V[:,i] .+= edges[j].gamma .* V[:,childrenIndex[j]] + end + return true +end + +function initDescendenceMatrix(nodes::Vector{Node},) + n = length(nodes) + return(Matrix{Float64}(I, n, n)) # identity matrix +end diff --git a/src/recursion_routines.jl b/src/recursion_routines.jl new file mode 100644 index 000000000..e6b65033d --- /dev/null +++ b/src/recursion_routines.jl @@ -0,0 +1,185 @@ +""" + traversal_preorder(nodes, init_function, root_function, tree_node_function, + hybrid_node_function, parameters...) + traversal_preorder!(nodes, output_array, root_function, tree_node_function, + hybrid_node_function, parameters...) + preorder_nodeupdate!(node_index, nodes, output_array, root_function, tree_node_function, + hybrid_node_function, parameters...) + +Generic tool to apply a pre-order (or topological ordering) algorithm. +Used by `sharedpathmatrix` and by `pairwisetaxondistancematrix`, for example. +`preorder_nodeupdate!` is a helper that calls the root / tree node / hybrid node +function as appropriate. + +output: array object `output_array`. + +arguments: +- `nodes`: array of nodes in the network, pre-ordered, typically the internal + `net.vec_node` after applying `preorder!(net)` +- `output_array`: output object, of type `AbstractArray`, named `V` below +- `init_function`: to initialize the output array, taking `(nodes, parameters...)` + as arguments +- `root_function`: to do whatever needs to be done to `V` at the root, using + `(V, rootnode_index, parameters...)` as arguments +- `tree_node_function`: to do whatever needs to be done to `V` at a tree node, + using `(V, treenode_index, parentnode_index, parentedge, parameters...)` + as arguments +- `hybrid_node_function`: to do whatever needs to be done to `V` at a hybrid + node, using arguments + `(V, hybnode_index, parentnodes_index_vector, parentedges_vector, parameters...)` + +The last 3 functions should return a boolean. If true: traversal continues. +If false: traversal is stopped, that is, the next node is not processed. + +See also [`traversal_postorder`](@ref PhyloNetworks.traversal_postorder), and +[`traversalupdate_default!`](@ref PhyloNetworks.traversalupdate_default!) +for a default function that does nothing to `V` and returns true, +with an adequate signature to be used here. +""" +function traversal_preorder( + nodes::Vector{Node}, + init::Function, + updateRoot::Function, + updateTree::Function, + updateHybrid::Function, + params... +) + M = init(nodes, params...) + traversal_preorder!(nodes, M, updateRoot, updateTree, updateHybrid, params...) +end + +@doc (@doc traversal_preorder) traversal_preorder! +function traversal_preorder!( + nodes::Vector{Node}, + M::AbstractArray, + updateRoot::Function, + updateTree::Function, + updateHybrid::Function, + params... +) + for i in 1:length(nodes) # nodes should be listed in topological order + preorder_nodeupdate!(i, nodes, M, updateRoot, updateTree, updateHybrid, params...) || break + end + return M +end + +@doc (@doc traversal_preorder) preorder_nodeupdate! +function preorder_nodeupdate!( + i::Int, + nodes::Vector{Node}, + V::AbstractArray, + updateRoot::Function, + updateTree::Function, + updateHybrid::Function, + params... +) + parnode = Node[] # will be the vector of parent nodes (empty, size 1 or 2) + paredge = Edge[] + parindx = Int[] # index(es) of parent node(s) in `nodes` + keepgoing=true # true/false returned from each recursion function to determine if we can stop + for e in nodes[i].edge + ischildof(nodes[i], e) || continue + push!(paredge, e) + pn = getparent(e) + push!(parnode, pn) + push!(parindx, getIndex(pn, nodes)) + end + if isempty(parnode) # nodes[i] is root + keepgoing=updateRoot(V, i, params...) + elseif length(parnode) == 1 # nodes[i] is a tree node + keepgoing=updateTree(V, i, parindx[1], paredge[1], params...) + elseif length(parnode) > 1 # nodes[i] is a hybrid node + for e in paredge + e.hybrid || error("edge $(e.number), parent of node $(nodes[i].number), should be hybrid") + end + keepgoing = updateHybrid(V, i, parindx, paredge, params...) + end + return keepgoing +end + +""" + traversalupdate_default!(::AbstractArray, ::Int, args...) + +Returns `true`. With its signature, this function can be used as a default +update function at any node (root/tree/hybrid) in [`traversal_preorder`](@ref PhyloNetworks.traversal_preorder) +or [`traversal_postorder`](@ref PhyloNetworks.traversal_postorder), +if we need a function that does nothing and keeps the traversal going. +""" +function traversalupdate_default!(::AbstractArray, ::Int, params...) + return true +end + +""" + traversal_postorder(nodes, init_function, + tip_function, internalnode_function, parameters...) + postorder_nodeupdate!(node_index, nodes, output_array, + tip_function, internalnode_function, parameters...) + +Generic tool to apply a post-order (or reverse topological ordering) algorithm, +acting on a matrix where rows & columns correspond to nodes. +Used by [`descendencematrix`](@ref). + +output: matrix `output_array`. + +arguments: +- `nodes`: array of nodes in the network, pre-ordered, typically the internal + `net.vec_node` after applying `preorder!(net)`. + This array is traversed in reverse order. +- `output_array`: output object, of type `Matrix`, named `V` below +- `init_function`: to initialize the output array, taking `(nodes, parameters...)` + as arguments +- `tip_function`: to do whatever needs to be done to `V` at a leaf node, + using `(V, tip_index, parameters...)` as arguments +- `internalnode_function`: to do whatever needs to be done to `V` at an internal + node, using arguments + `(V, node_index, childnodes_index_vector, childedges_vector, parameters...)` + +The last 3 functions should return a boolean. If true: traversal continues. +If false: traversal is stopped, that is, the next node is not processed. + +See also [`traversal_preorder`](@ref PhyloNetworks.traversal_preorder), and +[`traversalupdate_default!`](@ref PhyloNetworks.traversalupdate_default!) +for a default function that does nothing to `V` and returns true, +with an adequate signature to be used here. +""" +function traversal_postorder( + nodes::Vector{Node}, + init::Function, + updatetip::Function, + updateinternalnode::Function, + params... +) + n = length(nodes) + M = init(nodes, params...) + for i in n:-1:1 #sorted list of nodes + postorder_nodeupdate!(i, nodes, M, updatetip, updateinternalnode, params...) || break + end + return M +end +@doc (@doc traversal_postorder) postorder_nodeupdate! +function postorder_nodeupdate!( + i::Int, + nodes::Vector{Node}, + V::Matrix, + updatetip::Function, + updateinternalnode::Function, + params... +) + chnode = Node[] # will be the vector of child nodes (empty, size 1 or 2) + chedge = Edge[] + chindx = Int[] # index(es) of child node(s) in `nodes` + keepgoing=true # true/false returned from each recursion function to determine if we can stop + for e in nodes[i].edge + isparentof(nodes[i], e) || continue + push!(chedge, e) + cn = getchild(e) + push!(chnode, cn) + push!(chindx, getIndex(cn, nodes)) + end + if isempty(chnode) # nodes[i] is a tip + keepgoing = updatetip(V, i, params...) + else + keepgoing = updateinternalnode(V, i, chindx, chedge, params...) + end + return keepgoing +end diff --git a/src/snaq_optimization.jl b/src/snaq_optimization.jl deleted file mode 100644 index f79167863..000000000 --- a/src/snaq_optimization.jl +++ /dev/null @@ -1,1992 +0,0 @@ -# functions for numerical/heuristic optimization -# originally in functions.jl -# Claudia March 2015 - - -const move2int = Dict{Symbol,Int}(:add=>1,:MVorigin=>2,:MVtarget=>3,:CHdir=>4,:delete=>5, :nni=>6) -const int2move = Dict{Int,Symbol}(move2int[k]=>k for k in keys(move2int)) -""" -default values for tolerance parameters, -used in the optimization of branch lengths (fAbs, fRel, xAbs, xRel) -and in the acceptance of topologies (likAbs, numFails). - -if changes are made here, **make the same** in the docstring for snaq! below - -version | fAbs | fRel | xAbs | xRel | numFails | likAbs | multiplier ---------|------|------|------|------|----------|--------|----------- -v0.5.1 | 1e-6 | 1e-6 | 1e-3 | 1e-2 | 75 | 1e-6 | -v0.3.0 | 1e-6 | 1e-5 | 1e-4 | 1e-3 | 100 | 0.01 | -v0.0.1 | 1e-6 | 1e-5 | 1e-4 | 1e-3 | 100 | | 10000 -older | 1e-10| 1e-12| 1e-10| 1e-10| - -v0.5.1: based on Nan Ji's work. same xAbs and xRel as in phylonet (as of 2015). -earlier: multiplier was used; later: likAbs = multiplier*fAbs) -"older": values from GLM.jl, Prof Bates - -default values used on a single topology, to optimize branch lengths -and gammas, at the very end of snaq!, and by -topologyMaxQPseudolik! since v0.5.1. - -version | fAbsBL | fRelBL | xAbsBL | xRelBL ---------|--------|--------|--------|------- -v0.0.1 | 1e-10 | 1e-12 | 1e-10 | 1e-10 -""" -const fAbs = 1e-6 -const fRel = 1e-6 -const xAbs = 1e-3 -const xRel = 1e-2 -const numFails = 75 # number of failed proposals allowed before stopping the procedure (like phylonet) -const numMoves = Int[] #empty to be calculated inside based on coupon's collector -const likAbs = 1e-6 # loglik absolute tolerance to accept new topology - -const fAbsBL = 1e-10 -const fRelBL = 1e-12 -const xAbsBL = 1e-10 -const xRelBL = 1e-10 -# ---------------------- branch length optimization --------------------------------- - -# function to get the branch lengths/gammas to optimize for a given network -# warning: order of parameters (h,t,gammaz) -# updates net.numht also with the number of hybrid nodes and number of identifiable edges (n2,n,hzn) -function parameters(net::Network) - t = Float64[] - h = Float64[] - n = Int[] - n2 = Int[] - hz = Float64[] - hzn = Int[] - indxt = Int[] - indxh = Int[] - indxhz = Int[] - for e in net.edge - if(e.istIdentifiable) - push!(t,e.length) - push!(n,e.number) - push!(indxt, getIndex(e,net)) - end - if(e.hybrid && !e.isMajor) - node = e.node[e.isChild1 ? 1 : 2] - node.hybrid || error("strange thing, hybrid edge $(e.number) pointing at tree node $(node.number)") - if(!node.isBadDiamondI) - push!(h,e.gamma) - push!(n2,e.number) - push!(indxh, getIndex(e,net)) - else - if(node.isBadDiamondI) - edges = hybridEdges(node) - push!(hz,getOtherNode(edges[1],node).gammaz) - push!(hz,getOtherNode(edges[2],node).gammaz) - push!(hzn,parse(Int,string(string(node.number),"1"))) - push!(hzn,parse(Int,string(string(node.number),"2"))) - push!(indxhz,getIndex(getOtherNode(edges[1],node),net)) - push!(indxhz,getIndex(getOtherNode(edges[2],node),net)) - end - end - end - end - # size(t,1) > 0 || @warn "net does not have identifiable branch lengths" - return vcat(h,t,hz),vcat(n2,n,hzn),vcat(indxh,indxt,indxhz) -end - -function parameters!(net::Network) - #@warn "deleting net.ht,net.numht and updating with current edge lengths (numbers)" - net.ht,net.numht,net.index = parameters(net) - return net.ht -end - - -# function to update qnet.indexht,qnet.index based on net.numht -# warning: assumes net.numht is updated already with parameters!(net) -function parameters!(qnet::QuartetNetwork, net::HybridNetwork) - size(net.numht,1) > 0 || error("net.numht not correctly updated, need to run parameters first") - @debug (size(qnet.indexht,1) == 0 ? "" : - "deleting qnet.indexht to replace with info in net") - nh = net.numht[1 : net.numHybrids - net.numBad] - k = sum([e.istIdentifiable ? 1 : 0 for e in net.edge]) - nt = net.numht[net.numHybrids - net.numBad + 1 : net.numHybrids - net.numBad + k] - nhz = net.numht[net.numHybrids - net.numBad + k + 1 : length(net.numht)] - qnh = Int[] - qnt = Int[] - qnhz = Int[] - qindxh = Int[] - qindxt = Int[] - qindxhz = Int[] - if(qnet.numHybrids == 1 && qnet.hybrid[1].isBadDiamondI) - ind1 = parse(Int,string(string(qnet.hybrid[1].number),"1")) - ind2 = parse(Int,string(string(qnet.hybrid[1].number),"2")) - i = findfirst(isequal(ind1), nhz) - i != nothing || error("ind1 not found in nhz") - edges = hybridEdges(qnet.hybrid[1]) - push!(qnhz,i+net.numHybrids-net.numBad+k) - push!(qnhz,i+1+net.numHybrids-net.numBad+k) - push!(qindxhz,getIndex(getOtherNode(edges[1],qnet.hybrid[1]),qnet)) - push!(qindxhz,getIndex(getOtherNode(edges[2],qnet.hybrid[1]),qnet)) - else - found = false - for n in qnet.hybrid - if(n.isBadDiamondI) - ind1 = parse(Int,string(string(n.number),"1")) - ind2 = parse(Int,string(string(n.number),"2")) - i = findfirst(isequal(ind1), nhz) - i != nothing || error("ind1 not found in nhz") - edges = hybridEdges(n) - push!(qnhz,i+net.numHybrids-net.numBad+k) - push!(qnhz,i+1+net.numHybrids-net.numBad+k) - push!(qindxhz,getIndex(getOtherNode(edges[1],n),qnet)) - push!(qindxhz,getIndex(getOtherNode(edges[2],n),qnet)) - found = true - break - end - end - if(!found) - all((n -> !n.isBadDiamondI),qnet.hybrid) || error("cannot have bad diamond I hybrid nodes in this qnet, case dealt separately before") - for e in qnet.edge - if(e.istIdentifiable) - enum_in_nt = findfirst(isequal(e.number), nt) - if isnothing(enum_in_nt) - error("identifiable edge $(e.number) in qnet not found in net") - end - push!(qnt, enum_in_nt + net.numHybrids - net.numBad) - push!(qindxt, getIndex(e,qnet)) - end - if(!e.istIdentifiable && all((n->!n.leaf),e.node) && !e.hybrid && e.fromBadDiamondI) # tree edge not identifiable but internal with length!=0 (not bad diamII nor bad triangle) - enum_in_nhz = findfirst(isequal(e.number), nhz) - if isnothing(enum_in_nhz) - error("internal edge $(e.number) corresponding to gammaz in qnet not found in net.ht") - end - push!(qnhz, enum_in_nhz + net.numHybrids - net.numBad + k) - push!(qindxhz, getIndex(e,qnet)) - end - if(e.hybrid && !e.isMajor) - node = e.node[e.isChild1 ? 1 : 2] - node.hybrid || error("strange hybrid edge $(e.number) poiting to tree node $(node.number)") - enum_in_nh = findfirst(isequal(e.number), nh) - found = (enum_in_nh != nothing) - found ? push!(qnh, enum_in_nh) : nothing - found ? push!(qindxh, getIndex(e,qnet)) : nothing - end - end # for qnet.edge - end # not found - end - qnet.indexht = vcat(qnh,qnt,qnhz) - qnet.index = vcat(qindxh,qindxt,qindxhz) - length(qnet.indexht) == length(qnet.index) || error("strange in setting qnet.indexht and qnet.index, they do not have same length") -end - - -# function to compare a vector of parameters with the current vector in net.ht -# to know which parameters were changed -function changed(net::HybridNetwork, x::Vector{Float64}) - if(length(net.ht) == length(x)) - #@debug "inside changed with net.ht $(net.ht) and x $(x)" - return [!approxEq(net.ht[i],x[i]) for i in 1:length(x)] - else - error("net.ht (length $(length(net.ht))) and vector x (length $(length(x))) need to have same length") - end -end - - -# function to update a QuartetNetwork for a given -# vector of parameters based on a boolean vector "changed" -# which shows which parameters have changed -function update!(qnet::QuartetNetwork,x::Vector{Float64}, net::HybridNetwork) - ch = changed(net,x) - length(x) == length(ch) || error("x (length $(length(x))) and changed $(length(changed)) should have the same length") - length(ch) == length(qnet.hasEdge) || error("changed (length $(length(changed))) and qnet.hasEdge (length $(length(qnet.hasEdge))) should have same length") - qnet.changed = false - k = sum([e.istIdentifiable ? 1 : 0 for e in net.edge]) - for i in 1:length(ch) - qnet.changed |= (ch[i] & qnet.hasEdge[i]) - end - #DEBUGC && @debug "inside update!, qnet.changed is $(qnet.changed), ch $(ch) and qnet.hasEdge $(qnet.hasEdge), $(qnet.quartetTaxon), numHyb $(qnet.numHybrids)" - if(qnet.changed) - if(any([n.isBadDiamondI for n in qnet.hybrid])) # qnet.indexht is only two values: gammaz1,gammaz2 #FIXIT: this could crash if hybrid for bad diamond should disappear after cleaning qnet - @debug "it is inside update! and identifies that ht changed and it is inside the bad diamond I case" - length(qnet.indexht) == 2 || error("strange qnet from bad diamond I with hybrid node, it should have only 2 elements: gammaz1,gammaz2, not $(length(qnet.indexht))") - for i in 1:2 - 0 <= x[qnet.indexht[i]] <= 1 || error("new gammaz value should be between 0,1: $(x[qnet.indexht[i]]).") - @debug (x[qnet.indexht[1]] + x[qnet.indexht[2]] <= 1 ? "" : - "warning: new gammaz should add to less than 1: $(x[qnet.indexht[1]] + x[qnet.indexht[2]])") - qnet.node[qnet.index[i]].gammaz = x[qnet.indexht[i]] - end - else - for i in 1:length(qnet.indexht) - if(qnet.indexht[i] <= net.numHybrids - net.numBad) - 0 <= x[qnet.indexht[i]] <= 1 || error("new gamma value should be between 0,1: $(x[qnet.indexht[i]]).") - qnet.edge[qnet.index[i]].hybrid || error("something odd here, optimizing gamma for tree edge $(qnet.edge[qnet.index[i]].number)") - setGamma!(qnet.edge[qnet.index[i]],x[qnet.indexht[i]], true) - elseif(qnet.indexht[i] <= net.numHybrids - net.numBad + k) - setLength!(qnet.edge[qnet.index[i]],x[qnet.indexht[i]]) - else - DEBUGC && @debug "updating qnet parameters, found gammaz case when hybridization has been removed" - 0 <= x[qnet.indexht[i]] <= 1 || error("new gammaz value should be between 0,1: $(x[qnet.indexht[i]]).") - #x[qnet.indexht[i]] + x[qnet.indexht[i]+1] <= 1 || @warn "new gammaz value should add to less than 1: $(x[qnet.indexht[i]]) $(x[qnet.indexht[i]+1])." - if(approxEq(x[qnet.indexht[i]],1.0)) - setLength!(qnet.edge[qnet.index[i]],10.0) - else - setLength!(qnet.edge[qnet.index[i]],-log(1-x[qnet.indexht[i]])) - end - end - end - end - end -end - -# function to update the branch lengths/gammas for a network -# warning: order of parameters (h,t) -function update!(net::HybridNetwork, x::Vector{Float64}) - if(length(x) == length(net.ht)) - net.ht = deepcopy(x) # to avoid linking them - else - error("net.ht (length $(length(net.ht))) and x (length $(length(x))) must have the same length") - end -end - -# function to update the branch lengths and gammas in a network after -# the optimization -# warning: optBL need to be run before, note that -# xmin will not be in net.ht (net.ht is one step before) -function updateParameters!(net::HybridNetwork, xmin::Vector{Float64}) - length(xmin) == length(net.ht) || error("xmin vector should have same length as net.ht $(length(net.ht)), not $(length(xmin))") - net.ht = xmin - k = sum([e.istIdentifiable ? 1 : 0 for e in net.edge]) - for i in 1:length(net.ht) - if(i <= net.numHybrids - net.numBad) - 0 <= net.ht[i] <= 1 || error("new gamma value should be between 0,1: $(net.ht[i]).") - net.edge[net.index[i]].hybrid || error("something odd here, optimizing gamma for tree edge $(net.edge[net.index[i]].number)") - setGamma!(net.edge[net.index[i]],net.ht[i], true) - elseif(i <= net.numHybrids - net.numBad + k) - setLength!(net.edge[net.index[i]],net.ht[i]) - else - 0 <= net.ht[i] <= 1 || error("new gammaz value should be between 0,1: $(net.ht[i]).") - net.node[net.index[i]].gammaz = net.ht[i] - end - end -end - -# function to update the attribute net.loglik -function updateLik!(net::HybridNetwork, l::Float64) - net.loglik = l -end - -# function for the upper bound of ht -function upper(net::HybridNetwork) - k = sum([e.istIdentifiable ? 1 : 0 for e in net.edge]) - return vcat(ones(net.numHybrids-net.numBad), repeat([10],inner=[k]), - ones(length(net.ht)-k-net.numHybrids+net.numBad)) -end - -# function to calculate the inequality gammaz1+gammaz2 <= 1 -function calculateIneqGammaz(x::Vector{Float64}, net::HybridNetwork, ind::Integer, verbose::Bool) - k = sum([e.istIdentifiable ? 1 : 0 for e in net.edge]) - hz = x[net.numHybrids - net.numBad + k + 1 : length(x)] - if verbose # goes to stdout - println("enters calculateIneqGammaz with hz $(hz), and hz[ind*2] + hz[ind*2-1] - 1 = $(hz[ind*2] + hz[ind*2-1] - 1)") - else # goes to logger (if debug messages are turned on by user) - @debug "enters calculateIneqGammaz with hz $(hz), and hz[ind*2] + hz[ind*2-1] - 1 = $(hz[ind*2] + hz[ind*2-1] - 1)" - end - hz[ind*2] + hz[ind*2-1] - 1 -end - -# numerical optimization of branch lengths given a network (or tree) -# and data (set of quartets with obsCF) -# using BOBYQA from NLopt package -# warning: this function assumes that the network has all the good attributes set. It will not be efficient to re-read the network inside -# to guarantee all the correct attributes, because this is done over and over inside snaq -# also, net is modified inside to set its attribute net.loglik equal to the min -""" -`optBL` road map - -Function that optimizes the numerical parameters (branch lengths and inheritance probabilities) for a given network. This function is called multiple times inside `optTopLevel!`. - -- Input: network `net`, data `d` -- Numerical tolerances: `ftolAbs, ftolRel, xtolAbs, xtolRel` -- Function based on `MixedModels` `fit` function -- The function assumes `net` has all the right attributes, and cannot check this inside because it would be inefficient - -Procedure: - -- `ht = parameters!(net)` extracts the vector of parameters to estimate `(h,t,gammaz)`, and sets as `net.ht`; identifies a bad diamond I, sets `net.numht` (vector of hybrid node numbers for h, edge numbers for t, hybrid node numbers for gammaz), and `net.index` to keep track of the vector of parameters to estimate -- `extractQuartet!(net,d)` does the following for all quartets in `d.quartet`: - - Extract quartet by deleting all leaves not in q -> create `QuartetNetwork` object saved in `q.qnet` - - This network is ugly and does not have edges collapsed. This is done to keep a one-to-one correspondence between the edges in `q.qnet` and the edges in `net` (if we remove nodes with only two edges, we will lose this correspondence) - - Calculate expected CF with `calculateExpCFAll` for a copy of `q.qnet`. We do this copy because we want to keep `q.qnet` as it is (without collapsed edges into one). The function will then save the `expCF` in `q.qnet.expCF` -- `calculateExpCFAll!(qnet)` will - - identify the type of quartet as type 1 (equivalent to a tree) or type 2 (minor CF different). - Here the code will first clean up any hybrid node by removing nodes with only two edges before - identifying the `qnet` (because identification depends on neighbor nodes to hybrid node); - later, set `qnet.which` (1 or 2), `node.prev` (neighbor node to hybrid node), - updates `node.k` (number of nodes in hybridization cycle, this can change after deleting the nodes with only two edges), - `node.typeHyb` (1,2,3,4,5 depending on the number of nodes in the hybridization cycle - and the origin/target of the minor hybrid edge; this attribute is never used). - - eliminate hybridization: this will remove type 1 hybridizations first. - If `qnet.which=1`, then the `qnet` is similar to a tree quartet, - so it will calculate the internal length of the tree quartet: `qnet.t1`. - - update split for `qnet.which=1`, to determine which taxa are together. - For example, for the quartet 12|34, the split is [1,1,2,2] or [2,2,1,1], - that is, taxon 1 and 2 are on the same side of the split. This will update `qnet.split` - - update formula for `qnet.which=1` to know the order of minorCF and majorCF in the vector `qnet.expCF`. That is, if the quartet is 1342 (order in `qnet.quartet.taxon`), then the expected CF should match the observed CF in 13|42, 14|32, 12|34 and the `qnet` is 12|34 (given by `qnet.split`), `qnet.formula` will be [2,2,1] minor, minor, major - - `calculateExpCF!(qnet)` for `qnet.which=1`, it will do `1-2/3exp(-qnet.t1)` if `qnet.formula[i]==1`, and `1/3exp(qnet.t1)` if `qnet.formula[i]==2`. For `qnet.which=2`, we need to make sure that there is only one hybrid node, and compute the major, minor1,minor2 expected CF in the order 12|34, 13|24, 14|23 of the taxa in `qnet.quartet.taxon` - -Then we create a `NLopt` object with algorithm BOBYQA and k parameters (length of ht). -We define upper and lower bounds and define the objective function that should only depend on `x=(h,t,gz)` and g (gradient, which we do not have, but still need to put as argument). - -The objective function `obj(x,g)` calls - -- `calculateExpCFAll!(d,x,net)` needs to be run after `extractQuartet(net,d)` that will update `q.qnet` for all quartet. - Assumes that `qnet.indexht` is updated already: we only need to do this at the beginning of `optBL!` because the topology is fixed at this point) - - First it will update the edge lengths according to x - - If the `q.qnet.changed=true` (that is, any of `qnet` branches changed value), we need to call `calculateExpCFAll!(qnet)` on a copy of `q.qnet` (again because we want to leave `q.qnet` with the edge correspondence to `net`) -- `update!(net,x)` simply saves the new x in `net.ht` - -Finally, we call `NLopt.optimize`, and we update the `net.loglik` and `net.ht` at the end. -After `optBL`, we want to call `afterOptBLAll` (or `afterOptBLAllMultipleAlleles`) to check if there are `h==0,1`; `t==0`; `hz==0,1`. -""" -function optBL!(net::HybridNetwork, d::DataCF, verbose::Bool, ftolRel::Float64, ftolAbs::Float64, xtolRel::Float64, xtolAbs::Float64) - (ftolRel > 0 && ftolAbs > 0 && xtolAbs > 0 && xtolRel > 0) || error("tolerances have to be positive, ftol (rel,abs), xtol (rel,abs): $([ftolRel, ftolAbs, xtolRel, xtolAbs])") - if verbose println("OPTBL: begin branch lengths and gammas optimization, ftolAbs $(ftolAbs), ftolRel $(ftolRel), xtolAbs $(xtolAbs), xtolRel $(xtolRel)"); - else @debug "OPTBL: begin branch lengths and gammas optimization, ftolAbs $(ftolAbs), ftolRel $(ftolRel), xtolAbs $(xtolAbs), xtolRel $(xtolRel)"; end - ht = parameters!(net); # branches/gammas to optimize: net.ht, net.numht - extractQuartet!(net,d) # quartets are all updated: hasEdge, expCF, indexht - k = length(net.ht) - net.numBad >= 0 || error("network has negative number of bad hybrids") - #opt = NLopt.Opt(net.numBad == 0 ? :LN_BOBYQA : :LN_COBYLA,k) # :LD_MMA if use gradient, :LN_COBYLA for nonlinear/linear constrained optimization derivative-free, :LN_BOBYQA for bound constrained derivative-free - opt = NLopt.Opt(:LN_BOBYQA,k) # :LD_MMA if use gradient, :LN_COBYLA for nonlinear/linear constrained optimization derivative-free, :LN_BOBYQA for bound constrained derivative-free - # criterion based on prof Bates code - NLopt.ftol_rel!(opt,ftolRel) # relative criterion -12 - NLopt.ftol_abs!(opt,ftolAbs) # absolute critetion -8, later changed to -10 - NLopt.xtol_rel!(opt,xtolRel) # criterion on parameter value changes -10 - NLopt.xtol_abs!(opt,xtolAbs) # criterion on parameter value changes -10 - NLopt.maxeval!(opt,1000) # max number of iterations - NLopt.lower_bounds!(opt, zeros(k)) - NLopt.upper_bounds!(opt,upper(net)) - count = 0 - function obj(x::Vector{Float64},g::Vector{Float64}) # added g::Vector{Float64} for gradient, ow error - if(verbose) #|| net.numBad > 0) #we want to see what happens with bad diamond I - println("inside obj with x $(x)") - end - count += 1 - calculateExpCFAll!(d,x,net) # update qnet branches and calculate expCF - update!(net,x) # update net.ht - val = logPseudoLik(d) - if verbose #|| net.numBad > 0)#we want to see what happens with bad diamond I - println("f_$count: $(round(val, digits=5)), x: $(x)") - end - return val - end - NLopt.min_objective!(opt,obj) - ## if(net.numBad == 1) - ## function inequalityGammaz(x::Vector{Float64},g::Vector{Float64}) - ## val = calculateIneqGammaz(x,net,1,verbose) - ## return val - ## end - ## NLopt.inequality_constraint!(opt,inequalityGammaz) - ## elseif(net.numBad > 1) - ## function inequalityGammaz(result::Vector{Float64},x::Vector{Float64},g::Matrix{Float64}) - ## i = 1 - ## while(i < net.numBad) - ## result[i] = calculateIneqGammaz(x,net,i,verbose) - ## i += 2 - ## end - ## end - ## NLopt.inequality_constraint!(opt,inequalityGammaz) - ## end - if verbose println("OPTBL: starting point $(ht)") # to stdout - else @debug "OPTBL: starting point $(ht)"; end # to logger if debug turned on by user - fmin, xmin, ret = NLopt.optimize(opt,ht) - if verbose println("got $(round(fmin, digits=5)) at $(round.(xmin, digits=5)) after $(count) iterations (returned $(ret))") - else @debug "got $(round(fmin, digits=5)) at $(round.(xmin, digits=5)) after $(count) iterations (returned $(ret))"; end - updateParameters!(net,xmin) - net.loglik = fmin - #return fmin,xmin -end - -optBL!(net::HybridNetwork, d::DataCF) = optBL!(net, d, false, fRel, fAbs, xRel, xAbs) -optBL!(net::HybridNetwork, d::DataCF, verbose::Bool) = optBL!(net, d,verbose, fRel, fAbs, xRel, xAbs) -optBL!(net::HybridNetwork, d::DataCF, ftolRel::Float64, ftolAbs::Float64, xtolRel::Float64, xtolAbs::Float64) = optBL!(net, d, false, ftolRel, ftolAbs, xtolRel, xtolAbs) - -# rename optBL for a more user-friendly name -""" -`topologyMaxQPseudolik!(net::HybridNetwork, d::DataCF)` - -Estimate the branch lengths and inheritance probabilities (γ's) for a given network topology. -The network is *not* modified, only the object `d` is, with updated expected concordance factors. - -Ouput: new network, with optimized parameters (branch lengths and gammas). -The maximized quartet pseudo-deviance is the negative log pseudo-likelihood, -up to an additive constant, such that a perfect fit corresponds to a deviance of 0.0. -This is also an attribute of the network, which can be accessed with `net.loglik`. - -Optional arguments (default value): - -- verbose (false): if true, information on the numerical optimization is printed to screen -- ftolRel (1e-5), ftolAbs (1e-6), xtolRel (1e-3), xtolAbs (1e-4): - absolute and relative tolerance values for the pseudo-deviance function - and the parameters -""" -function topologyMaxQPseudolik!(net::HybridNetwork, d::DataCF; verbose=false::Bool, ftolRel=fRel::Float64, ftolAbs=fAbs::Float64, xtolRel=xRel::Float64, xtolAbs=xAbs::Float64) - tmp1, tmp2 = taxadiff(d,net) - length(tmp1)==0 || error("these taxa appear in one or more quartets, but not in the starting topology: $tmp1") - if length(tmp2)>0 - s = "these taxa will be deleted from the starting topology, they have no quartet CF data:\n" - for tax in tmp2 s *= " $tax"; end - @warn s - net = deepcopy(net) - for tax in tmp2 - deleteleaf!(net, tax) - end - end - net = readTopologyUpdate(writeTopologyLevel1(net)) # update everything for level 1 - try - checkNet(net) - catch err - err.msg = "starting topology not a level 1 network:\n" * err.msg - rethrow(err) - end - if(!isempty(d.repSpecies)) - expandLeaves!(d.repSpecies, net) - net = readTopologyLevel1(writeTopologyLevel1(net)) # dirty fix to multiple alleles problem with expandLeaves - end - optBL!(net, d, verbose, ftolRel, ftolAbs, xtolRel,xtolAbs) - if(net.numBad > 0) # to keep gammaz info in parenthetical description of bad diamond I - for n in net.hybrid - setGammaBLfromGammaz!(n,net) # get t and γ that are compatible with estimated gammaz values - end - end - setNonIdBL!(net) - if(!isempty(d.repSpecies)) - mergeLeaves!(net) - end - return net -end - -# function to delete a hybrid, and then add a new hybrid: -# deleteHybridizationUpdate and addHybridizationUpdate, -# closeN=true will try move origin/target, if false, will delete/add new hybrid -# default is closeN =true -# origin=true, moves origin, if false, moves target. option added to control not keep coming -# to the same network over and over -# returns success -# movesgama: vector of count of number of times each move is proposed to fix gamma zero situation:(add,mvorigin,mvtarget,chdir,delete,nni) -# movesgamma[13]: total number of accepted moves by loglik -""" -`moveHybrid` road map - -Function that tries to fix a gamma zero problem (`h==0,1; t==0; hz==0,1`) after changing direction of hybrid edge failed. -This function is called in `gammaZero`. - -Arguments: -- `closeN=true` will try move origin/target on all neighbors (first choose minor/major edge at random, then make list of all neighbor edges and tries to put the hybrid node in all the neighbors until successful move); if false, will delete and add hybrid until successful move up to N times (this is never tested) - -Returns true if change was successful (not testing `optBL` again), and false if we could not move anything -""" -function moveHybrid!(net::HybridNetwork, edge::Edge, closeN ::Bool, origin::Bool,N::Integer, movesgamma::Vector{Int}) - edge.hybrid || error("edge $(edge.number) cannot be deleted because it is not hybrid") - node = edge.node[edge.isChild1 ? 1 : 2]; - node.hybrid || error("hybrid edge $(edge.number) pointing at tree node $(node.number)") - @debug "MOVE: moving hybrid for edge $(edge.number)" - if(closeN ) - if(origin) - movesgamma[2] += 1 - success = moveOriginUpdateRepeat!(net,node,true) - movesgamma[8] += success ? 1 : 0 - else - movesgamma[3] += 1 - success = moveTargetUpdateRepeat!(net,node,true) - movesgamma[9] += success ? 1 : 0 - end - else - movesgamma[1] += 1 - deleteHybridizationUpdate!(net, node, true, true) - success = addHybridizationUpdateSmart!(net,N) - movesgamma[7] += success ? 1 : 0 - end - return success -end - -# function to deal with h=0,1 case by: -# - change direction of hybrid edge, do optBL again -# - if failed, call moveHybrid -# input: net (network to be altered) -# closeN =true will try move origin/target, if false, will delete/add new hybrid -# origin=true, moves origin, if false, moves target. option added to control not keep coming -# to the same network over and over -# returns success -# movesgama: vector of count of number of times each move is proposed to fix gamma zero situation:(add,mvorigin,mvtarget,chdir,delete,nni) -# movesgamma[13]: total number of accepted moves by loglik -""" -`gammaZero` road map - -Function that tries to fix a gamma zero problem (`h==0,1; t==0; hz==0,1`) -1) First tries to do `changeDirection` -2) If not successful from start, we call `moveHybrid` -3) If successful move (change direction), we call `optBL` and check if we fixed the problem -4) If problem fixed and we do not have worse pseudolik, we return `success=true` -5) If still problem or worse pseudolik, we call `moveHybrid` - -** Important: ** Any function (`afterOptBL`) calling `gammaZero` is assuming that it only made a change, so if the returned value is true, then a change was made, and the other function needs to run `optBL` and check that all parameters are 'valid'. If the returned value is false, then no change was possible and we need to remove a hybridization if the problem is h==0,1; hz==0,1. If the problem is t==0, we ignore this problem. -""" -function gammaZero!(net::HybridNetwork, d::DataCF, edge::Edge, closeN ::Bool, origin::Bool, N::Integer, movesgamma::Vector{Int}) - global CHECKNET - currTloglik = net.loglik - edge.hybrid || error("edge $(edge.number) should be hybrid edge because it corresponds to a gamma (or gammaz) in net.ht") - @debug "gamma zero situation found for hybrid edge $(edge.number) with gamma $(edge.gamma)" - node = edge.node[edge.isChild1 ? 1 : 2]; - node.hybrid || error("hybrid edge $(edge.number) pointing at tree node $(node.number)") - success = changeDirectionUpdate!(net,node) #changes dir of minor - movesgamma[4] += 1 - if(success) - @debug begin printEverything(net); "printed everything" end - CHECKNET && checkNet(net) - movesgamma[10] += 1 - optBL!(net,d,false) - flags = isValid(net) - if(net.loglik <= currTloglik && flags[1] && flags[3]) - @debug "changing direction fixed the gamma zero situation" - success2 = true - else - @debug "changing direction does not fix the gamma zero situation, need to undo change direction and move hybrid" - success = changeDirectionUpdate!(net,node) - success || error("strange thing, changed direction and success, but lower loglik; want to undo changeDirection, and success=false! Hybrid node is $(node.number)") - @debug begin printEverything(net); "printed everything" end - CHECKNET && checkNet(net) - success2 = moveHybrid!(net,edge,closeN ,origin,N, movesgamma) - end - else - @debug "changing direction was not possible to fix the gamma zero situation (success=false), need to move hybrid" - @debug begin printEverything(net); "printed everything" end - CHECKNET && checkNet(net) - success2 = moveHybrid!(net,edge,closeN ,origin,N,movesgamma) - end - return success2 -end - -# function to check if h or t (in currT.ht) are 0 (or 1 for h) -# closeN =true will try move origin/target, if false, will delete/add new hybrid -# origin=true, moves origin, if false, moves target. option added to control not keep coming -# to the same network over and over -# returns successchange=false if could not add new hybrid; true ow -# returns successchange,flagh,flagt,flaghz (flag_=false if problem with gamma, t=0 or gammaz) -# movesgama: vector of count of number of times each move is proposed to fix gamma zero situation:(add,mvorigin,mvtarget,chdir,delete,nni) -# movesgamma[13]: total number of accepted moves by loglik -""" -`afterOptBL` road map - -Function that will check if there are `h==0,1;t==0,hz==0,1` cases in a network after calling `optBL!`. - -Arguments: -- `closeN=true` will move origin/target, if false, add/delete N times before giving up (we have only tested `closeN=true`) -- `origin=true` will move origin, false will move target. We added this to avoid going back and forth between the same networks -- `movesgamma` vector of counts of number of times each move is proposed to fix a gamma zero problem: `(add,mvorigin,mvtarget,chdir,delete,nni)` - -Procedure: - -- First we split the `ht` vector in `nh,nt,nhz` (gammas, lengths, gammaz) -- If we find a `h==0,1`, we loop through `nh` to find a hybrid edge with h==0 or 1 and want to try to fix this by doing: - - `gammaZero!(currT,d,edge,closeN,origin,N,movesgamma)` which returns true if there was a successful change, and we stop the loop -- If we find a `t==0`, we loop through all `nt` to find such edge, and do NNI move on this edge; return true if change successful and we stop the loop -- If we find a `hz==0,1`, we loop through `nhz` to find such hybrid edge and call `gammaZero` again - -- If we did a successful change, we run `optBL` again, and recheck if there are no more problems. -- Returns successchange, flagh, flagt,flaghz (flag=true means no problems) - -- If it is the multiple alleles case, it will not try to fix `h==0,1;hz==0,1` because it can reach a case that violates the multiple alleles condition. If we add a check here, things become horribly slow and inefficient, so we just delete a hybridization that has `h==0,1;hz==0,1` - -** Important: ** `afterOptBL` is doing only one change, but we need to repeat multiple times to be sure that we fix all the gamma zero problems, which is why we call `afterOptBLRepeat` -""" -function afterOptBL!(currT::HybridNetwork, d::DataCF,closeN ::Bool, origin::Bool,verbose::Bool, N::Integer, movesgamma::Vector{Int}) - global CHECKNET - !isTree(currT) || return false,true,true,true - nh = currT.ht[1 : currT.numHybrids - currT.numBad] - k = sum([e.istIdentifiable ? 1 : 0 for e in currT.edge]) - nt = currT.ht[currT.numHybrids - currT.numBad + 1 : currT.numHybrids - currT.numBad + k] - nhz = currT.ht[currT.numHybrids - currT.numBad + k + 1 : length(currT.ht)] - indh = currT.index[1 : currT.numHybrids - currT.numBad] - indt = currT.index[currT.numHybrids - currT.numBad + 1 : currT.numHybrids - currT.numBad + k] - indhz = currT.index[currT.numHybrids - currT.numBad + k + 1 : length(currT.ht)] - flagh,flagt,flaghz = isValid(nh,nt,nhz) - !reduce(&,[flagh,flagt,flaghz]) || return false,true,true,true - @debug "begins afterOptBL because of conflicts: flagh,flagt,flaghz=$([flagh,flagt,flaghz])" - successchange = true - if(!flagh) - for i in 1:length(nh) - if(approxEq(nh[i],0.0) || approxEq(nh[i],1.0)) - edge = currT.edge[indh[i]] - approxEq(edge.gamma,nh[i]) || error("edge $(edge.number) gamma $(edge.gamma) should match the gamma in net.ht $(nh[i]) and it does not") - successchange = gammaZero!(currT, d,edge,closeN ,origin,N,movesgamma) - !successchange || break - end - end - elseif(!flagt) - for i in 1:length(nt) - if(approxEq(nt[i],0.0)) - edge = currT.edge[indt[i]] - approxEq(edge.length,nt[i]) || error("edge $(edge.number) length $(edge.length) should match the length in net.ht $(nt[i]) and it does not") - if(all((n->!n.hasHybEdge), edge.node)) - movesgamma[6] += 1 - successchange = NNI!(currT,edge) - movesgamma[12] += successchange ? 1 : 0 - !successchange || break - else - @debug "MOVE: need NNI on edge $(edge.number) because length is $(edge.length), but edge is attached to nodes that have hybrid edges" - successchange = false - end - end - end - elseif(!flaghz) - currT.numBad > 0 || error("not a bad diamond I and flaghz is $(flaghz), should be true") - i = 1 - while(i <= length(nhz)) - if(approxEq(nhz[i],0.0)) - nodehz = currT.node[indhz[i]] - approxEq(nodehz.gammaz,nhz[i]) || error("nodehz $(nodehz.number) gammaz $(nodehz.gammaz) should match the gammaz in net.ht $(nhz[i]) and it does not") - edges = hybridEdges(nodehz) - edges[1].hybrid || error("bad diamond I situation, node $(nodehz.number) has gammaz $(nodehz.gammaz) so should be linked to hybrid edge, but it is not") - successchange = gammaZero!(currT,d,edges[1],closeN ,origin,N,movesgamma) - break - elseif(approxEq(nhz[i],1.0)) - approxEq(nhz[i+1],0.0) || error("gammaz for node $(currT.node[indhz[i]].number) is $(nhz[i]) but the other gammaz is $(nhz[i+1]), the sum should be less than 1.0 (afteroptbl)") - nodehz = currT.node[indhz[i+1]] - approxEq(nodehz.gammaz,nhz[i+1]) || error("nodehz $(nodehz.number) gammaz $(nodehz.gammaz) should match the gammaz in net.ht $(nhz[i+1]) and it does not") - edges = hybridEdges(nodehz) - edges[1].hybrid || error("bad diamond I situation, node $(nodehz.number) has gammaz $(nodehz.gammaz) so should be linked to hybrid edge, but it is not") - successchange = gammaZero!(currT,d,edges[1],closeN ,origin,N,movesgamma) - break - else - if(approxEq(nhz[i+1],0.0)) - nodehz = currT.node[indhz[i+1]]; - approxEq(nodehz.gammaz,nhz[i+1]) || error("nodehz $(nodehz.number) gammaz $(nodehz.gammaz) should match the gammaz in net.ht $(nhz[i+1]) and it does not") - edges = hybridEdges(nodehz); - edges[1].hybrid || error("bad diamond I situation, node $(nodehz.number) has gammaz $(nodehz.gammaz) so should be linked to hybrid edge, but it is not") - successchange = gammaZero!(currT,d,edges[1],closeN ,origin,N,movesgamma) - break - elseif(approxEq(nhz[i+1],1.0)) - error("gammaz for node $(currT.node[indhz[i]].number) is $(nhz[i]) but the other gammaz is $(nhz[i+1]), the sum should be less than 1.0 (afteroptbl)") - end - end - i += 2 - end - end - if successchange - @debug begin - printEverything(currT); - "afterOptBL SUCCESSFUL change, need to run again to see if new topology is valid" - end - CHECKNET && checkNet(currT) - optBL!(currT,d,verbose) - flagh,flagt,flaghz = isValid(currT) - @debug "new flags: flagh,flagt,flaghz $([flagh,flagt,flaghz])" - end - return successchange,flagh,flagt,flaghz -end - -# function to repeat afterOptBL every time after changing something -# N: number of times it will delete/add hybrid if closeN =false -# origin=true, moves origin, if false, moves target. option added to control not keep coming -# to the same network over and over -# movesgama: vector of count of number of times each move is proposed to fix gamma zero situation:(add,mvorigin,mvtarget,chdir,delete,nni) -# movesgamma[13]: total number of accepted moves by loglik -""" -`afterOptBLRepeat` road map - -`afterOptBL` is doing only one change, but we need to repeat multiple times to be sure that we fix all the gamma zero problems, which is why we call `afterOptBLRepeat`. -This function will repeat `afterOptBL` every time a successful change happened; this is done only -if `closeN=false`, because we would delete/add hybridizations and need to stop after tried N times. If `closeN=true` (default), then `afterOptBLRepeat` only does one `afterOptBL`, because in this case, only the neighbor edges need to be tested, and this would have been done already in `gammaZero`. -""" -function afterOptBLRepeat!(currT::HybridNetwork, d::DataCF, N::Integer,closeN ::Bool, origin::Bool, - verbose::Bool, movesgamma::Vector{Int}) - success,flagh,flagt,flaghz = afterOptBL!(currT,d,closeN ,origin,verbose,N, movesgamma) - @debug "inside afterOptBLRepeat, after afterOptBL once, we get: success, flags: $([success,flagh,flagt,flaghz])" - if !closeN - @debug "closeN is $(closeN ), and gets inside the loop for repeating afterOptBL" - i = 1 - while(success && !reduce(&,[flagh,flagt,flaghz]) && iN`, then it checks one last time the flags, if bad h/hz will move down one level, and exit -""" -function afterOptBLAll!(currT::HybridNetwork, d::DataCF, N::Integer,closeN ::Bool, liktolAbs::Float64, ftolAbs::Float64, verbose::Bool, movesgamma::Vector{Int},ftolRel::Float64, xtolRel::Float64, xtolAbs::Float64) - @debug "afterOptBLAll: checking if currT has gamma (gammaz) = 0.0(1.0): currT.ht $(currT.ht)" - currloglik = currT.loglik - currT.blacklist = Int[]; - origin = (rand() > 0.5) #true=moveOrigin, false=moveTarget - startover = true - tries = 0 - N2 = N > 10 ? N/10 : 1 #num of failures of badlik around a gamma=0.0, t=0.0 - while(startover && tries < N) - tries += 1 - @debug "inside afterOptBLALL: number of tries $(tries) out of $(N) possible" - badliks = 0 - if(currT.loglik < liktolAbs) #curr loglik already close to 0.0 - startover = false - else - backCurrT0 = false - while(badliks < N2) #will try a few options around currT - @debug "tried $(badliks) bad likelihood options so far out of $(N2)" - currT0 = deepcopy(currT) - origin = !origin #to guarantee not going back to previous topology - success,flagh,flagt,flaghz = afterOptBLRepeat!(currT,d,N,closeN ,origin,verbose,movesgamma) - all((e->!(e.hybrid && e.inCycle == -1)), currT.edge) || error("found hybrid edge with inCycle == -1") - @debug "inside afterOptBLAll, after afterOptBLRepeat once we get: success, flags: $([success,flagh,flagt,flaghz])" - if !success #tried to change something but failed - @debug "did not change anything inside afterOptBL: could be nothing needed change or tried but couldn't anymore. flagh, flagt, flaghz = $([flagh,flagt,flaghz])" - if reduce(&,[flagh,flagt,flaghz]) #currT was ok - startover = false - elseif !flagh || !flaghz #currT was bad but could not change it, need to go down a level - !isTree(currT) || error("afterOptBL should not give reject=true for a tree") - @debug "current topology has numerical parameters that are not valid: gamma=0(1), gammaz=0(1); need to move down a level h-1" - moveDownLevel!(currT) - optBL!(currT,d,verbose,ftolRel, ftolAbs, xtolRel, xtolAbs) - startover = true - elseif !flagt - startover = false - end - else #changed something - @debug "changed something inside afterOptBL: flagh, flagt, flaghz = $([flagh,flagt,flaghz]). oldloglik $(currloglik), newloglik $(currT.loglik)" - if currT.loglik > currloglik #|| abs(currT.loglik-currloglik) <= liktolAbs) #fixit: allowed like this because of changeDir that does not change much the lik but can fix h=0 - @debug "worse likelihood, back to currT" - startover = true - backCurrT0 = true - else - @debug "better likelihood, jump to new topology and startover" - backCurrT0 = false - movesgamma[13] += 1 - if reduce(&,[flagh,flagt,flaghz]) - startover = false - else - currloglik = currT.loglik - startover = true - end - end - end - if backCurrT0 - currT = currT0 - startover = true - badliks += 1 - else - badliks = N+1 ## exit second while - end - end - if backCurrT0 # leaves while for failed loglik - @debug "tried to fix gamma zero situation for $(badliks) times and could not" - flagh,flagt,flaghz = isValid(currT) - if(!flagh || !flaghz) - !isTree(currT) || error("afterOptBL should not give reject=true for a tree") - @debug "current topology has numerical parameters that are not valid: gamma=0(1), t=0, gammaz=0(1); need to move down a level h-1" - movesgamma[5] += 1 - movesgamma[11] += 1 - moveDownLevel!(currT) - optBL!(currT,d,verbose,ftolRel, ftolAbs, xtolRel, xtolAbs) - startover = true - else - @debug "the only problem were lengths equal to zero, so we will keep them" - startover = false - end - end - end - end - if tries >= N - @debug "afterOptBLAll ended because it tried $(tries) times with startover $(startover)" - @debug writeTopologyLevel1(currT,true) - flagh,flagt,flaghz = isValid(currT) - if(!flagh || !flaghz) - @debug "gammaz zero situation still in currT, need to move down one level to h-1" - moveDownLevel!(currT) - @debug begin - printEdges(currT) - printPartitions(currT) - #printNodes(currT) - writeTopologyLevel1(currT,true) - end - optBL!(currT,d,verbose,ftolRel, ftolAbs, xtolRel, xtolAbs) - end - end - currT.blacklist = Int[]; - return currT -end - - -# -------------- heuristic search for topology ----------------------- - -function isTree(net::HybridNetwork) - net.numHybrids == length(net.hybrid) || error("numHybrids does not match to length of net.hybrid") - net.numHybrids != 0 || return true - return false -end - -# function to adjust the weight of addHybrid if net is in a much lower layer -# net.numHybrids< 0) - hmax >= 0 || error("hmax must be non negative: $(hmax)") - length(w) == 6 || error("length of w should be 6 as there are only 6 moves: $(w)") - approxEq(sum(w),1.0) || error("vector of move weights should add up to 1: $(w),$(sum(w))") - all((i->(0<=i<=1)), w) || error("weights must be nonnegative and less than one $(w)") - suma = w[5]+w[2]+w[3]+w[4]+w[6] - v = zeros(6) - k = hmax - net.numHybrids - for i in 1:6 - if(i == 1) - v[i] = w[1]*k/(suma + w[1]*k) - else - v[i] = w[i]/(suma + w[1]*k) - end - end - return v - end - return w -end - -# function to adjust weights (v) based on movesfail and Nmov, to -# avoid proposing over and over moves that cannot work: (add,mvorigin, mvtarget, chdir, delete,nni) -#returns false if sum(v)=0, no more moves available -# needs the net and hmax to decide if there are available moves -function adjustWeightMovesfail!(v::Vector{Float64}, movesfail::Vector{Int}, Nmov::Vector{Int}, net::HybridNetwork, hmax::Integer) - length(v) ==length(movesfail) || error("v and movesfail must have same length") - length(Nmov) ==length(movesfail) || error("Nmov and movesfail must have same length") - for i in 1:length(v) - v[i] = v[i]*(movesfail[i]= 0 || error("hmax must be non negative: $(hmax)") - length(w) == 6 || error("length of w should be 6 as there are only 6 moves: $(w)") - approxEq(sum(w),1.0) || error("vector of move weights should add up to 1: $(w),$(sum(w))") - all((i->(0<=i<=1)),w) || error("weights must be nonnegative and less than one $(w)") - if(hmax == 0) - isTree(net) || error("hmax is $(hmax) but net is not a tree") - flag = adjustWeightMovesfail!(w,movesfail,Nmov,net,hmax) - flag || return :none - return :nni - else - r = rand() - if(dynamic) - v = adjustWeight(net,hmax,w) - else - v = w - end - @debug "weights before adjusting by movesfail $(v)" - flag = adjustWeightMovesfail!(v,movesfail,Nmov,net,hmax) - @debug "weights after adjusting by movesfail $(v)" - flag || return :none - if(0 < net.numHybrids < hmax) - if(r < v[1]) - return :add - elseif(r < v[1]+v[2]) - return :MVorigin - elseif(r < v[1]+v[2]+v[3]) - return :MVtarget - elseif(r < v[1]+v[2]+v[3]+v[4]) - return :CHdir - elseif(r < v[1]+v[2]+v[3]+v[4]+v[5]) - return :delete - else - return :nni - end - elseif(net.numHybrids == 0) - suma = v[1]+v[6] - if(r < (v[1])/suma) - return :add - else - return :nni - end - else # net.numHybrids == hmax - suma = v[5]+v[2]+v[3]+v[4]+v[6] - if(r < v[2]/suma) - return :MVorigin - elseif(r < (v[3]+v[2])/suma) - return :MVtarget - elseif(r < (v[4]+v[2]+v[3])/suma) - return :CHdir - elseif(r < (v[5]+v[2]+v[3]+v[4])/suma) - return :delete - else - return :nni - end - end - end -end - -whichMove(net::HybridNetwork,hmax::Integer,movesfail::Vector{Int}, Nmov::Vector{Int}) = whichMove(net,hmax,[1/5,1/5,1/5,1/5,0.0,1/5], true,movesfail, Nmov) -whichMove(net::HybridNetwork,hmax::Integer,w::Vector{Float64},movesfail::Vector{Int}, Nmov::Vector{Int}) = whichMove(net,hmax,w, true,movesfail, Nmov) - -#function to choose a hybrid node for the given moves -function chooseHybrid(net::HybridNetwork) - !isTree(net) || error("net is a tree, cannot choose hybrid node") - net.numHybrids > 1 || return net.hybrid[1] - index1 = 0 - while(index1 == 0 || index1 > size(net.hybrid,1)) - index1 = round(Integer,rand()*size(net.hybrid,1)); - end - @debug "chosen hybrid node for network move: $(net.hybrid[index1].number)" - return net.hybrid[index1] -end - -# function to propose a new topology given a move -# random = false uses the minor hybrid edge always -# count to know in which step we are, N for NNI trials -# order in movescount as in IF here (add,mvorigin,mvtarget,chdir,delete,nni) -# multAll = true if d.repSpecies is not empty, checked outside -""" -`proposedTop!(move,newT,random,count,N,movescount,movesfail,multall)` road map - -Function to change the current network `newT` by a given `move`, and checks that the move was successful (correct attributes). If not successful, `newT` is changed back to its original state, except for the case of multiple alleles. - -**Note** that the update of attributes by each move is not done in all the network, but only in the local edges that were changed by the move. This is efficient (and makes a move easy to undo), but makes the code of each move function very clunky. - -Arguments: - -- move chosen from `whichMove` as described in `optTopLevel` -- `newT` is the topology that will be modified inside with the move -- `random=true`: chooses minor hybrid edge with prob 1-h, and major edge with prob h, if false, always chooses minor hybrid edge -- `count`: simply which likelihood step we are in in the optimization at `optTopLevel` -- `movescount` and `movesfail`: vector of counts of number of moves proposed -- `multall=true` if multiple alleles case: we need to check if the move did not violate the multiple alleles condition (sister alleles together and no gene flow into the alleles). This is inefficient because we are proposing moves that we can reject later, instead of being smart about the moves we propose: for example, move origin/target could rule out some neighbors that move gene flow into the alleles, the same for add hybridization; nni move can check if it is trying to separate the alleles) - -Moves: - -- `addHybridizationUpdate(newT,N)`: -will choose a partition first (to avoid choosing edges that will create a non level-1 network) -will choose two edges from this partition randomly, will not allow two edges in a cherry (non-identifiable), or sister edges that are not identifiable -(the blacklist was a way to keep track of "bad edges" were we should not waste time trying to put hybridizations, it has never been used nor tested). Also choose gamma from U(0,0.5). The "Update" in the function name means that it creates the new hybrid, and also updates all the attributes of `newT` - -- `node = chooseHybrid(newT)` choose a hybrid randomly for the next moves: -- `moveOriginUpdateRepeat!(newT,node,random)` -will choose randomly the minor/major hybrid edge to move (if `random=true`); will get the list of all neighbor edges where to move the origin, will move the origin and update all the attributes and check if the move was successful (not conflicting attributes); if not, will undo the move, and try with a different neighbor until it runs out of neighbors. Return true if the move was successful. - -- `moveTargetUpdateRepeat!(newT,node,random)` -same as move origin but moving the target - -- `changeDirectionUpdate!(newT,node,random)` -chooses minor/major hybrid edge at random (if `random=true), and changes the direction, and updates all the attributes. Checks if the move was successful (returns true), or undoes the change and returns false. - -- `deleteHybridizationUpdate!(newT,node)` -removes the hybrid node, updates the attributes, no need to check any attributes, always successful move - -- NNIRepeat!(newT,N) -choose an edge for nni that does not have a neighbor hybrid. It will try to find such an edge N times, and if it fails, it will return false (unsuccessful move). N=10 by default. If N=1, it rarely finds such an edge if the network is small or complex. The function cannot choose an external edge. it will update locally the attributes. - -** Important: ** All the moves undo what they did if the move was not successful, so at the end you either have a `newT` with a new move and with all good attributes, or the same `newT` that started. This is important to avoid having to do deepcopy of the network before doing the move. -Also, after each move, when we update the attributes, we do not update the attributes of the whole network, we only update the attributes of the edges that were affected by the move. This saves time, but makes the code quite clunky. -Only the case of multiple alleles the moves does not undo what it did, because it finds out that it failed after the function is over, so just need to treat this case special. -""" -function proposedTop!(move::Integer, newT::HybridNetwork,random::Bool, count::Integer, N::Integer, movescount::Vector{Int}, movesfail::Vector{Int}, multall::Bool) - global CHECKNET - 1 <= move <= 6 || error("invalid move $(move)") #fixit: if previous move rejected, do not redo it! - @debug "current move: $(int2move[move])" - if(move == 1) - success = addHybridizationUpdateSmart!(newT,N) - elseif(move == 2) - node = chooseHybrid(newT) - success = moveOriginUpdateRepeat!(newT,node,random) - CHECKNET && isBadTriangle(node) && success && error("success is $(success) in proposedTop, but node $(node.number) is very bad triangle") - elseif(move == 3) - node = chooseHybrid(newT) - success = moveTargetUpdateRepeat!(newT,node,random) - CHECKNET && isBadTriangle(node) && success && error("success is $(success) in proposedTop, but node $(node.number) is very bad triangle") - elseif(move == 4) - node = chooseHybrid(newT) - success = changeDirectionUpdate!(newT,node, random) - CHECKNET && isBadTriangle(node) && success && error("success is $(success) in proposedTop, but node $(node.number) is very bad triangle") - elseif(move == 5) - node = chooseHybrid(newT) - deleteHybridizationUpdate!(newT,node) - success = true - elseif(move == 6) - success = NNIRepeat!(newT,N) - end - if(multall) - success2 = checkTop4multAllele(newT) - @debug "entered to check topology for mult allele: $(success2)" - success &= success2 - end - movescount[move] += 1 - movescount[move+6] += success ? 1 : 0 - movesfail[move] += success ? 0 : 1 - @debug "success $(success), movescount (add,mvorigin,mvtarget,chdir,delete,nni) proposed: $(movescount[1:6]); successful: $(movescount[7:12]); movesfail: $(movesfail)" - !success || return true - @debug "new proposed topology failed in step $(count) for move $(int2move[move])" - @debug begin printEverything(newT); "printed everything" end - CHECKNET && checkNet(newT) - return false -end - - -proposedTop!(move::Symbol, newT::HybridNetwork, random::Bool, count::Integer,N::Integer, movescount::Vector{Int},movesfail::Vector{Int}, multall::Bool) = - proposedTop!( try move2int[move] catch; error("invalid move $(string(move))") end, - newT, random,count,N, movescount,movesfail, multall) - -# function to calculate Nmov, number max of tries per move -# order: (add,mvorigin,mvtarget,chdir,delete,nni) -function calculateNmov!(net::HybridNetwork, N::Vector{Int}) - if(isempty(N)) - N = zeros(Int, 6) - else - length(N) == 6 || error("vector Nmov should have length 6: $(N)") - end - if(isTree(net)) - N[1] = ceil(coupon(binom(numTreeEdges(net),2))) #add - N[2] = 1 - N[3] = 1 - N[4] = 1 - N[5] = 1 #delete - N[6] = ceil(coupon(4*numIntTreeEdges(net))) #nni - else - N[1] = ceil(coupon(binom(numTreeEdges(net),2))) #add - N[2] = ceil(coupon(2*4*net.numHybrids)) #mvorigin - N[3] = ceil(coupon(2*4*net.numHybrids)) #mtarget - N[4] = ceil(coupon(2*net.numHybrids)) #chdir - N[5] = 10000 #delete - N[6] = ceil(coupon(4*numIntTreeEdges(net))) #nni - end -end - -# function to optimize on the space of networks with the same (or fewer) numHyb -# currT, the starting network will be modified inside -# Nmov: vector with max number of tries per move (add,mvorigin,mvtarget,chdir,delete,nni) -# Nfail: number of failure networks with lower loglik before aborting -# liktolAbs: to stop the search if loglik close to liktolAbs, or if absDiff less than liktolAbs -# hmax: max number of hybrids allowed -# closeN =true if gamma=0.0 fixed only around neighbors with move origin/target -# logfile=IOStream to capture the information on the heurisitc optimization, default stdout -""" -`optTopLevel` road map - -Function that does most of the heavy-lifting of `snaq`. It optimizes the pseudolikelihood for a given starting topology, and returns the best network. -Assumes that the starting topology is level-1 network, and has all the attributes correctly updated. - -Input parameters: - -- Starting topology `currT`, input data `DataCF` `d`, maximum number of hybridizations `hmax` -- Numerical optimization parameters: `liktolAbs, Nfail, ftolRel, ftolAbs, xtolRel, xtolAbs` -- Print parameters: `verbose, logfile, writelog` -- Parameters to tune the search in space of networks: `closeN=true` only propose move origin/target to neighbor edges (coded, but not tested with `closeN=false`), `Nmov0` vector with maximum number of trials allowed per type of move `(add, mvorigin, mvtarget, chdir, delete, nni)`, by default computed inside with coupon’s collector formulas - -The optimization procedure keeps track of -- `movescount`: count of proposed moves, -- `movesgamma`: count of proposed moves to fix a gamma zero situation (see below for definition of this situation), -- `movesfail`: count of failed moves by violation of level-1 network (`inCycle` attribute) or worse pseudolikelihood than current, -- `failures`: number of failed proposals that had a worse pseudolikelihood - -Optimization procedure: - -While the difference between current loglik and proposed loglik is greater than `liktolAbs`, -or `failuresNmov[i]`, that is, if we reached the maximum possible number of moves allowed for a certain type) and then increase the probability of the other moves. - So, unless one move has `w=0`, nothing changes. This could be improved by using the outlier quartets to guide the proposal of moves. - -- `whichMove` will choose a move randomly from the weights, it will return `none` if no more moves allowed, in which case, the optimization ends - -- `flag=proposedTop!(move, newT)` will modify `newT` based on `move`. - The function `proposedTop` will return `flag=true` if the move was successful (the move succeeded by `inCycle`, `containRoot`, available edge to make the move (more details in `proposedTop`)). - If `flag=false`, then `newT` is cleaned, except for the case of multiple alleles. - The function `proposedTop` keeps count of `movescount` (successful move), `movesfail` (unsuccessful move), - - Options: - - `random=true`: moves major/minor hybrid edge with prob h,1-h, respectively - - `N=10`: number of trials for NNI edge. - -- if(flag) - Optimize branch lengths with `optBL` - - If `newT.loglik` is better than `currT.loglik` by `liktolAbs`, jump to `newT` (`accepted=true`) and fix `gamma=0, t=0` problems (more info on `afterOptBL`) - - If(accepted) - `failures=0`, `movesfail=zeros`, `movescount` for successful move +1 - -end while - -After choosing the best network `newT`, we do one last more thorough optimization of branch lengths with `optBL`, -we change non identifiable branch lengths to -1 (only in debug mode) and return `newT` -""" -function optTopLevel!(currT::HybridNetwork, liktolAbs::Float64, Nfail::Integer, d::DataCF, hmax::Integer, - ftolRel::Float64, ftolAbs::Float64, xtolRel::Float64, xtolAbs::Float64, - verbose::Bool, closeN ::Bool, Nmov0::Vector{Int}, logfile::IO, writelog::Bool) - global CHECKNET - @debug "OPT: begins optTopLevel with hmax $(hmax)" - liktolAbs > 0 || error("liktolAbs must be greater than zero: $(liktolAbs)") - Nfail > 0 || error("Nfail must be greater than zero: $(Nfail)") - isempty(Nmov0) || all(Nmov0 .>= 0) || error("Nmov must be non-negative zero: $(Nmov0)") - if(!isempty(d.repSpecies)) - checkTop4multAllele(currT) || error("starting topology does not fit multiple alleles condition") - end - @debug begin printEverything(currT); "printed everything" end - CHECKNET && checkNet(currT) - count = 0 - movescount = zeros(Int,18) #1:6 number of times moved proposed, 7:12 number of times success move (no intersecting cycles, etc.), 13:18 accepted by loglik - movesgamma = zeros(Int,13) #number of moves to fix gamma zero: proposed, successful, movesgamma[13]: total accepted by loglik - movesfail = zeros(Int,6) #count of failed moves for current topology - failures = 0 - stillmoves = true - if(isempty(Nmov0)) - Nmov = zeros(Int,6) - else - Nmov = deepcopy(Nmov0) - end - all((e->!(e.hybrid && e.inCycle == -1)), currT.edge) || error("found hybrid edge with inCycle == -1") - optBL!(currT,d,verbose,ftolRel, ftolAbs, xtolRel, xtolAbs) - if(!isempty(d.repSpecies)) ## muliple alleles case - afterOptBLAllMultipleAlleles!(currT, d, Nfail,closeN , ftolAbs, verbose,movesgamma,ftolRel,xtolRel,xtolAbs) - else - currT = afterOptBLAll!(currT, d, Nfail,closeN , liktolAbs, ftolAbs, verbose,movesgamma,ftolRel,xtolRel,xtolAbs) #needed return because of deepcopy inside - end - absDiff = liktolAbs + 1 - newT = deepcopy(currT) - @debug begin - printEdges(newT) - printPartitions(newT) - println("++++") - writeTopologyLevel1(newT,true) - end - writelog && write(logfile, "\nBegins heuristic optimization of network------\n") - loopcount = 0 - while(absDiff > liktolAbs && failures < Nfail && currT.loglik > liktolAbs && stillmoves) #stops if close to zero because of new deviance form of the pseudolik - if (loopcount % 50) == 0 GC.gc() end - if CHECKNET && !isempty(d.repSpecies) - checkTop4multAllele(currT) || error("currT is not good for multiple alleles") - end - count += 1 - @debug "--------- loglik_$(count) = $(round(currT.loglik, digits=6)) -----------" - if isempty(Nmov0) #if empty, not set by user - calculateNmov!(newT,Nmov) - end - @debug "will propose move with movesfail $(movesfail), Nmov $(Nmov)" - move = whichMove(newT,hmax,movesfail,Nmov) - @debug "++++" - if move != :none - if !isempty(d.repSpecies) # need the original newT in case the proposed top fails by multiple alleles condition - newT0 = deepcopy(newT) - end - flag = proposedTop!(move,newT,true, count,10, movescount,movesfail,!isempty(d.repSpecies)) #N=10 because with 1 it never finds an edge for nni - if(flag) #no need else in general because newT always undone if failed, but needed for multiple alleles - accepted = false - all((e->!(e.hybrid && e.inCycle == -1)), newT.edge) || error("found hybrid edge with inCycle == -1") - @debug "proposed new topology in step $(count) is ok to start optBL" - @debug begin printEverything(newT); "printed everything" end - CHECKNET && checkNet(newT) - optBL!(newT,d,verbose,ftolRel, ftolAbs, xtolRel, xtolAbs) - @debug "OPT: comparing newT.loglik $(newT.loglik), currT.loglik $(currT.loglik)" - if(newT.loglik < currT.loglik && abs(newT.loglik-currT.loglik) > liktolAbs) #newT better loglik: need to check for error or keeps jumping back and forth - newloglik = newT.loglik - if(!isempty(d.repSpecies)) ## multiple alleles - afterOptBLAllMultipleAlleles!(newT, d, Nfail,closeN , ftolAbs,verbose,movesgamma,ftolRel, xtolRel,xtolAbs) - else - newT = afterOptBLAll!(newT, d, Nfail,closeN , liktolAbs, ftolAbs,verbose,movesgamma,ftolRel, xtolRel,xtolAbs) #needed return because of deepcopy inside - end - @debug "loglik before afterOptBL $(newloglik), newT.loglik now $(newT.loglik), loss in loglik by fixing gamma (gammaz)=0.0(1.0): $(newloglik>newT.loglik ? 0 : abs(newloglik-newT.loglik))" - accepted = true - else - accepted = false - end - if(accepted) - absDiff = abs(newT.loglik - currT.loglik) - @debug "proposed new topology with better loglik in step $(count): oldloglik=$(round(currT.loglik, digits=3)), newloglik=$(round(newT.loglik, digits=3)), after $(failures) failures" - currT = deepcopy(newT) - failures = 0 - movescount[move2int[move]+12] += 1 - movesfail = zeros(Int,6) #count of failed moves for current topology - else - @debug "rejected new topology with worse loglik in step $(count): currloglik=$(round(currT.loglik, digits=3)), newloglik=$(round(newT.loglik, digits=3)), with $(failures) failures" - failures += 1 - movesfail[move2int[move]] += 1 - newT = deepcopy(currT) - end - @debug begin - printEdges(newT) - printPartitions(newT) - #printNodes(newT) - println("++++") - println(writeTopologyLevel1(newT,true)) - "ends step $(count) with absDiff $(accepted ? absDiff : 0.0) and failures $(failures)" - end - else - if(!isempty(d.repSpecies)) - newT = newT0 ## only need to go back with multiple alleles, bc other functions in proposedTop undo what they did - end - end - else - stillmoves = false - end - @debug "--------- loglik_$(count) end: earlier log can be discarded ----" - loopcount += 1 - end - if ftolAbs > 1e-7 || ftolRel > 1e-7 || xtolAbs > 1e-7 || xtolRel > 1e-7 - writelog && write(logfile,"\nfound best network, now we re-optimize branch lengths and gamma more precisely") - optBL!(newT,d,verbose, fRelBL,fAbsBL,xRelBL,xAbsBL) - end - assignhybridnames!(newT) - if(absDiff <= liktolAbs) - writelog && write(logfile,"\nSTOPPED by absolute difference criteria") - elseif(currT.loglik <= liktolAbs) - writelog && write(logfile,"\nSTOPPED by loglik close to zero criteria") - elseif(!stillmoves) - writelog && write(logfile,"\nSTOPPED for not having more moves to propose: movesfail $(movesfail), Nmov $(Nmov)") - else - writelog && write(logfile,"\nSTOPPED by number of failures criteria") - end - ## if(newT.loglik > liktolAbs) #not really close to 0.0, based on absTol also - ## write(logfile,"\nnewT.loglik $(newT.loglik) not really close to 0.0 based on loglik abs. tol. $(liktolAbs), you might need to redo with another starting point") - ## end - if(newT.numBad > 0) # if bad diamond I, need to keep gammaz info in parenthetical description - for n in newT.hybrid - setGammaBLfromGammaz!(n,newT) # get t and γ that are compatible with estimated gammaz values - end - end - writelog && write(logfile,"\nEND optTopLevel: found minimizer topology at step $(count) (failures: $(failures)) with -loglik=$(round(newT.loglik, digits=5)) and ht_min=$(round.(newT.ht, digits=5))") - writelog && printCounts(movescount,movesgamma,logfile) - @debug begin - printEdges(newT) - printPartitions(newT) - printNodes(newT) - writeTopologyLevel1(newT,true) ## this changes non-identifiable BLs in newT to -1 - end - if CHECKNET && !isempty(d.repSpecies) - checkTop4multAllele(newT) || error("newT not suitable for multiple alleles at the very end") - end - return newT -end - -optTopLevel!(currT::HybridNetwork, d::DataCF, hmax::Integer) = optTopLevel!(currT, likAbs, numFails, d, hmax,fRel, fAbs, xRel, xAbs, false,true,numMoves, stdout,true) -optTopLevel!(currT::HybridNetwork, d::DataCF, hmax::Integer, verbose::Bool) = optTopLevel!(currT, likAbs, numFails, d, hmax,fRel, fAbs, xRel, xAbs, verbose,true,numMoves,stdout,true) -optTopLevel!(currT::HybridNetwork, liktolAbs::Float64, Nfail::Integer, d::DataCF, hmax::Integer,ftolRel::Float64, ftolAbs::Float64, xtolRel::Float64, xtolAbs::Float64, verbose::Bool, closeN ::Bool, Nmov0::Vector{Int}) = optTopLevel!(currT, liktolAbs, Nfail, d, hmax,ftolRel, ftolAbs, xtolRel, xtolAbs, verbose, closeN , Nmov0,stdout,true) - - - -# function to print count of number of moves after optTopLevel -# s: IOStream to decide if you want to print to a file or to screen, by default to screen -function printCounts(movescount::Vector{Int}, movesgamma::Vector{Int},s::Union{IOStream,Base.TTY}) - length(movescount) == 18 || error("movescount should have length 18, not $(length(movescount))") - length(movesgamma) == 13 || error("movesgamma should have length 13, not $(length(movescount))") - print(s,"\nPERFORMANCE: total number of moves (proposed, successful, accepted) in general, and to fix gamma=0.0,t=0.0 cases\n") - print(s,"\t--------moves general--------\t\t\t\t --------moves gamma,t------\t\n") - print(s,"move\t Num.Proposed\t Num.Successful\t Num.Accepted\t | Num.Proposed\t Num.Successful\t Num.Accepted\n") - names = ["add","mvorigin","mvtarget","chdir","delete","nni"] - for i in 1:6 - if(i == 2 || i == 3) - print(s,"$(names[i])\t $(movescount[i])\t\t $(movescount[i+6])\t\t $(movescount[i+12])\t |\t $(movesgamma[i])\t\t $(movesgamma[i+6])\t\t --\n") - elseif(i == 1) - print(s,"$(names[i])\t\t $(movescount[i])\t\t $(movescount[i+6])\t\t $(movescount[i+12])\t |\t NA \t\t NA \t\t NA \n") - else - print(s,"$(names[i])\t\t $(movescount[i])\t\t $(movescount[i+6])\t\t $(movescount[i+12])\t |\t $(movesgamma[i])\t\t $(movesgamma[i+6])\t\t --\n") - end - end - suma = sum(movescount[7:12]); - suma2 = sum(movesgamma[7:12]) == 0 ? 1 : sum(movesgamma[7:12]) - print(s,"Total\t\t $(sum(movescount[1:6]))\t\t $(sum(movescount[7:12]))\t\t $(sum(movescount[13:18]))\t |\t $(sum(movesgamma[1:6]))\t\t $(sum(movesgamma[7:12]))\t\t $(movesgamma[13])\n") - print(s,"Proportion\t -- \t\t $(round(sum(movescount[7:12])/suma, digits=1))\t\t $(round(sum(movescount[13:18])/suma, digits=1))\t |\t -- \t\t $(round(sum(movesgamma[7:12])/suma2, digits=1))\t\t $(round(movesgamma[13]/suma2, digits=1))\n") -end - -printCounts(movescount::Vector{Int}, movesgamma::Vector{Int}) = printCounts(movescount, movesgamma,stdout) - -# function to print count of number of moves to a file -# file=name of file where to save -function printCounts(movescount::Vector{Int}, movesgamma::Vector{Int},file::AbstractString) - s = open(file,"w") - printCounts(movescount,movesgamma,s) - close(s) -end - - -# function to move down onw level to h-1 -# caused by gamma=0,1 or gammaz=0,1 -function moveDownLevel!(net::HybridNetwork) - global CHECKNET - !isTree(net) ||error("cannot delete hybridization in a tree") - @debug "MOVE: need to go down one level to h-1=$(net.numHybrids-1) hybrids because of conflicts with gamma=0,1" - @debug begin printEverything(net); "printed everything" end - CHECKNET && checkNet(net) - nh = net.ht[1 : net.numHybrids - net.numBad] - k = sum([e.istIdentifiable ? 1 : 0 for e in net.edge]) - nt = net.ht[net.numHybrids - net.numBad + 1 : net.numHybrids - net.numBad + k] - nhz = net.ht[net.numHybrids - net.numBad + k + 1 : length(net.ht)] - indh = net.index[1 : net.numHybrids - net.numBad] - indhz = net.index[net.numHybrids - net.numBad + k + 1 : length(net.ht)] - flagh,flagt,flaghz = isValid(nh,nt,nhz) - if(!flagh) - for i in 1:length(nh) - if(approxEq(nh[i],0.0) || approxEq(nh[i],1.0)) - edge = net.edge[indh[i]] - node = edge.node[edge.isChild1 ? 1 : 2]; - node.hybrid || error("hybrid edge $(edge.number) pointing at tree node $(node.number)") - deleteHybridizationUpdate!(net,node) - end - break - end - elseif(!flaghz) - net.numBad > 0 || error("not a bad diamond I and flaghz is $(flaghz), should be true") - i = 1 - while(i <= length(nhz)) - if(approxEq(nhz[i],0.0)) - nodehz = net.node[indhz[i]] - approxEq(nodehz.gammaz,nhz[i]) || error("nodehz $(nodehz.number) gammaz $(nodehz.gammaz) should match the gammaz in net.ht $(nhz[i]) and it does not") - edges = hybridEdges(nodehz) - edges[1].hybrid || error("bad diamond I situation, node $(nodehz.number) has gammaz $(nodehz.gammaz) so should be linked to hybrid edge, but it is not") - node = edges[1].node[edges[1].isChild1 ? 1 : 2]; - node.hybrid || error("hybrid edge $(edge.number) pointing at tree node $(node.number)") - deleteHybridizationUpdate!(net,node) - break - elseif(approxEq(nhz[i],1.0)) - approxEq(nhz[i+1],0.0) || error("gammaz for node $(net.node[indhz[i]].number) is $(nhz[i]) but the other gammaz is $(nhz[i+1]), the sum should be less than 1.0 (movedownlevel)") - nodehz = net.node[indhz[i+1]] - approxEq(nodehz.gammaz,nhz[i+1]) || error("nodehz $(nodehz.number) gammaz $(nodehz.gammaz) should match the gammaz in net.ht $(nhz[i+1]) and it does not") - edges = hybridEdges(nodehz) - edges[1].hybrid || error("bad diamond I situation, node $(nodehz.number) has gammaz $(nodehz.gammaz) so should be linked to hybrid edge, but it is not") - node = edges[1].node[edges[1].isChild1 ? 1 : 2]; - node.hybrid || error("hybrid edge $(edge.number) pointing at tree node $(node.number)") - deleteHybridizationUpdate!(net,node) - break - else - if(approxEq(nhz[i+1],0.0)) - nodehz = net.node[indhz[i+1]]; - approxEq(nodehz.gammaz,nhz[i+1]) || error("nodehz $(nodehz.number) gammaz $(nodehz.gammaz) should match the gammaz in net.ht $(nhz[i+1]) and it does not") - edges = hybridEdges(nodehz); - edges[1].hybrid || error("bad diamond I situation, node $(nodehz.number) has gammaz $(nodehz.gammaz) so should be linked to hybrid edge, but it is not") - node = edges[1].node[edges[1].isChild1 ? 1 : 2]; - node.hybrid || error("hybrid edge $(edge.number) pointing at tree node $(node.number)") - deleteHybridizationUpdate!(net,node) - break - elseif(approxEq(nhz[i+1],1.0)) - error("gammaz for node $(net.node[indhz[i]].number) is $(nhz[i]) but the other gammaz is $(nhz[i+1]), the sum should be less than 1.0 (movedownlevel)") - end - end - i += 2 - end - end - @debug begin printEverything(net); "printed everything" end - CHECKNET && checkNet(net) -end - -# checks if there are problems in estimated net.ht: -# returns flag for h, flag for t, flag for hz -function isValid(net::HybridNetwork) - nh = net.ht[1 : net.numHybrids - net.numBad] - k = sum([e.istIdentifiable ? 1 : 0 for e in net.edge]) - nt = net.ht[net.numHybrids - net.numBad + 1 : net.numHybrids - net.numBad + k] - nhz = net.ht[net.numHybrids - net.numBad + k + 1 : length(net.ht)] - #println("isValid on nh $(nh), nt $(nt), nhz $(nhz)") - return all((n->(0(n>0 && !approxEq(n,0.0))), nt), all((n->(0(0(n>0 && !approxEq(n,0.0))), nt), all((n->(00 branch lengths. - assumes same tips in network as in data: i.e. 2 separate tips per species - that has multiple alleles. - each call to `optTopRun1!` gets the same starting network. -- `optTopRun1!` calls `optTopLevel!` once, after deep copying + changing the starting network slightly. -- `optTopLevel!` calls `optBL!` various times and proposes new network with various moves. - -""" -function optTopRuns!(currT0::HybridNetwork, liktolAbs::Float64, Nfail::Integer, d::DataCF, hmax::Integer, - ftolRel::Float64, ftolAbs::Float64, xtolRel::Float64, xtolAbs::Float64, - verbose::Bool, closeN ::Bool, Nmov0::Vector{Int}, runs::Integer, - outgroup::AbstractString, rootname::AbstractString, seed::Integer, probST::Float64) - writelog = true - writelog_1proc = false - if (rootname != "") - julialog = string(rootname,".log") - logfile = open(julialog,"w") - juliaout = string(rootname,".out") - if Distributed.nprocs() == 1 - writelog_1proc = true - juliaerr = string(rootname,".err") - errfile = open(juliaerr,"w") - end - else - writelog = false - logfile = stdout # used in call to optTopRun1! - end - str = """optimization of topology, BL and inheritance probabilities using: - hmax = $(hmax), - tolerance parameters: ftolRel=$(ftolRel), ftolAbs=$(ftolAbs), - xtolAbs=$(xtolAbs), xtolRel=$(xtolRel). - max number of failed proposals = $(Nfail), liktolAbs = $(liktolAbs). - """ - if outgroup != "none" - str *= "Outgroup: $(outgroup) (for rooting at the final step)\n" - end - str *= (writelog ? "rootname for files: $(rootname)\n" : "no output files\n") - str *= "BEGIN: $(runs) runs on starting tree $(writeTopologyLevel1(currT0,true))\n" - if Distributed.nprocs()>1 - str *= " using $(Distributed.nprocs()) processors\n" - end - if (writelog) - write(logfile,str) - flush(logfile) - end - print(stdout,str) - print(stdout, Dates.format(Dates.now(), "yyyy-mm-dd H:M:S.s") * "\n") - # if 1 proc: time printed to logfile at start of every run, not here. - - if(seed == 0) - t = time()/1e9 - a = split(string(t),".") - seed = parse(Int,a[2][end-4:end]) #better seed based on clock - end - if (writelog) - write(logfile,"\nmain seed $(seed)\n") - flush(logfile) - else print(stdout,"\nmain seed $(seed)\n"); end - Random.seed!(seed) - seeds = [seed;round.(Integer,floor.(rand(runs-1)*100000))] - if writelog && !writelog_1proc - for i in 1:runs # workers won't write to logfile - write(logfile, "seed: $(seeds[i]) for run $(i)\n") - end - flush(logfile) - end - - tstart = time_ns() - bestnet = Distributed.pmap(1:runs) do i # for i in 1:runs - logstr = "seed: $(seeds[i]) for run $(i), $(Dates.format(Dates.now(), "yyyy-mm-dd H:M:S.s"))\n" - print(stdout, logstr) - msg = "\nBEGIN SNaQ for run $(i), seed $(seeds[i]) and hmax $(hmax)" - if writelog_1proc # workers can't write on streams opened by master - write(logfile, logstr * msg) - flush(logfile) - end - verbose && print(stdout, msg) - GC.gc(); - try - best = optTopRun1!(currT0, liktolAbs, Nfail, d, hmax,ftolRel, ftolAbs, xtolRel, xtolAbs, - verbose, closeN , Nmov0,seeds[i],logfile,writelog_1proc,probST); - logstr *= "\nFINISHED SNaQ for run $(i), -loglik of best $(best.loglik)\n" - verbose && print(stdout, logstr) - if writelog_1proc - logstr = writeTopologyLevel1(best,outgroup=outgroup, printID=true, multall=!isempty(d.repSpecies)) ## printID=true calls setNonIdBL - logstr *= "\n---------------------\n" - write(logfile, logstr) - flush(logfile) - end - return best - catch(err) - msg = "\nERROR found on SNaQ for run $(i) seed $(seeds[i]): $(err)\n" - logstr = msg * "\n---------------------\n" - if writelog_1proc - write(logfile, logstr) - flush(logfile) - write(errfile, msg) - flush(errfile) - end - @warn msg # returns: nothing - end - end - tend = time_ns() # in nanoseconds - telapsed = round(convert(Int, tend-tstart) * 1e-9, digits=2) # in seconds - writelog_1proc && close(errfile) - msg = "\n" * Dates.format(Dates.now(), "yyyy-mm-dd H:M:S.s") - if writelog - write(logfile, msg) - elseif verbose - print(stdout, msg) - end - filter!(n -> n !== nothing, bestnet) # remove "nothing", failed runs - if length(bestnet)>0 - ind = sortperm([n.loglik for n in bestnet]) - bestnet = bestnet[ind] - maxNet = bestnet[1]::HybridNetwork # tell type to compiler - else - error("all runs failed") - end - - ## need to do this before setting BL to -1 - if (writelog && !isTree(maxNet)) ## only do networks file if maxNet is not tree - println("best network and networks with different hybrid/gene flow directions printed to .networks file") - julianet = string(rootname,".networks") - s = open(julianet,"w") - otherNet = [] - try - otherNet = undirectedOtherNetworks(maxNet, outgroup=outgroup, insideSnaq=true) # do not use rootMaxNet - catch - write(s,"""Bug found when trying to obtain networks with modified hybrid/gene flow direction. - To help debug these cases and get other similar estimated networks for your analysis, - please send the estimated network in parenthetical format to solislemus@wisc.edu - with the subject BUG IN NETWORKS FILE. You can get this network from the .out file. - You can also post this problem to the google group, or github issues. Thank you!\n""") - end - write(s,"$(writeTopologyLevel1(maxNet,printID=true, multall=!isempty(d.repSpecies))), with -loglik $(maxNet.loglik) (best network found, remaining sorted by log-pseudolik; the smaller, the better)\n") - # best network is included first: for score comparison with other networks - foundBad = false - for n in otherNet - try - optBL!(n,d) ##optBL MUST have network with all the attributes, and undirectedOtherNetworks will return "good" networks that way - if(n.numBad > 0) # to keep gammaz info in parenthetical description of bad diamond I - for nod in n.hybrid - setGammaBLfromGammaz!(nod,n) # get t and γ that are compatible with estimated gammaz values - end - end - setNonIdBL!(n) - catch - n.loglik = -1 - foundBad = true - end - end - ## to sort otherNet by loglik value: - ind = sortperm([n.loglik for n in otherNet]) - otherNet = otherNet[ind] - for n in otherNet - write(s,"$(writeTopologyLevel1(n,printID=true, multall=!isempty(d.repSpecies))), with -loglik $(n.loglik)\n") - end - foundBad && write(s,"Problem found when optimizing branch lengths for some networks, left loglik as -1. Please report this issue on github. Thank you!") - close(s) - end - - setNonIdBL!(maxNet) - - if outgroup != "none" - try - checkRootPlace!(maxNet,outgroup=outgroup) ## keeps all attributes - catch err - if isa(err, RootMismatch) - println("RootMismatch: ", err.msg, - """\nThe estimated network has hybrid edges that are incompatible with the desired outgroup. - Reverting to an admissible root position. - """) - else - println("error trying to reroot: ", err.msg); - end - checkRootPlace!(maxNet,verbose=false) # message about problem already printed above - end - else - checkRootPlace!(maxNet,verbose=false) #leave root in good place after snaq - end - - writelog && - write(logfile,"\nMaxNet is $(writeTopologyLevel1(maxNet,printID=true, multall=!isempty(d.repSpecies))) \nwith -loglik $(maxNet.loglik)\n") - print(stdout,"\nMaxNet is $(writeTopologyLevel1(maxNet,printID=true, multall=!isempty(d.repSpecies))) \nwith -loglik $(maxNet.loglik)\n") - - s = writelog ? open(juliaout,"w") : stdout - str = writeTopologyLevel1(maxNet, printID=true,multall=!isempty(d.repSpecies)) * """ - -Ploglik = $(maxNet.loglik) - Dendroscope: $(writeTopologyLevel1(maxNet,di=true, multall=!isempty(d.repSpecies))) - Elapsed time: $(telapsed) seconds, $(runs) attempted runs - ------- - List of estimated networks for all runs (sorted by log-pseudolik; the smaller, the better): - """ - for n in bestnet - str *= " " - str *= (outgroup == "none" ? writeTopologyLevel1(n,printID=true, multall=!isempty(d.repSpecies)) : - writeTopologyLevel1(n,outgroup=outgroup, printID=true, multall=!isempty(d.repSpecies))) - str *= ", with -loglik $(n.loglik)\n" - end - str *= "-------\n" - write(s,str); - writelog && close(s) # to close juliaout file (but not stdout!) - writelog && close(logfile) - - return maxNet -end - -optTopRuns!(currT::HybridNetwork, d::DataCF, hmax::Integer, runs::Integer, outgroup::AbstractString, rootname::AbstractString) = optTopRuns!(currT, likAbs, numFails, d, hmax,fRel, fAbs, xRel, xAbs, false, true, numMoves, runs, outgroup,rootname,0,0.3) -optTopRuns!(currT::HybridNetwork, d::DataCF, hmax::Integer, runs::Integer, outgroup::AbstractString) = optTopRuns!(currT, likAbs, numFails, d, hmax,fRel, fAbs, xRel, xAbs, false, true, numMoves, runs, outgroup,"optTopRuns",0,0.3) -optTopRuns!(currT::HybridNetwork, d::DataCF, hmax::Integer, runs::Integer) = optTopRuns!(currT, likAbs, numFails, d, hmax,fRel, fAbs, xRel, xAbs, false, true, numMoves, runs, "none", "optTopRuns",0,0.3) -optTopRuns!(currT::HybridNetwork, d::DataCF, hmax::Integer) = optTopRuns!(currT, likAbs, numFails, d, hmax,fRel, fAbs, xRel, xAbs, false, true, numMoves, 10, "none", "optTopRuns",0,0.3) - -# picks a modification of starting topology and calls optTopLevel -# the seed is used as is -# does *not* modify currT0. Modifies data d only. -""" - optTopRun1!(net, liktolAbs, Nfail, d::DataCF, hmax, etc.) - -The function will run 1 run by modifying the starting topology and -calling `optTopLevel`. See [`optTopRuns!`](@ref) for a roadmap. - -`probST` (default in snaq is 0.3) is the probability of starting one run -at the same input tree. So, with probability `1-probST`, we will change the -topology by a NNI move on a tree edge without neighbor hybrid. -If the starting topology is a network, then with probability `1-probST` -it will also modify one randomly chosen hybrid edge: with prob 0.5, -the function will move origin, with prob 0.5 will do move target. - -If there are multiple alleles (`d.repSpecies` not empty), -then the function has to check that the starting topology -does not violate the multiple alleles condition. - -After modifying the starting topology with NNI and/or move origin/target, -`optTopLevel` is called. -""" -function optTopRun1!(currT0::HybridNetwork, liktolAbs, Nfail::Integer, d::DataCF, hmax::Integer, - ftolRel::Float64, ftolAbs::Float64, xtolRel::Float64, xtolAbs::Float64, - verbose::Bool, closeN ::Bool, Nmov0::Vector{Int},seed::Integer, - logfile::IO, writelog::Bool, probST::Float64) - Random.seed!(seed) - currT = deepcopy(currT0); - if(probST<1.0 && rand() < 1-probST) # modify starting tree by a nni move - suc = NNIRepeat!(currT,10); #will try 10 attempts to do an nni move, if set to 1, hard to find it depending on currT - if(!isempty(d.repSpecies)) - suc2 = checkTop4multAllele(currT) - suc &= suc2 - if(!suc2) - currT = deepcopy(currT0) - end - end - writelog && suc && write(logfile," changed starting topology by NNI move\n") - if(!isTree(currT)) - if(rand() < 1-probST) # modify starting network by mvorigin, mvtarget with equal prob - currT0 = deepcopy(currT) # to go back if new topology does not work for mult alleles - if(currT.numHybrids == 1) - ind = 1 - else - ind = 0 - while(ind == 0 || ind > length(currT.hybrid)) - ind = round(Integer,rand()*length(currT.hybrid)); - end - end - if(rand()<0.5) - suc = moveOriginUpdateRepeat!(currT,currT.hybrid[ind],true) - if(!isempty(d.repSpecies)) - suc2 = checkTop4multAllele(currT) - suc &= suc2 - if(!suc2) - currT = deepcopy(currT0) - end - end - writelog && suc && write(logfile,"\n changed starting network by move origin") - else - suc = moveTargetUpdateRepeat!(currT,currT.hybrid[ind],true) - if(!isempty(d.repSpecies)) - suc2 = checkTop4multAllele(currT) - suc &= suc2 - if(!suc2) - currT = deepcopy(currT0) - end - end - writelog && suc && write(logfile,"\n changed starting network by move target") - end - end - end - end - GC.gc(); - optTopLevel!(currT, liktolAbs, Nfail, d, hmax,ftolRel, ftolAbs, xtolRel, xtolAbs, verbose, closeN , Nmov0,logfile,writelog) -end - -optTopRun1!(currT::HybridNetwork, d::DataCF, hmax::Integer) = optTopRun1!(currT, likAbs, numFails, d, hmax,fRel, fAbs, xRel, xAbs, false, true, numMoves, 0,stdout,true,0.3) -optTopRun1!(currT::HybridNetwork, d::DataCF, hmax::Integer, seed::Integer) = optTopRun1!(currT, likAbs, numFails, d, hmax,fRel, fAbs, xRel, xAbs, false, true, numMoves,seed,stdout,true,0.3) - - -# function SNaQ: it calls directly optTopRuns but has a prettier name -# it differs from optTopRuns in that it creates a deepcopy of the starting topology, -# check that it's of level 1 and updates its BL. -# only currT and d are necessary, all others are optional and have default values -""" - snaq!(T::HybridNetwork, d::DataCF) - -Estimate the network (or tree) to fit observed quartet concordance factors (CFs) -stored in a DataCF object, using maximum pseudo-likelihood. A level-1 network is assumed. -The search starts from topology `T`, -which can be a tree or a network with no more than `hmax` hybrid nodes. -The function name ends with ! because it modifies the CF data `d` by updating its -attributes `expCF`: CFs expected under the network model. -It does *not* modify `T`. -The quartet pseudo-deviance is the negative log pseudo-likelihood, -up to an additive constant, such that a perfect fit corresponds to a deviance of 0.0. - -Output: - -- estimated network in file `.out` (also in `.log`): best network overall and list of - networks from each individual run. -- the best network and modifications of it, in file `.networks`. - All networks in this file have the same undirected topology as the best network, - but have different hybrid/gene flow directions. These other networks are reported with - their pseudo-likelihood scores, because - non-identifiability issues can cause them to have very similar scores, and because - SNaQ was shown to estimate the undirected topology accurately but not the direction of - hybridization in cases of near non-identifiability. -- if any error occurred, file `.err` provides information (seed) to reproduce the error. - -There are many optional arguments, including - -- `hmax` (default 1): maximum number of hybridizations allowed -- `verbose` (default false): if true, print information about the numerical optimization -- `runs` (default 10): number of independent starting points for the search -- `outgroup` (default none): outgroup taxon to root the estimated topology at the very end -- `filename` (default "snaq"): root name for the output files (`.out`, `.err`). If empty (""), - files are *not* created, progress log goes to the screen only (standard out). -- `seed` (default 0 to get it from the clock): seed to replicate a given search -- `probST` (default 0.3): probability to start from `T` at each given run. - With problability 1-probST, the search is started from an NNI modification of `T` - along a tree edge with no hybrid neighbor, - with a possible modification of one reticulation if `T` has one. -- `updateBL` (default true): If true and if `T` is a tree, the branch lengths in `T` - are first optimized roughly with [`updateBL!`](@ref) by using the average CF of - all quartets defining each branch and back-calculating the coalescent units. - -The following optional arguments control when to stop the optimization of branch lengths -and γ's on each individual candidate network. Defaults are in parentheses: - -- `ftolRel` (1e-6) and `ftolAbs` (1e-6): relative and absolute differences of the network score - between the current and proposed parameters, -- `xtolRel` (1e-2) and `xtolAbs` (1e-3): relative and absolute differences between the current - and proposed parameters. - -Greater values will result in a less thorough but faster search. These parameters are used -when evaluating candidate networks only. -The following optional arguments control when to stop proposing new network topologies: - -- `Nfail` (75): maximum number of times that new topologies are proposed and rejected (in a row). -- `liktolAbs` (1e-6): the proposed network is accepted if its score is better than the current score by - at least liktolAbs. - -Lower values of `Nfail` and greater values of `liktolAbs` and `ftolAbs` would result in a less thorough but faster search. - -At the end, branch lengths and γ's are optimized on the last "best" network -with different and very thorough tolerance parameters: -1e-12 for ftolRel, 1e-10 for ftolAbs, xtolRel, xtolAbs. - -See also: [`topologyMaxQPseudolik!`](@ref) to optimize parameters on a fixed topology, -and [`topologyQPseudolik!`](@ref) to get the deviance (pseudo log-likelihood up to a constant) -of a fixed topology with fixed parameters. - -Reference: -Claudia Solís-Lemus and Cécile Ané (2016). -Inferring phylogenetic networks with maximum pseudolikelihood under incomplete lineage sorting. -[PLoS Genetics](http://journals.plos.org/plosgenetics/article?id=10.1371/journal.pgen.1005896) -12(3):e1005896 -""" -function snaq!(currT0::HybridNetwork, d::DataCF; - hmax=1::Integer, liktolAbs=likAbs::Float64, Nfail=numFails::Integer, - ftolRel=fRel::Float64, ftolAbs=fAbs::Float64, xtolRel=xRel::Float64, xtolAbs=xAbs::Float64, - verbose=false::Bool, closeN=true::Bool, Nmov0=numMoves::Vector{Int}, - runs=10::Integer, outgroup="none"::AbstractString, filename="snaq"::AbstractString, - seed=0::Integer, probST=0.3::Float64, updateBL=true::Bool) - 0.0<=probST<=1.0 || error("probability to keep the same starting topology should be between 0 and 1: $(probST)") - currT0.numTaxa >= 5 || error("cannot estimate hybridizations in topologies with fewer than 5 taxa, this topology has $(currT0.numTaxa) taxa") - typemax(Int) > length(d.quartet) || - @warn "the number of rows / 4-taxon sets exceeds the max integer of type $Int ($(typemax(Int))). High risk of overflow errors..." - # need a clean starting net. fixit: maybe we need to be more thorough here - # yes, need to check that everything is ok because it could have been cleaned and then modified - tmp1, tmp2 = taxadiff(d,currT0) - length(tmp1)==0 || error("these taxa appear in one or more quartets, but not in the starting topology: $tmp1") - if length(tmp2)>0 - s = "these taxa will be deleted from the starting topology, they have no quartet CF data:\n" - for tax in tmp2 s *= " $tax"; end - @warn s - currT0 = deepcopy(currT0) - for tax in tmp2 - deleteleaf!(currT0, tax) - end - end - startnet = readTopologyUpdate(writeTopologyLevel1(currT0)) # update all level-1 things - flag = checkNet(startnet,true) # light checking only - flag && error("starting topology suspected not level-1") - try - checkNet(startnet) - catch err - err.msg = "starting topology not a level 1 network:\n" * err.msg - rethrow(err) - end - if updateBL && isTree(startnet) - updateBL!(startnet,d) - end - # for the case of multiple alleles: expand into two leaves quartets like sp1 sp1 sp2 sp3. - if !isempty(d.repSpecies) - expandLeaves!(d.repSpecies,startnet) - startnet = readTopologyLevel1(writeTopologyLevel1(startnet)) # dirty fix to multiple alleles problem with expandLeaves - end - net = optTopRuns!(startnet, liktolAbs, Nfail, d, hmax, ftolRel,ftolAbs, xtolRel,xtolAbs, - verbose, closeN, Nmov0, runs, outgroup, filename,seed,probST) - if(!isempty(d.repSpecies)) - mergeLeaves!(net) - end - - # checking root again after merging leaves. This is a band aid. - # To-do: rethink order of check root and merge leaves inside optTopRuns - if outgroup != "none" - try - checkRootPlace!(net,outgroup=outgroup) ## keeps all attributes - catch err - if isa(err, RootMismatch) - println("RootMismatch: ", err.msg, - """\nThe estimated network has hybrid edges that are incompatible with the desired outgroup. - Reverting to an admissible root position. - """) - else - println("error trying to reroot: ", err.msg); - end - checkRootPlace!(net,verbose=false) # message about problem already printed above - end - else - checkRootPlace!(net,verbose=false) #leave root in good place after snaq - end - return net -end - - -## function to modify the starting topology currT0 by an NNI move with probability 1-probST -## if starting topology is a network: also do move Origin/Target with prob 1-probST, each 50-50 chance -## if outgroup!="none" means that the root placement matters at the end (on outgroup), used for max parsimony -function findStartingTopology!(currT0::HybridNetwork, probST::Float64, multAll::Bool, writelog::Bool, logfile::IO; - outgroup="none"::Union{AbstractString,Integer}) - currT = deepcopy(currT0); - if probST<1.0 && rand() < 1-probST # modify starting tree by a nni move - suc = NNIRepeat!(currT,10); #will try 10 attempts to do an nni move, if set to 1, hard to find it depending on currT - if multAll - suc2 = checkTop4multAllele(currT) - suc &= suc2 - if !suc2 - currT = deepcopy(currT0) - end - end - writelog && suc && write(logfile," changed starting topology by NNI move\n") - if !isTree(currT) - if rand() < 1-probST # modify starting network by mvorigin, mvtarget with equal prob - currT0 = deepcopy(currT) # to go back if new topology does not work for mult alleles - ind = rand(1:currT.numHybrids) - mymove = ( rand()<0.5 ? "origin" : "target" ) - mymove_fun! = (mymove=="origin" ? moveOriginUpdateRepeat! : moveTargetUpdateRepeat!) - suc = mymove_fun!(currT,currT.hybrid[ind],true) - if multAll - suc2 = checkTop4multAllele(currT) - suc &= suc2 - if !suc2 - currT = deepcopy(currT0) - end - end - writelog && suc && write(logfile,"\n changed starting network by move $(mymove)") - end - end - end - GC.gc(); - if outgroup != "none" - currT1 = deepcopy(currT) ##just to check, but we do not want a rooted network at the end - try - rootatnode!(currT1,outgroup) - catch err - if isa(err, RootMismatch) - println("RootMismatch: ", err.msg, - """\nThe starting topology has hybrid edges that are incompatible with the desired outgroup. - Reverting to original starting topology. - """) - else - println("error trying to reroot: ", err.msg); - end - currT = deepcopy(currT0) - end - end - return currT -end diff --git a/src/substitutionModels.jl b/src/substitutionModels.jl deleted file mode 100644 index 9b3ba7609..000000000 --- a/src/substitutionModels.jl +++ /dev/null @@ -1,1430 +0,0 @@ -""" - SubstitutionModel - -Abstract type for substitution models, -using a continous time Markov model on a phylogeny. -Adapted from [SubstitutionModels.jl](https://github.com/BioJulia/SubstitutionModels.jl/) -in BioJulia. - -For variable rates, see [`RateVariationAcrossSites`](@ref) - -For sub types, see [`NucleicAcidSubstitutionModel`](@ref), [`TraitSubstitutionModel`](@ref) - -All these models are supposed to have fields `rate` and `eigeninfo`. -""" -abstract type SubstitutionModel end #ideally, we'd like this to be SubstitutionModels.SubstitionModel -const SM = SubstitutionModel -const Qmatrix = StaticArrays.SMatrix{4, 4, Float64} -const Pmatrix = StaticArrays.MMatrix{4, 4, Float64} -const Bmatrix = StaticArrays.MMatrix{2, 2, Float64} - -""" - TraitSubstitutionModel - -For subtypes, see [`BinaryTraitSubstitutionModel`](@ref), -[`EqualRatesSubstitutionModel`](@ref), -[`TwoBinaryTraitSubstitutionModel`](@ref) -""" -abstract type TraitSubstitutionModel{T} <: SubstitutionModel end #this accepts labels -const TSM = TraitSubstitutionModel{T} where T #T is type of labels - -""" - NucleicAcidSubstitutionModel - -Adapted from [SubstitutionModels.jl](https://github.com/BioJulia/SubstitutionModels.jl/) -in BioJulia. The same [`Q`](@ref) and [`P`](@ref) function names are used for the -transition rates and probabilities. - -For subtypes, see [`JC69`](@ref), [`HKY85`](@ref) -""" -abstract type NucleicAcidSubstitutionModel <: SubstitutionModel end -const NASM = NucleicAcidSubstitutionModel - -""" - nparams(model) - -Number of parameters for a given trait evolution model -(length of field `model.rate`). -""" -nparams(obj::SM) = error("nparams not defined for $(typeof(obj)).") - -""" - setrates!(model, rates) - -update rates then call [`seteigeninfo!`](@ref) to update a model's eigeninfo -""" -function setrates!(obj::SM, rates::AbstractVector) - obj.rate[:] = rates - seteigeninfo!(obj) -end - -""" - seteigeninfo!(obj) - -Calculate eigenvalue & eigenfector information for a substitution model (SM) object -(as needed to calculate transition rate matrices) and store this info within the object. -""" -function seteigeninfo!(obj::SM) - error("seteigeninfo! not finalized yet for generic substitution models") - # eig_vals, eig_vecs = eigen(Q(obj)) #this assumes that every SM has an eigeninfo and has - # obj.eigeninfo[:] = eig_vals, eig_vecs, inv(eig_vecs) - # then make P! use seteigeninfo! by for a generic SM -end - -""" - getlabels(model) - -State labels of a substitution model. -""" -function getlabels(obj::SM) - error("Model must be of type TraitSubstitutionModel or NucleicAcidSubstitutionModel. Got $(typeof(obj))") -end - -""" - nstates(model) - -Number of character states for a given evolution model. -""" -nstates(obj::SM) = error("nstates not defined for $(typeof(obj)).") - -""" -For example, this is 4 for a `NucleicAcidSubstitutionModel`. - -```jldoctest -julia> nstates(JC69([0.03], false)) -4 - -julia> nstates(HKY85([.5], [0.25, 0.25, 0.25, 0.25])) -4 -``` -""" -function nstates(obj::NASM) - return 4::Int -end - -function getlabels(obj::TSM) - return obj.label -end - -""" -for a given [`NucleicAcidSubstitutionModel`](@ref), labels are symbols -from [BioSymbols](https://github.com/BioJulia/BioSymbols.jl). -For now, only ACGTs are allowed. (When fitting data, any ambiguity code -in the data would be treated as missing value). - -# examples - -```jldoctest -julia> getlabels(JC69([0.03], false)) -4-element Vector{BioSymbols.DNA}: - DNA_A - DNA_C - DNA_G - DNA_T - -julia> getlabels(HKY85([.5], repeat([0.25], 4))) -4-element Vector{BioSymbols.DNA}: - DNA_A - DNA_C - DNA_G - DNA_T - -``` -""" -function getlabels(::NASM) - return [BioSymbols.DNA_A, BioSymbols.DNA_C, BioSymbols.DNA_G, BioSymbols.DNA_T] -end - -""" - Q(model) - -Substitution rate matrix for a given substitution model: -Q[i,j] is the rate of transitioning from state i to state j. -""" -Q(obj::SM) = error("rate matrix Q not defined for $(typeof(obj)).") - -""" - showQ(IO, model) - -Print the Q matrix to the screen, with trait states as labels on rows and columns. -adapted from prettyprint function by mcreel, found 2017/10 at -https://discourse.julialang.org/t/display-of-arrays-with-row-and-column-names/1961/6 -""" -function showQ(io::IO, obj::SM) - M = Q(obj) - pad = max(8,maximum(length(getlabels(obj))+1)) - for i = 1:size(M,2) # print the header - print(io, lpad(getlabels(obj)[i],(i==1 ? 2*pad : pad), " ")) - end - for i = 1:size(M,1) # print one row per state - print(io, "\n") - if getlabels(obj) != "" - print(io, lpad(getlabels(obj)[i],pad," ")) - end - for j = 1:size(M,2) - if j == i - print(io, lpad("*",pad," ")) - else - fmt = "%$(pad).4f" - @eval(@printf($io,$fmt,$(M[i,j]))) - end - end - end -end - -""" - P(obj, t) - -Probability transition matrix for a [`TraitSubstitutionModel`](@ref), of the form - - P[1,1] ... P[1,k] - . . - . . - P[k,1] ... P[k,k] - -where P[i,j] is the probability of ending in state j after time t, -given that the process started in state i. -see also: [`P!`](@ref). - -HKY example: -```jldoctest -julia> m1 = HKY85([0.5], [0.20, 0.30, 0.30, 0.20]) -HKY85 Substitution Model base frequencies: [0.2, 0.3, 0.3, 0.2] -relative rate version with transition/tranversion ratio kappa = 0.5, - scaled so that there is one substitution per unit time -rate matrix Q: - A C G T - A * 0.4839 0.2419 0.3226 - C 0.3226 * 0.4839 0.1613 - G 0.1613 0.4839 * 0.3226 - T 0.3226 0.2419 0.4839 * - -julia> PhyloNetworks.P(m1, 0.2) -4×4 StaticArraysCore.MMatrix{4, 4, Float64, 16} with indices SOneTo(4)×SOneTo(4): - 0.81592 0.0827167 0.0462192 0.0551445 - 0.0551445 0.831326 0.0827167 0.0308128 - 0.0308128 0.0827167 0.831326 0.0551445 - 0.0551445 0.0462192 0.0827167 0.81592 -``` - -Juke-Cantor example: -```jldoctest -julia> m1 = JC69([1.]); - -julia> PhyloNetworks.P(m1, 0.2) -4×4 StaticArraysCore.MMatrix{4, 4, Float64, 16} with indices SOneTo(4)×SOneTo(4): - 0.824446 0.0585179 0.0585179 0.0585179 - 0.0585179 0.824446 0.0585179 0.0585179 - 0.0585179 0.0585179 0.824446 0.0585179 - 0.0585179 0.0585179 0.0585179 0.824446 -``` -""" -@inline function P(obj::SM, t::Float64) - t >= 0.0 || error("substitution model: >=0 branch lengths are needed") - k = nstates(obj) - Pmat = MMatrix{k,k,Float64}(undef) - return P!(Pmat, obj, t) -end - -""" - P!(Pmat::AbstractMatrix, obj::SM, t::Float64) - -Fill in the input matrix `Pmat` with the transition rates -to go from each state to another in time `t`, according to rates in `Q`. -see also: [`P`](@ref). - -```jldoctest -julia> m1 = BinaryTraitSubstitutionModel([1.0,2.0], ["low","high"]) -Binary Trait Substitution Model: -rate low→high α=1.0 -rate high→low β=2.0 - -julia> PhyloNetworks.P!(Matrix{Float64}(undef,2,2), m1, 0.3) # fills an uninitialized 2x2 matrix of floats -2×2 Matrix{Float64}: - 0.80219 0.19781 - 0.39562 0.60438 - -julia> m2 = JC69([1.]); - -julia> PhyloNetworks.P!(Matrix{Float64}(undef,4,4), m2, 0.2) -4×4 Matrix{Float64}: - 0.824446 0.0585179 0.0585179 0.0585179 - 0.0585179 0.824446 0.0585179 0.0585179 - 0.0585179 0.0585179 0.824446 0.0585179 - 0.0585179 0.0585179 0.0585179 0.824446 -``` -""" -@inline function P!(Pmat::AbstractMatrix, obj::SM, t::Float64) - Pmat[:] = exp(Q(obj) * t) - return Pmat -end - -""" - BinaryTraitSubstitutionModel(α, β [, label]) - -Model for binary traits, that is, with 2 states. Default labels are "0" and "1". -α is the rate of transition from "0" to "1", and β from "1" to "0". -""" -struct BinaryTraitSubstitutionModel{T} <: TraitSubstitutionModel{T} # fixit: back to mutable struct? - rate::Vector{Float64} - label::Vector{T} # most often: T = String, but could be BioSymbols.DNA - eigeninfo::Vector{Float64} - function BinaryTraitSubstitutionModel{T}(rate::Vector{Float64}, label::Vector{T}, eigeninfo::Vector{Float64}) where T - #Warning: this constructor should not be used directly. Use it with the constructors below. - @assert length(rate) == 2 "binary state: need 2 rates" - rate[1] >= 0. || error("parameter α must be non-negative") - rate[2] >= 0. || error("parameter β must be non-negative") - @assert length(label) == 2 "need 2 labels exactly" - new(rate, label, eigeninfo) - end -end -const BTSM = BinaryTraitSubstitutionModel{T} where T -function BinaryTraitSubstitutionModel(r::AbstractVector, label::AbstractVector) - obj = BinaryTraitSubstitutionModel{eltype(label)}(r::AbstractVector, label::AbstractVector, zeros(3)) # Vector{Float64}(undef,3) for julia v1.0 - seteigeninfo!(obj) - return obj -end -BinaryTraitSubstitutionModel(α::Float64, β::Float64, label::AbstractVector) = BinaryTraitSubstitutionModel([α,β], label) -BinaryTraitSubstitutionModel(α::Float64, β::Float64) = BinaryTraitSubstitutionModel(α, β, ["0", "1"]) - -""" -for a [`BinaryTraitSubstitutionModel`]: store eigenvalue (q_01+q_10) and stationary distribution -""" -function seteigeninfo!(obj::BTSM) - ab = obj.rate[1] + obj.rate[2] #eigenvalue = -(a+b) - ab > 0. || error("α+β must be positive") - p0 = obj.rate[2]/ab # asymptotic frequency of state "0" - p1 = obj.rate[1]/ab # asymptotic frequency of state "1" - obj.eigeninfo[1] = ab - obj.eigeninfo[2] = p0 - obj.eigeninfo[3] = p1 -end - -""" -for a `BinaryTraitSubstitutionModel`, this is 2: - -```jldoctest -julia> m1 = BinaryTraitSubstitutionModel([1.0,2.0], ["low","high"]) -Binary Trait Substitution Model: -rate low→high α=1.0 -rate high→low β=2.0 - -julia> nstates(m1) -2 -``` -""" -function nstates(::BTSM) - return 2::Int -end - -nparams(::BTSM) = 2::Int - -""" -For a BinaryTraitSubstitutionModel, the rate matrix Q is of the form: - - -α α - β -β -""" -@inline function Q(obj::BTSM) - return Bmatrix(-obj.rate[1], obj.rate[2], obj.rate[1], -obj.rate[2]) -end - -function Base.show(io::IO, obj::BTSM) - str = "Binary Trait Substitution Model:\n" - str *= "rate $(obj.label[1])→$(obj.label[2]) α=$(round(obj.rate[1], digits=5))\n" - str *= "rate $(obj.label[2])→$(obj.label[1]) β=$(round(obj.rate[2], digits=5))" - print(io, str) -end - -function P!(Pmat::AbstractMatrix, obj::BTSM, t::Float64) - e1 = exp(-obj.eigeninfo[1]*t) - a0= obj.eigeninfo[2]*e1 - a1= obj.eigeninfo[3]*e1 - Pmat[1,1] = obj.eigeninfo[2]+a1 - Pmat[2,1] = obj.eigeninfo[2]-a0 - Pmat[1,2] = obj.eigeninfo[3]-a1 - Pmat[2,2] = obj.eigeninfo[3]+a0 - return Pmat -end - -""" - TwoBinaryTraitSubstitutionModel(rate [, label]) - -[`TraitSubstitutionModel`](@ref) for two binary traits, possibly correlated. -Default labels are "x0", "x1" for trait 1, and "y0", "y1" for trait 2. -If provided, `label` should be a vector of size 4, listing labels for -trait 1 first then labels for trait 2. -`rate` should be a vector of substitution rates of size 8. -rate[1],...,rate[4] describe rates of changes in trait 1. -rate[5],...,rate[8] describe rates of changes in trait 2. -In the transition matrix, trait combinations are listed in the following order: -x0-y0, x0-y1, x1-y0, x1-y1. - -# example - -```julia -model = TwoBinaryTraitSubstitutionModel([2.0,1.2,1.1,2.2,1.0,3.1,2.0,1.1], - ["carnivory", "noncarnivory", "wet", "dry"]); -model -using PhyloPlots -plot(model) # to visualize states and rates -``` -""" -struct TwoBinaryTraitSubstitutionModel <: TraitSubstitutionModel{String} - rate::Vector{Float64} - label::Vector{String} - function TwoBinaryTraitSubstitutionModel(α, label) - all( x -> x >= 0., α) || error("rates must be non-negative") - @assert length(α)==8 "need 8 rates" - @assert length(label)==4 "need 4 labels for all combinations of 2 binary traits" - new(α, [string(label[1], "-", label[3]), # warning: original type of 'label' lost here - string(label[1], "-", label[4]), - string(label[2], "-", label[3]), - string(label[2], "-", label[4])]) - end -end -const TBTSM = TwoBinaryTraitSubstitutionModel -TwoBinaryTraitSubstitutionModel(α::Vector{Float64}) = TwoBinaryTraitSubstitutionModel(α, ["x0", "x1", "y0", "y1"]) - -nstates(::TBTSM) = 4::Int -nparams(::TBTSM) = 8::Int - -function Q(obj::TBTSM) - M = fill(0.0,(4,4)) - a = obj.rate - M[1,3] = a[1] - M[3,1] = a[2] - M[2,4] = a[3] - M[4,2] = a[4] - M[1,2] = a[5] - M[2,1] = a[6] - M[3,4] = a[7] - M[4,3] = a[8] - M[1,1] = -M[1,2] - M[1,3] - M[2,2] = -M[2,1] - M[2,4] - M[3,3] = -M[3,4] - M[3,1] - M[4,4] = -M[4,3] - M[4,2] - return M -end - -function Base.show(io::IO, obj::TBTSM) - print(io, "Substitution model for 2 binary traits, with rate matrix:\n") - showQ(io, obj) -end - -""" - EqualRatesSubstitutionModel(numberStates, α, labels) - -[`TraitSubstitutionModel`](@ref) for traits with any number of states -and equal substitution rates α between all states. -Default labels are "1","2",... - -# example - -```jldoctest -julia> m1 = EqualRatesSubstitutionModel(2, [1.0], ["low","high"]) -Equal Rates Substitution Model with k=2, -all rates equal to α=1.0. -rate matrix Q: - low high - low * 1.0000 - high 1.0000 * -``` -""" -struct EqualRatesSubstitutionModel{T} <: TraitSubstitutionModel{T} - k::Int - rate::Vector{Float64} - label::Vector{T} - eigeninfo::Vector{Float64} - function EqualRatesSubstitutionModel{T}(k::Int, rate::Vector{Float64}, - label::Vector{T}, eigeninfo::Vector{Float64}) where T - @assert length(label)==k "incorrect number of labels: k=$k, labels: $label" - @assert k >= 2 "need k >= 2 category labels. labels: $label" - @assert length(rate)==1 "rate must be a vector of length 1" - rate[1] > 0 || error("parameter α (rate) must be positive") - new(k, rate, label, eigeninfo) - end -end -const ERSM = EqualRatesSubstitutionModel{T} where T -function EqualRatesSubstitutionModel(k::Int, rate::Vector{Float64}, label::AbstractVector) - obj = EqualRatesSubstitutionModel{eltype(label)}(k::Int, rate::Vector{Float64}, label::AbstractVector, zeros(1)) # Vector{Float64}(undef,3) for julia v1.0 - seteigeninfo!(obj) - return obj -end -EqualRatesSubstitutionModel(k::Int, α::Float64, label::AbstractVector) = EqualRatesSubstitutionModel(k,[α],label) -EqualRatesSubstitutionModel(k::Int, α::Float64) = EqualRatesSubstitutionModel(k, [α], string.(1:k)) - - -""" -for a [`EqualRatesSubstitutionModel`]: store lambda = k/(k-1), where k is the number of states -""" -function seteigeninfo!(obj::ERSM) - q = (obj.k/(obj.k-1.0)) - obj.eigeninfo[1] = q -end - -function nstates(obj::ERSM) - return obj.k -end -nparams(::ERSM) = 1::Int - -function Base.show(io::IO, obj::ERSM) - str = "Equal Rates Substitution Model with k=$(obj.k),\n" - str *= "all rates equal to α=$(round(obj.rate[1], digits=5)).\n" - str *= "rate matrix Q:\n" - print(io, str) - showQ(io, obj) -end -function Q(obj::ERSM) - #this might be wrong, doesnt match ERSM proof - α = obj.rate[1] - M = fill(α, (obj.k,obj.k)) - d = -(obj.k-1) * α - for i in 1:obj.k - M[i,i] = d - end - return M -end - -""" - randomTrait(model, t, start) - randomTrait!(end, model, t, start) - -Simulate traits along one edge of length t. -`start` must be a vector of integers, each representing the starting value of one trait. -The bang version (ending with !) uses the vector `end` to store the simulated values. - -# Examples -```jldoctest -julia> m1 = BinaryTraitSubstitutionModel(1.0, 2.0) -Binary Trait Substitution Model: -rate 0→1 α=1.0 -rate 1→0 β=2.0 - -julia> using Random; Random.seed!(13); - -julia> randomTrait(m1, 0.2, [1,2,1,2,2]) -5-element Vector{Int64}: - 1 - 2 - 1 - 1 - 2 -``` -""" -function randomTrait(obj::TSM, t::Float64, start::AbstractVector{Int}) - res = Vector{Int}(undef, length(start)) - randomTrait!(res, obj, t, start) -end - -@doc (@doc randomTrait) randomTrait! -function randomTrait!(endTrait::AbstractVector{Int}, obj::TSM, t::Float64, start::AbstractVector{Int}) - Pt = P(obj, t) - k = size(Pt, 1) # number of states - w = [aweights(Pt[i,:]) for i in 1:k] - for i in 1:length(start) - endTrait[i] =sample(1:k, w[start[i]]) - end - return endTrait -end - -""" - randomTrait(model, net; ntraits=1, keepInternal=true, checkPreorder=true) - -Simulate evolution of discrete traits on a rooted evolutionary network based on -the supplied evolutionary model. Trait sampling is uniform at the root. - -optional arguments: - -- `ntraits`: number of traits to be simulated (default: 1 trait). -- `keepInternal`: if true, export character states at all nodes, including - internal nodes. if false, export character states at tips only. - -output: - -- matrix of character states with one row per trait, one column per node; - these states are *indices* in `model.label`, not the trait labels themselves. -- vector of node labels (for tips) or node numbers (for internal nodes) - in the same order as columns in the character state matrix - -# examples - -```jldoctest -julia> m1 = BinaryTraitSubstitutionModel(1.0, 2.0, ["low","high"]); - -julia> net = readTopology("(((A:4.0,(B:1.0)#H1:1.1::0.9):0.5,(C:0.6,#H1:1.0::0.1):1.0):3.0,D:5.0);"); - -julia> using Random; Random.seed!(95); - -julia> trait, lab = randomTrait(m1, net) -([1 2 … 1 1], ["-2", "D", "-3", "-6", "C", "-4", "H1", "B", "A"]) - -julia> trait -1×9 Matrix{Int64}: - 1 2 1 1 2 2 1 1 1 - -julia> lab -9-element Vector{String}: - "-2" - "D" - "-3" - "-6" - "C" - "-4" - "H1" - "B" - "A" -``` -""" -function randomTrait(obj::TSM, net::HybridNetwork; - ntraits=1::Int, keepInternal=true::Bool, checkPreorder=true::Bool) - net.isRooted || error("net needs to be rooted for preorder recursion") - if(checkPreorder) - preorder!(net) - end - nnodes = net.numNodes - M = Matrix{Int}(undef, ntraits, nnodes) # M[i,j]= trait i for node j - randomTrait!(M,obj,net) - if !keepInternal - M = getTipSubmatrix(M, net, indexation=:cols) # subset columns only. rows=traits - nodeLabels = [n.name for n in net.nodes_changed if n.leaf] - else - nodeLabels = [n.name == "" ? string(n.number) : n.name for n in net.nodes_changed] - end - return M, nodeLabels -end - -function randomTrait!(M::Matrix, obj::TSM, net::HybridNetwork) - recursionPreOrder!(net.nodes_changed, M, # updates M in place - updateRootRandomTrait!, - updateTreeRandomTrait!, - updateHybridRandomTrait!, - obj) -end - -function updateRootRandomTrait!(V::AbstractArray, i::Int, obj) - sample!(1:nstates(obj), view(V, :, i)) # uniform at the root - return -end - -function updateTreeRandomTrait!(V::Matrix, - i::Int,parentIndex::Int,edge::Edge, - obj) - randomTrait!(view(V, :, i), obj, edge.length, view(V, :, parentIndex)) -end - -function updateHybridRandomTrait!(V::Matrix, - i::Int, parentIndex1::Int, parentIndex2::Int, - edge1::Edge, edge2::Edge, obj) - randomTrait!(view(V, :, i), obj, edge1.length, view(V, :, parentIndex1)) - tmp = randomTrait(obj, edge2.length, view(V, :, parentIndex2)) - for j in 1:size(V,1) # loop over traits - if V[j,i] == tmp[j] # both parents of the hybrid node have the same trait - continue # skip the rest: go to next trait - end - if rand() > edge1.gamma - V[j,i] = tmp[j] # switch to inherit trait of parent 2 - end - end -end - -""" - JC69(rate, relative) - -Jukes Cantor (1969) nucleic acid substitution model, which has a single rate parameter. -`rate` corresponds to the absolute diagonal elements, that is, the rate of change -(to any of the other 2 states). Individual rates are `rate`/3. -If `relative` is true (default), the transition matrix [`Q`](@ref) is normalized -to an average of 1 transition per unit of time: in which case `rate` is set to 1.0. - -# examples - -```jldoctest -julia> m1 = JC69([0.25], false) -Jukes and Cantor 69 Substitution Model, -absolute rate version -off-diagonal rates equal to 0.25/3. -rate matrix Q: - A C G T - A * 0.0833 0.0833 0.0833 - C 0.0833 * 0.0833 0.0833 - G 0.0833 0.0833 * 0.0833 - T 0.0833 0.0833 0.0833 * - -julia> nstates(m1) -4 - -julia> nparams(m1) -1 - -julia> m2 = JC69([0.5]) -Jukes and Cantor 69 Substitution Model, -relative rate version -off-diagonal rates equal to 1/3 -rate matrix Q: - A C G T - A * 0.3333 0.3333 0.3333 - C 0.3333 * 0.3333 0.3333 - G 0.3333 0.3333 * 0.3333 - T 0.3333 0.3333 0.3333 * - -julia> nparams(m2) -0 -``` -""" -struct JC69 <: NucleicAcidSubstitutionModel - rate::Vector{Float64} - relative::Bool - eigeninfo::Vector{Float64} #TODO change to MVector, see if its faster - function JC69(rate::Vector{Float64}, relative::Bool, eigeninfo::Vector{Float64}) - #Warning: this constructor should not be used directly. Use the constructor below - # which will call this. - 0 <= length(rate) <= 1 || error("rate not a valid length for a JC69 model") - all(rate .> 0.0) || error("All elements of rate must be positive for a JC69 model") - new(rate, relative, eigeninfo) - end -end -function JC69(rate::AbstractVector, relative=true::Bool) - obj = JC69(rate, relative, zeros(1)) - seteigeninfo!(obj) - return obj -end -JC69(rate::Float64, relative=true::Bool) = JC69([rate], relative) - - -""" -for [`JC69`](@ref): store lambda = 4/3 (if relative) or rate * 4/3 (absolute). -""" -function seteigeninfo!(obj::JC69) - if obj.relative - lambda = (4.0/3.0) #eigen value of the Q matrix - else - lambda = (4.0/3.0)*obj.rate[1] #eigen value of the Q matrix - end - obj.eigeninfo[1] = lambda -end - -function Base.show(io::IO, obj::JC69) - str = "Jukes and Cantor 69 Substitution Model,\n" - if obj.relative == true - str *= "relative rate version\n" - str *= "off-diagonal rates equal to 1/3\n" - else - str *= "absolute rate version\n" - str *= "off-diagonal rates equal to $(round(obj.rate[1], digits=5))/3.\n" - end - str *= "rate matrix Q:\n" - print(io, str) - showQ(io, obj) -end - -""" - HKY85(rate, pi, relative) - -A nucleic acid substitution model based on Hasegawa et al. 1985 substitution model. -`rate` should be a vector of 1 or 2 rates, and `pi` a vector of 4 probabilities summing to 1. - -If `relative` is false, the 2 rates represent the transition rate and the transversion rate, -α and β. If `relative` is true (default), only the first rate is used and represents the -transition/transversion ratio: κ=α/β. The rate transition matrix Q is normalized to have -1 change / unit of time on average, i.e. the absolute version of Q is divided by -`2(piT*piC + piA*piG)α + 2(piY*piR)β`. - -`nparams` returns 1 or 2. -In other words: the stationary distribution is not counted in the number of parameters -(and `fitdiscrete` does not optimize the pi values at the moment). - -# examples - -```jldoctest -julia> m1 = HKY85([.5], [0.20, 0.30, 0.30, 0.20]) -HKY85 Substitution Model base frequencies: [0.2, 0.3, 0.3, 0.2] -relative rate version with transition/tranversion ratio kappa = 0.5, - scaled so that there is one substitution per unit time -rate matrix Q: - A C G T - A * 0.4839 0.2419 0.3226 - C 0.3226 * 0.4839 0.1613 - G 0.1613 0.4839 * 0.3226 - T 0.3226 0.2419 0.4839 * - -julia> nstates(m1) -4 - -julia> m2 = HKY85([0.5, 0.5], [0.20, 0.30, 0.30, 0.20], false) -HKY85 Substitution Model base frequencies: [0.2, 0.3, 0.3, 0.2] -absolute rate version with transition/transversion ratio kappa = a/b = 1.0 - with rates a = 0.5 and b = 0.5 -rate matrix Q: - A C G T - A * 0.1500 0.1500 0.1000 - C 0.1000 * 0.1500 0.1000 - G 0.1000 0.1500 * 0.1000 - T 0.1000 0.1500 0.1500 * - -``` -""" -struct HKY85 <: NucleicAcidSubstitutionModel - rate::Vector{Float64} - pi::Vector{Float64} - relative::Bool - eigeninfo::Vector{Float64} - function HKY85(rate::Vector{Float64}, pi::Vector{Float64}, relative::Bool, eigeninfo::Vector{Float64}) - #Warning: this constructor should not be used directly. Use the constructor below, - # which will call this. - all(rate .> 0.) || error("All elements of rate must be positive") - 1 <= length(rate) <= 2 || error("rate has invalid length for HKY85 model") - if relative length(rate) == 1 || error("the relative version of HKY85 takes a single rate") - else length(rate) == 2 || error("the absolute version of HKY85 takes 2 rates") - end - length(pi) == 4 || error("pi must be of length 4") - all(0. .< pi.< 1.) || error("All base proportions must be between 0 and 1") - isapprox(sum(pi), 1.; atol = 1e-12) || error("Base proportions must sum to 1.") - new(rate, pi, relative, eigeninfo) - end -end -function HKY85(rate::AbstractVector, pi::Vector{Float64}, relative=true::Bool) - obj = HKY85(rate, pi, relative, zeros(5)) - seteigeninfo!(obj) - return obj -end -HKY85(rate::Float64, pi::Vector{Float64}) = HKY85([rate], pi, true) - -""" -for [`HKY85`](@ref): store piR, piY, the 2 non-zero eigenvalues and a scaling factor -""" -function seteigeninfo!(obj::HKY85) - piA = obj.pi[1]; piC = obj.pi[2]; piG = obj.pi[3]; piT = obj.pi[4] - piR = piA + piG - piY = piT + piC - obj.eigeninfo[4] = piR - obj.eigeninfo[5] = piY - - a = obj.rate[1] # relative: a = kappa. absolute: a = kappa*b - if obj.relative - # b=1/lambda: scaling factor to have branch lengths in substitutions/site - b = 1.0 / (2*a*(piT*piC + piA*piG) + 2*(piY*piR)) - obj.eigeninfo[2] = - (piR * a + piY) * b # lambda_R - obj.eigeninfo[3] = - (piY * a + piR) * b # lambda_Y - else - b = obj.rate[2] - obj.eigeninfo[2] = -((piR * a) + (piY * b)) - obj.eigeninfo[3] = -((piY * a) + (piR * b)) - end - obj.eigeninfo[1] = -b -end - -function Base.show(io::IO, obj::HKY85) - str = "HKY85 Substitution Model base frequencies: $(obj.pi)\n" - if obj.relative - str *= "relative rate version with transition/tranversion ratio kappa = $(round(obj.rate[1], digits=5))," - str *= "\n scaled so that there is one substitution per unit time\n" - else - str *= "absolute rate version with transition/transversion ratio kappa = a/b = " - str *= "$(round(obj.rate[1]/obj.rate[2], digits=5))" - str *= "\n with rates a = $(round(obj.rate[1], digits=5)) and b = $(round(obj.rate[2], digits=5))\n" - end - str *= "rate matrix Q:\n" - print(io, str) - showQ(io, obj) -end - -""" -for `JC69` model: 0 if relative, 1 if absolute -""" -function nparams(obj::JC69) - return (obj.relative ? 0 : 1) -end - -""" -for `HKY85` model: 1 if relative, 2 if absolute -""" -function nparams(obj::HKY85) - return (obj.relative ? 1 : 2) -end - -@inline function Q(obj::JC69) - if obj.relative - Q0 = 1.0/3.0 - #we multiply by 1/3 to make branch lengths interpretable as avg(#substitutions) (pi-weighted avg of diagonal is -1) - else - Q0 = (1.0/3.0)*obj.rate[1] - end - - return Qmatrix(-3*Q0, Q0, Q0, Q0, - Q0, -3*Q0, Q0, Q0, - Q0, Q0, -3*Q0, Q0, - Q0, Q0, Q0, -3*Q0) -end - -@inline function Q(obj::HKY85) - piA = obj.pi[1]; piC = obj.pi[2]; piG = obj.pi[3]; piT = obj.pi[4] - piR = piA + piG - piY = piT + piC - if obj.relative - k = obj.rate[1] - lambda = (2*k*(piT*piC + piA*piG) + 2*(piY*piR)) # for sub/time interpretation. see HKY docstring - Q₁ = piA/lambda - Q₂ = k * Q₁ - Q₃ = piC/lambda - Q₄ = k * Q₃ - Q₆ = piG/lambda - Q₅ = k * Q₆ - Q₇ = piT/lambda - Q₈ = k * Q₇ - Q₉ = -(Q₃ + Q₅ + Q₇) - Q₁₀ = -(Q₁ + Q₆ + Q₈) - Q₁₁ = -(Q₂ + Q₃ + Q₇) - Q₁₂ = -(Q₁ + Q₄ + Q₆) - else #GT, AT, CG, and AC are less likely (transversions) - a = obj.rate[1]; b = obj.rate[2] - Q₁ = b * piA - Q₂ = a * piA - Q₃ = b * piC - Q₄ = a * piC - Q₅ = a * piG - Q₆ = b * piG - Q₇ = b * piT - Q₈ = a * piT - Q₉ = -(Q₃ + Q₅ + Q₇) #AA - Q₁₀ = -(Q₁ + Q₆ + Q₈) #CC - Q₁₁ = -(Q₂ + Q₃ + Q₇) #GG - Q₁₂ = -(Q₁ + Q₄ + Q₆) #TT - end - return Qmatrix(Q₉, Q₁, Q₂, Q₁, #ACGT - Q₃, Q₁₀, Q₃, Q₄, - Q₅, Q₆, Q₁₁, Q₆, - Q₇, Q₈, Q₇, Q₁₂) -end - -function P!(Pmat::AbstractMatrix, obj::JC69, t::Float64) - P0 = 0.25 + 0.75 * exp(-t * obj.eigeninfo[1]) #lambda - P1 = 0.25 - 0.25 * exp(-t * obj.eigeninfo[1]) - # P1 off-diagonal and P0 on diagonal - Pmat[1,1] = P0; Pmat[2,1] = P1; Pmat[3,1] = P1; Pmat[4,1] = P1 - Pmat[1,2] = P1; Pmat[2,2] = P0; Pmat[3,2] = P1; Pmat[4,2] = P1 - Pmat[1,3] = P1; Pmat[2,3] = P1; Pmat[3,3] = P0; Pmat[4,3] = P1 - Pmat[1,4] = P1; Pmat[2,4] = P1; Pmat[3,4] = P1; Pmat[4,4] = P0 - return Pmat -end - -function P!(Pmat::AbstractMatrix, obj::HKY85, t::Float64) - #returns ACGT - piA = obj.pi[1]; piC = obj.pi[2]; piG = obj.pi[3]; piT = obj.pi[4] - piR = obj.eigeninfo[4] - piY = obj.eigeninfo[5] - # expm1(x) = e^x-1 accurately. important when t is small - ebm1 = expm1(obj.eigeninfo[1] * t) # -b eigevalue - eRm1 = expm1(obj.eigeninfo[2] * t) # lambda_R - eYm1 = expm1(obj.eigeninfo[3] * t) # lambda_Y - # transversions - P_TA_CA = - piA * ebm1 # C or T -> A: P{A|T} = P{A|C} - P_AC_GC = - piC * ebm1 # P{C|A} = P{C|G} - P_TG_CG = - piG * ebm1 # P{G|T} = P{G|C} - P_AT_GT = - piT * ebm1 # P{T|A} = P{T|G} - # transitions: A<->G (R) or C<->T (Y) - tmp = (ebm1 * piY - eRm1) / piR - P_GA = piA * tmp # P{A|G} - P_AG = piG * tmp # P{G|A} - tmp = (ebm1 * piR - eYm1) / piY - P_TC = piC * tmp # P{C|T} - P_CT = piT * tmp # P{T|C} - # no change - transv = P_AC_GC + P_AT_GT # transversion to Y: - piY * ebm1 - P_AA = 1.0 - P_AG - transv - P_GG = 1.0 - P_GA - transv - transv = P_TA_CA + P_TG_CG # transversion to R - P_CC = 1.0 - P_CT - transv - P_TT = 1.0 - P_TC - transv - # fill in the P matrix - Pmat[1,1] = P_AA - Pmat[2,2] = P_CC - Pmat[3,3] = P_GG - Pmat[4,4] = P_TT - # to A: j=1 - Pmat[2,1] = P_TA_CA - Pmat[3,1] = P_GA - Pmat[4,1] = P_TA_CA - # to C: j=2 - Pmat[1,2] = P_AC_GC - Pmat[3,2] = P_AC_GC - Pmat[4,2] = P_TC - # to G: j=3 - Pmat[1,3] = P_AG - Pmat[2,3] = P_TG_CG - Pmat[4,3] = P_TG_CG - # to T: j=4 - Pmat[1,4] = P_AT_GT - Pmat[2,4] = P_CT - Pmat[3,4] = P_AT_GT - return Pmat -end - -abstract type RateVariationAcrossSites end - -""" - RateVariationAcrossSites(; pinv=0.0, alpha=Inf, ncat=4) - -Model for variable substitution rates across sites (or across traits) using -the discrete Gamma model (+G, Yang 1994, Journal of Molecular Evolution) or -the invariable-sites model (+I, Hasegawa, Kishino & Yano 1985 J Mol Evol). -Both types of rate variation can be combined (+G+I, Gu, Fu & Li 1995, Mol Biol Evol) -but this is discouraged (Jia, Lo & Ho 2014 PLOS One). -Using rate variation increases the number of parameters by one (+G or +I) -or by two (+G+I). - -Because the mean of the desired distribution or rates is 1, we use a Gamma -distribution with shape α and scale θ=1/α (rate β=α) if no invariable sites, -or scale θ=1/(α(1-pinv)), that is rate β=α(1-pinv) with a proportion pinv -of invariable sites. -The shape parameter is referred to as alpha here. -The Gamma distribution is discretized into `ncat` categories. -In each category, the category's rate multiplier is a normalized quantile of the gamma distribution. - -```jldoctest -julia> rv = RateVariationAcrossSites() -Rate variation across sites: discretized Gamma -categories for Gamma discretization: 1 -rates: [1.0] - -julia> nparams(rv) -0 - -julia> typeof(rv) -PhyloNetworks.RVASGamma{1} - -julia> rv = RateVariationAcrossSites(alpha=1.0, ncat=4) -Rate variation across sites: discretized Gamma -alpha: 1.0 -categories for Gamma discretization: 4 -rates: [0.146, 0.513, 1.071, 2.27] - -julia> typeof(rv) -PhyloNetworks.RVASGamma{4} - -julia> PhyloNetworks.setalpha!(rv, 2.0) -Rate variation across sites: discretized Gamma -alpha: 2.0 -categories for Gamma discretization: 4 -rates: [0.319, 0.683, 1.109, 1.889] - -julia> nparams(rv) -1 - -julia> rv = RateVariationAcrossSites(pinv=0.3) -Rate variation across sites: +I (invariable sites) -pinv: 0.3 -rates: [0.0, 1.429] - -julia> nparams(rv) -1 - -julia> typeof(rv) -PhyloNetworks.RVASInv - -julia> PhyloNetworks.setpinv!(rv, 0.05) -Rate variation across sites: +I (invariable sites) -pinv: 0.05 -rates: [0.0, 1.053] - -julia> rv = RateVariationAcrossSites(pinv=0.3, alpha=2.0, ncat=4) -Rate variation across sites: discretized Gamma+I -pinv: 0.3 -alpha: 2.0 -categories for Gamma discretization: 4 -rates: [0.0, 0.456, 0.976, 1.584, 2.698] -probabilities: [0.3, 0.175, 0.175, 0.175, 0.175] - -julia> nparams(rv) -2 - -julia> typeof(rv) -PhyloNetworks.RVASGammaInv{5} - -julia> PhyloNetworks.setalpha!(rv, 3.0) -Rate variation across sites: discretized Gamma+I -pinv: 0.3 -alpha: 3.0 -categories for Gamma discretization: 4 -rates: [0.0, 0.6, 1.077, 1.584, 2.454] -probabilities: [0.3, 0.175, 0.175, 0.175, 0.175] - -julia> PhyloNetworks.setpinv!(rv, 0.05) -Rate variation across sites: discretized Gamma+I -pinv: 0.05 -alpha: 3.0 -categories for Gamma discretization: 4 -rates: [0.0, 0.442, 0.793, 1.167, 1.808] -probabilities: [0.05, 0.238, 0.238, 0.238, 0.238] - -julia> PhyloNetworks.setpinvalpha!(rv, 0.1, 5.0) -Rate variation across sites: discretized Gamma+I -pinv: 0.1 -alpha: 5.0 -categories for Gamma discretization: 4 -rates: [0.0, 0.593, 0.91, 1.221, 1.721] -probabilities: [0.1, 0.225, 0.225, 0.225, 0.225] -``` -""" -function RateVariationAcrossSites(; pinv=0.0::Float64, alpha=Inf64::Float64, ncat=1::Int) - ncat>1 && alpha == Inf && error("please specify ncat=1 or alpha0 here - if ncat == 1 - return RVASInv(pinv) - end - # pinv>0, ncat>1 and α is finite here - return RVASGammaInv(pinv, alpha, ncat) -end -""" - RateVariationAcrossSites(rvsymbol::Symbol, ncategories=4::Int) - -Default model for rate variation across site, specified by a symbol: -- `:noRV` for no rate variation -- `:G` or `:Gamma` for gamma-distributed rates -- `:I` or `:Inv` for two categories: invariable and variable -- `:GI` or `:GI` for both. -""" -function RateVariationAcrossSites(rvsymbol::Symbol, ncategories=4::Int) - if rvsymbol == :noRV - rvas = RateVariationAcrossSites() - elseif rvsymbol == :Gamma || rvsymbol == :G - rvas = RateVariationAcrossSites(alpha=1.0, ncat=ncategories) - elseif rvsymbol == :GammaInv || rvsymbol == :GI - rvas = RateVariationAcrossSites(pinv=0.05, alpha=1.0, ncat=ncategories) - elseif rvsymbol == :Inv || rvsymbol == :I - rvas = RateVariationAcrossSites(pinv=0.05) - else - error("model $rvsymbol unknown or not implemented yet:\nrate variation model needs to be :Gamma or :Inv or :GammaInv") - end -end - -struct RVASGamma{S} <: RateVariationAcrossSites - # S = ncat, and size of vectors - alpha::StaticArrays.MVector{1,Float64} # mutable - ncat::Int - ratemultiplier::StaticArrays.MVector{S,Float64} - lograteweight::StaticArrays.SVector{S,Float64} # will be uniform: log(1/ncat) -end -function RVASGamma(alpha=1.0::Float64, ncat=4::Int) - @assert ncat > 0 "ncat must be 1 or greater" - uniflw = -log(ncat) # = log(1/ncat) - obj = RVASGamma{ncat}( - StaticArrays.MVector{1,Float64}(alpha), ncat, - StaticArrays.MVector{ncat,Float64}(undef), # rates - StaticArrays.SVector{ncat,Float64}([uniflw for i in 1:ncat])) - if ncat == 1 - obj.ratemultiplier[1] = 1.0 - else - setalpha!(obj, alpha) # checks for alpha >= 0 - end - return obj -end - -struct RVASInv <: RateVariationAcrossSites - pinv::StaticArrays.MVector{1,Float64} # mutable - ratemultiplier::StaticArrays.MVector{2,Float64} - lograteweight::StaticArrays.MVector{2,Float64} -end -function RVASInv(pinv=0.05::Float64) - r = StaticArrays.MVector{2,Float64}(undef) # rates - r[1] = 0.0 # invariable category - obj = RVASInv(StaticArrays.MVector{1,Float64}(pinv), - r, - StaticArrays.MVector{2,Float64}(undef)) # log weights - setpinv!(obj, pinv) # checks for 0 <= pinv < 1 - return obj -end - -struct RVASGammaInv{S} <: RateVariationAcrossSites - # S = ncat+1, and size of vectors - pinv::StaticArrays.MVector{1,Float64} # mutable - alpha::StaticArrays.MVector{1,Float64} # mutable - ncat::Int - ratemultiplier::StaticArrays.MVector{S,Float64} - lograteweight::StaticArrays.MVector{S,Float64} -end -function RVASGammaInv(pinv::Float64, alpha::Float64, ncat::Int) - @assert ncat > 1 "ncat must be 2 or more for the Gamma+I model" - s = 1+ncat - r = StaticArrays.MVector{s,Float64}(undef) # rates - r[1] = 0.0 # invariable category - obj = RVASGammaInv{s}( - StaticArrays.MVector{1,Float64}(pinv), - StaticArrays.MVector{1,Float64}(alpha), ncat, - r, - StaticArrays.MVector{s,Float64}(undef)) # log weights - setpinvalpha!(obj, pinv, alpha) # checks for α >= 0 and 0 <= pinv < 1 - return obj -end - -""" - setalpha!(obj, alpha) - -Set the shape parameter `alpha` in a RateVariationAcrossSites model `obj`, -and update the rate multipliers accordingly. -Return the modified object. -""" -function setalpha!(obj::RVASGamma{S}, alpha::Float64) where S - @assert alpha >= 0 "alpha must be >= 0" - obj.alpha[1] = alpha - gammadist = Distributions.Gamma(alpha, 1/alpha) - cumprob = 1/(2obj.ncat) .+ (0:(obj.ncat-1))/obj.ncat # cumulative prob to discretize Gamma - obj.ncat > 1 || return obj - rv = obj.ratemultiplier - for (i,cp) in enumerate(cumprob) - @inbounds rv[i] = quantile(gammadist, cp) - end - rv ./= mean(rv) - return obj -end -function setalpha!(obj::RVASGammaInv{S}, alpha::Float64) where S - @assert alpha >= 0 "alpha must be >= 0" - obj.alpha[1] = alpha - ncat = obj.ncat - pvar = 1.0 - obj.pinv[1] - gammadist = Distributions.Gamma(alpha, 1/alpha) - r0 = quantile.(gammadist, 1/(2ncat) .+ (0:(ncat-1))/ncat) - r0 ./= mean(r0) - for i in 2:(ncat+1) - @inbounds obj.ratemultiplier[i] = r0[i-1]/pvar - end - return obj -end - -""" - setpinv!(obj, pinv) - -Set the proportion of invariable sites `pinv` in a RateVariationAcrossSites -model `obj`, and update the rate multipliers & weights accordingly. -For `RVASInvGamma` objects, the original rate multipliers are assumed correct, -according to the original `pinv` value. -Return the modified object. -""" -function setpinv!(obj::RVASInv, pinv::Float64) - @assert 0.0 <= pinv < 1.0 "pinv must be in [0,1)" - obj.pinv[1] = pinv - pvar = 1.0-pinv # 0 not okay here: ratemultiplier would be infinite - obj.lograteweight[1] = log(pinv) # -Inf is okay - obj.lograteweight[2] = log(pvar) - obj.ratemultiplier[2] = 1.0/pvar # to get an average rate = 1 - return obj -end -function setpinv!(obj::RVASGammaInv{S}, pinv::Float64) where S - @assert 0.0 <= pinv < 1.0 "pinv must be in [0,1)" - ncat = obj.ncat - pvar = 1.0-pinv # 0 not okay here: ratemultiplier would be infinite - pvarratio = (1.0-obj.pinv[1])/pvar # old p_variable / new p_variable - obj.pinv[1] = pinv - obj.lograteweight[1] = log(pinv) # -Inf is okay - uniflw = -log(ncat)+log(pvar) - for i in 2:(ncat+1) - @inbounds obj.lograteweight[i] = uniflw - @inbounds obj.ratemultiplier[i] *= pvarratio # gamma rate / p_variable - end - return obj -end - -""" - setpinvalpha!(obj, pinv, alpha) - -Set the proportion of invariable sites `pinv` and the `alpha` parameter for -the discretized gamma distribution in a model `obj` of type `RVASGammaInv{S}`. -Update the rate multipliers & weights accordingly. -The mean of the distribution is constrained to 1. - -Return the modified object. -""" -function setpinvalpha!(obj::RVASGammaInv{S}, pinv::Float64, alpha::Float64) where S - @assert 0.0 <= pinv < 1.0 "pinv must be in [0,1)" - @assert alpha >= 0 "alpha must be >= 0" - obj.alpha[1] = alpha - obj.pinv[1] = pinv - obj.lograteweight[1] = log(pinv) # -Inf is okay - ncat = obj.ncat - gammadist = Distributions.Gamma(alpha, 1/alpha) - r0 = quantile.(gammadist, 1/(2ncat) .+ (0:(ncat-1))/ncat) - r0 ./= mean(r0) - pvar = 1.0-pinv # 0 not okay here: ratemultiplier would be infinite - uniflw = -log(ncat)+log(pvar) - for i in 2:(ncat+1) - @inbounds obj.lograteweight[i] = uniflw - @inbounds obj.ratemultiplier[i] = r0[i-1]/pvar - end - return obj -end - -function Base.show(io::IO, obj::RVASGamma{S}) where S - str = "Rate variation across sites: discretized Gamma\n" - if length(obj.ratemultiplier)>1 - str *= "alpha: $(round(obj.alpha[1], digits=5))\n" - end - str *= "categories for Gamma discretization: $(obj.ncat)\n" - str *= "rates: $(round.(obj.ratemultiplier, digits=3))" - print(io, str) -end -function Base.show(io::IO, obj::RVASInv) - str = "Rate variation across sites: +I (invariable sites)\n" - str *= "pinv: $(round(obj.pinv[1], digits=5))\n" - str *= "rates: $(round.(obj.ratemultiplier, digits=3))" - print(io, str) -end -function Base.show(io::IO, obj::RVASGammaInv{S}) where S - str = "Rate variation across sites: discretized Gamma+I\n" - str *= "pinv: $(round(obj.pinv[1], digits=5))\n" - str *= "alpha: $(round(obj.alpha[1], digits=5))\n" - str *= "categories for Gamma discretization: $(obj.ncat)\n" - str *= "rates: $(round.(obj.ratemultiplier, digits=3))\n" - str *= "probabilities: $(round.(exp.(obj.lograteweight), digits=3))" - print(io, str) -end - -function nparams(obj::RVASGamma{S}) where S - return (obj.ncat == 1 ? 0 : 1) -end -nparams(::RVASInv) = 1::Int -nparams(::RVASGammaInv{S}) where S = 2::Int # ncat must be >1 - -""" - getparameters(obj::RateVariationAcrossSites) - -Return a copy of the alpha and/or pinv parameters of model `obj`, -in a single vector. -""" -getparameters(obj::RVASInv) = copy(obj.pinv) -getparameters(obj::RVASGamma{S}) where S = copy(obj.alpha) -getparameters(obj::RVASGammaInv{S}) where S = [obj.pinv[1], obj.alpha[1]] - -""" - setparameters!(obj::RateVariationAcrossSites, par::AbstractVector) - -Set the values of the alpha and/or pinv parameters of model `obj`. -See also [`setalpha!`](@ref), [`setpinv!`](@ref) and [`setpinvalpha!`](@ref) -""" -setparameters!(obj::RVASInv, par::AbstractVector) = setpinv!(obj, par[1]) -setparameters!(obj::RVASGamma{S}, par::AbstractVector) where S = - setalpha!(obj, par[1]) -setparameters!(obj::RVASGammaInv{S}, par::AbstractVector) where S = - setpinvalpha!(obj, par[1], par[2]) - -""" - getparamindex(obj::RateVariationAcrossSites) - -Indices of parameters in (p_invariable, alpha). -""" -getparamindex(::RVASInv) = [1] -getparamindex(::RVASGamma{S}) where S = [2] -getparamindex(::RVASGammaInv{S}) where S = [1,2] - -""" - empiricalDNAfrequencies(DNAdata::AbstractDataFrame, DNAweights, - correction=true, useambiguous=true) - -Estimate base frequencies in DNA data `DNAdata`, ordered ACGT. - -- `DNAdata`: data frame. All columns are used. If the first column - gives species names, find a way to ignore it before calculating empirical - frequencies, e.g. `empiricalDNAfrequencies(view(DNAdata, :, 2:size(DNAdata, 2)))`. - Data type must be `BioSymbols.DNA` or `Char` or `String`. - WARNING: this is checked on the first column only. -- `DNAweights`: vector of weights, to weigh each column in `DNAdata`. -- `correction`: if `true`, add 1 to each count and 4 to the denominator - for a more stable estimator, similar to Bayes prior of 1/4 and - the Agresti-Coull interval in binomial estimation. -- `useambiguous`: if `true`, ambiguous bases are used (except gaps and Ns). - For example, `Y` adds 0.5 weight to `C` and 0.5 weight to `T`. -""" -function empiricalDNAfrequencies(dnaDat::AbstractDataFrame, dnaWeights::Vector, - correctedestimate=true::Bool, useambiguous=true::Bool) - - # warning: checking first column and first row only - dnadat1type = eltype(dnaDat[!,1]) - dnadat1type == BioSymbols.DNA || dnadat1type == Char || - dnaDat[1,1] ∈ string.(BioSymbols.alphabet(DNA)) || - error("empiricalDNAfrequencies requires data of type String, Char, or BioSymbols.DNA") - - # initialize counts: keys same as BioSymbols.ACGT (which are ordered) - prior = correctedestimate ? 1.0 : 0.0 - dnacounts = Dict(DNA_A=>prior, DNA_C=>prior, DNA_G=>prior, DNA_T=>prior) - - convert2dna = dnadat1type != BioSymbols.DNA - for j in 1:size(dnaDat, 2) # for each column - col = dnaDat[!,j] - wt = dnaWeights[j] - for nuc in col # for each row - if convert2dna - nuc = convert(DNA, nuc[1]) # if nuc is a string, nuc[1] = 1st character - end - if nuc ∈ BioSymbols.ACGT - dnacounts[nuc] += wt - elseif nuc == DNA_Gap || nuc == DNA_N || !useambiguous - continue # to next row - # else: ambiguity, uses BioSequences definitions - elseif nuc == DNA_M # A or C - dnacounts[DNA_A] += 0.5*wt - dnacounts[DNA_C] += 0.5*wt - elseif nuc == DNA_R # A or G - dnacounts[DNA_A] += 0.5*wt - dnacounts[DNA_G] += 0.5*wt - elseif nuc == DNA_W # A or T/U - dnacounts[DNA_A] += 0.5*wt - dnacounts[DNA_T] += 0.5*wt - elseif nuc == DNA_S # C or G - dnacounts[DNA_C] += 0.5*wt - dnacounts[DNA_G] += 0.5*wt - elseif nuc == DNA_Y # C or T/U - dnacounts[DNA_C] += 0.5*wt - dnacounts[DNA_T] += 0.5*wt - elseif nuc == DNA_K # G or T/U - dnacounts[DNA_G] += 0.5*wt - dnacounts[DNA_T] += 0.5*wt - elseif nuc == DNA_V # A or C or G - dnacounts[DNA_A] += wt/3 - dnacounts[DNA_C] += wt/3 - dnacounts[DNA_G] += wt/3 - elseif nuc == DNA_H # A or C or T - dnacounts[DNA_A] += wt/3 - dnacounts[DNA_C] += wt/3 - dnacounts[DNA_T] += wt/3 - elseif nuc == DNA_D # A or G or T/U - dnacounts[DNA_A] += wt/3 - dnacounts[DNA_G] += wt/3 - dnacounts[DNA_T] += wt/3 - elseif nuc == DNA_B # C or G or T/U - dnacounts[DNA_C] += wt/3 - dnacounts[DNA_G] += wt/3 - dnacounts[DNA_T] += wt/3 - end - end - end - totalweight = sum(values(dnacounts)) - res = [dnacounts[key]/totalweight for key in BioSymbols.ACGT] # to control the order - all(0. .<= res .<= 1.) || error("""weird: empirical base frequency < 0 or > 1""") - return res -end - -""" - stationary(substitutionmodel) - -Stationary distribution of a Markov model -""" -stationary(mod::SM) = error("stationary not defined for $(typeof(mod)).") - -function stationary(mod::JC69) #for JC, stationary = uniform - return [0.25,0.25,0.25,0.25] -end - -function stationary(mod::HKY85) - return mod.pi -end - -function stationary(mod::ERSM) #for ERSM, uniform = stationary - return [1/mod.k for i in 1:mod.k] -end - -function stationary(mod::BTSM) - return [mod.eigeninfo[2], mod.eigeninfo[3]] -end diff --git a/src/traits.jl b/src/traits.jl deleted file mode 100644 index beb1373b5..000000000 --- a/src/traits.jl +++ /dev/null @@ -1,3661 +0,0 @@ -# Continuous trait evolution on network - -# default tolerances to optimize parameters in continuous trait evolution models -# like lambda, sigma2_withinspecies / sigma2_BM, etc. -const fAbsTr = 1e-10 -const fRelTr = 1e-10 -const xAbsTr = 1e-10 -const xRelTr = 1e-10 - -""" - MatrixTopologicalOrder - -Matrix associated to an [`HybridNetwork`](@ref) in which rows/columns -correspond to nodes in the network, sorted in topological order. - -The following functions and extractors can be applied to it: [`tipLabels`](@ref), `obj[:Tips]`, `obj[:InternalNodes]`, `obj[:TipsNodes]` (see documentation for function [`getindex(::MatrixTopologicalOrder, ::Symbol)`](@ref)). - -Functions [`sharedPathMatrix`](@ref) and [`simulate`](@ref) return objects of this type. - -The `MatrixTopologicalOrder` object has fields: `V`, `nodeNumbersTopOrder`, `internalNodeNumbers`, `tipNumbers`, `tipNames`, `indexation`. -Type in "?MatrixTopologicalOrder.field" to get documentation on a specific field. -""" -struct MatrixTopologicalOrder - "V: the matrix per se" - V::Matrix # Matrix in itself - "nodeNumbersTopOrder: vector of nodes numbers in the topological order, used for the matrix" - nodeNumbersTopOrder::Vector{Int} # Vector of nodes numbers for ordering of the matrix - "internalNodeNumbers: vector of internal nodes number, in the original net order" - internalNodeNumbers::Vector{Int} # Internal nodes numbers (original net order) - "tipNumbers: vector of tips numbers, in the origial net order" - tipNumbers::Vector{Int} # Tips numbers (original net order) - "tipNames: vector of tips names, in the original net order" - tipNames::Vector # Tips Names (original net order) - """ - indexation: a string giving the type of matrix `V`: - -"r": rows only are indexed by the nodes of the network - -"c": columns only are indexed by the nodes of the network - -"b": both rows and columns are indexed by the nodes of the network - """ - indexation::AbstractString # Are rows ("r"), columns ("c") or both ("b") indexed by nodes numbers in the matrix ? -end - -function Base.show(io::IO, obj::MatrixTopologicalOrder) - println(io, "$(typeof(obj)):\n$(obj.V)") -end - -# docstring already in descriptive.jl -function tipLabels(obj::MatrixTopologicalOrder) - return obj.tipNames -end - -# This function takes an init and update funtions as arguments -# It does the recursion using these functions on a preordered network. -function recursionPreOrder(net::HybridNetwork, - checkPreorder=true::Bool, - init=identity::Function, - updateRoot=identity::Function, - updateTree=identity::Function, - updateHybrid=identity::Function, - indexation="b"::AbstractString, - params...) - net.isRooted || error("net needs to be rooted for a pre-oreder recursion") - if(checkPreorder) - preorder!(net) - end - M = recursionPreOrder(net.nodes_changed, init, updateRoot, updateTree, updateHybrid, params) - # Find numbers of internal nodes - nNodes = [n.number for n in net.node] - nleaf = [n.number for n in net.leaf] - deleteat!(nNodes, indexin(nleaf, nNodes)) - MatrixTopologicalOrder(M, [n.number for n in net.nodes_changed], nNodes, nleaf, [n.name for n in net.leaf], indexation) -end - -""" - recursionPreOrder(nodes, init_function, root_function, tree_node_function, - hybrid_node_function, parameters) - recursionPreOrder!(nodes, AbstractArray, root_function, tree_node_function, - hybrid_node_function, parameters) - updatePreOrder(index, nodes, updated_matrix, root_function, tree_node_function, - hybrid_node_function, parameters) - -Generic tool to apply a pre-order (or topological ordering) algorithm. -Used by `sharedPathMatrix` and by `pairwiseTaxonDistanceMatrix`. -""" -function recursionPreOrder(nodes::Vector{Node}, - init::Function, - updateRoot::Function, - updateTree::Function, - updateHybrid::Function, - params) - M = init(nodes, params) - recursionPreOrder!(nodes, M, updateRoot, updateTree, updateHybrid, params) -end -@doc (@doc recursionPreOrder) recursionPreOrder! -function recursionPreOrder!(nodes::Vector{Node}, - M::AbstractArray, - updateRoot::Function, - updateTree::Function, - updateHybrid::Function, - params) - for i in 1:length(nodes) #sorted list of nodes - updatePreOrder!(i, nodes, M, updateRoot, updateTree, updateHybrid, params) - end - return M -end - -@doc (@doc recursionPreOrder) updatePreOrder! -function updatePreOrder!(i::Int, - nodes::Vector{Node}, - V::AbstractArray, updateRoot::Function, - updateTree::Function, - updateHybrid::Function, - params) - parent = getparents(nodes[i]) # vector of nodes (empty, size 1 or 2) - if(isempty(parent)) #nodes[i] is root - updateRoot(V, i, params) - elseif(length(parent) == 1) #nodes[i] is tree - parentIndex = getIndex(parent[1],nodes) - edge = getConnectingEdge(nodes[i],parent[1]) - updateTree(V, i, parentIndex, edge, params) - elseif(length(parent) == 2) #nodes[i] is hybrid - parentIndex1 = getIndex(parent[1],nodes) - parentIndex2 = getIndex(parent[2],nodes) - edge1 = getConnectingEdge(nodes[i],parent[1]) - edge2 = getConnectingEdge(nodes[i],parent[2]) - edge1.hybrid || error("connecting edge between node $(nodes[i].number) and $(parent[1].number) should be a hybrid egde") - edge2.hybrid || error("connecting edge between node $(nodes[i].number) and $(parent[2].number) should be a hybrid egde") - updateHybrid(V, i, parentIndex1, parentIndex2, edge1, edge2, params) - end -end - -## Same, but in post order (tips to root). see docstring below -function recursionPostOrder(net::HybridNetwork, - checkPreorder=true::Bool, - init=identity::Function, - updateTip=identity::Function, - updateNode=identity::Function, - indexation="b"::AbstractString, - params...) - net.isRooted || error("net needs to be rooted for a post-order recursion") - if(checkPreorder) - preorder!(net) - end - M = recursionPostOrder(net.nodes_changed, init, updateTip, updateNode, params) - # Find numbers of internal nodes - nNodes = [n.number for n in net.node] - nleaf = [n.number for n in net.leaf] - deleteat!(nNodes, indexin(nleaf, nNodes)) - MatrixTopologicalOrder(M, [n.number for n in net.nodes_changed], nNodes, nleaf, [n.name for n in net.leaf], indexation) -end - -""" - recursionPostOrder(net::HybridNetwork, checkPreorder::Bool, - init_function, tip_function, node_function, - indexation="b", parameters...) - recursionPostOrder(nodes, init_function, tip_function, node_function, - parameters) - updatePostOrder!(index, nodes, updated_matrix, tip_function, node_function, - parameters) - -Generic tool to apply a post-order (or topological ordering) algorithm, -acting on a matrix where rows & columns correspond to nodes. -Used by `descendenceMatrix`. -""" -function recursionPostOrder(nodes::Vector{Node}, - init::Function, - updateTip::Function, - updateNode::Function, - params) - n = length(nodes) - M = init(nodes, params) - for i in n:-1:1 #sorted list of nodes - updatePostOrder!(i, nodes, M, updateTip, updateNode, params) - end - return M -end -@doc (@doc recursionPostOrder) updatePostOrder! -function updatePostOrder!(i::Int, - nodes::Vector{Node}, - V::Matrix, - updateTip::Function, - updateNode::Function, - params) - children = getchildren(nodes[i]) # vector of nodes (empty, size 1 or 2) - if(isempty(children)) #nodes[i] is a tip - updateTip(V, i, params) - else - childrenIndex = [getIndex(n, nodes) for n in children] - edges = [getConnectingEdge(nodes[i], c) for c in children] - updateNode(V, i, childrenIndex, edges, params) - end -end - -# Extract the right part of a matrix in topological order -# !! Extract sub-matrices in the original net nodes numbers !! -""" - getindex(obj, d,[ indTips, nonmissing]) - -Getting submatrices of an object of type [`MatrixTopologicalOrder`](@ref). - -# Arguments -* `obj::MatrixTopologicalOrder`: the matrix from which to extract. -* `d::Symbol`: a symbol precising which sub-matrix to extract. Can be: - * `:Tips` columns and/or rows corresponding to the tips - * `:InternalNodes` columns and/or rows corresponding to the internal nodes - Includes tips not listed in `indTips` or missing data according to `nonmissing`. - * `:TipsNodes` columns corresponding to internal nodes, and row to tips (works only is indexation="b") -* `indTips::Vector{Int}`: optional argument precising a specific order for the tips (internal use). -* `nonmissing::BitArray{1}`: optional argument saying which tips have data (internal use). - Tips with missing data are treated as internal nodes. -""" -function Base.getindex(obj::MatrixTopologicalOrder, - d::Symbol, - indTips=collect(1:length(obj.tipNumbers))::Vector{Int}, - nonmissing=trues(length(obj.tipNumbers))::BitArray{1}) - tipnums = obj.tipNumbers[indTips][nonmissing] - maskTips = indexin(tipnums, obj.nodeNumbersTopOrder) - if d == :Tips # Extract rows and/or columns corresponding to the tips with data - obj.indexation == "b" && return obj.V[maskTips, maskTips] # both columns and rows are indexed by nodes - obj.indexation == "c" && return obj.V[:, maskTips] # Only the columns - obj.indexation == "r" && return obj.V[maskTips, :] # Only the rows - end - intnodenums = [obj.internalNodeNumbers ; setdiff(obj.tipNumbers, tipnums)] - maskNodes = indexin(intnodenums, obj.nodeNumbersTopOrder) - #= indices in obj.nodeNumbersTopOrder, in this order: - 1. internal nodes, in the same order as in obj.internalNodeNumbers, - that is, same order as in net.node (excluding leaves) - 2. tips absent from indTips or missing data according to nonmissing, - in the same order as in obj.tipNumbers. - =# - if d == :InternalNodes # Idem, for internal nodes - obj.indexation == "b" && return obj.V[maskNodes, maskNodes] - obj.indexation == "c" && return obj.V[:, maskNodes] - obj.indexation == "r" && return obj.V[maskNodes, :] - end - if d == :TipsNodes - obj.indexation == "b" && return obj.V[maskTips, maskNodes] - obj.indexation == "c" && error("""Both rows and columns must be net - ordered to take the submatrix tips vs internal nodes.""") - obj.indexation == "r" && error("""Both rows and columns must be net - ordered to take the submatrix tips vs internal nodes.""") - end - d == :All && return obj.V -end - -############################################################################### -## phylogenetic variance-covariance between tips -############################################################################### -""" - vcv(net::HybridNetwork; model="BM"::AbstractString, - corr=false::Bool, - checkPreorder=true::Bool) - -This function computes the variance covariance matrix between the tips of the -network, assuming a Brownian model of trait evolution (with unit variance). -If optional argument `corr` is set to `true`, then the correlation matrix is returned instead. - -The function returns a `DataFrame` object, with columns named by the tips of the network. - -The calculation of the covariance matrix requires a pre-ordering of nodes to be fast. -If `checkPreorder` is true (default), then [`preorder!`](@ref) is run on the network beforehand. -Otherwise, the network is assumed to be already in pre-order. - -This function internally calls [`sharedPathMatrix`](@ref), which computes the variance -matrix between all the nodes of the network. - -# Examples -```jldoctest -julia> tree_str = "(((t2:0.14,t4:0.33):0.59,t3:0.96):0.14,(t5:0.70,t1:0.18):0.90);"; - -julia> tree = readTopology(tree_str); - -julia> C = vcv(tree) -5×5 DataFrame - Row │ t2 t4 t3 t5 t1 - │ Float64 Float64 Float64 Float64 Float64 -─────┼───────────────────────────────────────────── - 1 │ 0.87 0.73 0.14 0.0 0.0 - 2 │ 0.73 1.06 0.14 0.0 0.0 - 3 │ 0.14 0.14 1.1 0.0 0.0 - 4 │ 0.0 0.0 0.0 1.6 0.9 - 5 │ 0.0 0.0 0.0 0.9 1.08 - -``` -The following block needs `ape` to be installed (not run): -```julia -julia> using RCall # Comparison with ape vcv function - -julia> R"ape::vcv(ape::read.tree(text = \$tree_str))" -RCall.RObject{RCall.RealSxp} - t2 t4 t3 t5 t1 -t2 0.87 0.73 0.14 0.0 0.00 -t4 0.73 1.06 0.14 0.0 0.00 -t3 0.14 0.14 1.10 0.0 0.00 -t5 0.00 0.00 0.00 1.6 0.90 -t1 0.00 0.00 0.00 0.9 1.08 - -``` - -The covariance can also be calculated on a network -(for the model, see Bastide et al. 2018) -```jldoctest -julia> net = readTopology("((t1:1.0,#H1:0.1::0.30):0.5,((t2:0.9)#H1:0.2::0.70,t3:1.1):0.4);"); - -julia> C = vcv(net) -3×3 DataFrame - Row │ t1 t2 t3 - │ Float64 Float64 Float64 -─────┼─────────────────────────── - 1 │ 1.5 0.15 0.0 - 2 │ 0.15 1.248 0.28 - 3 │ 0.0 0.28 1.5 -``` -""" -function vcv(net::HybridNetwork; - model="BM"::AbstractString, - corr=false::Bool, - checkPreorder=true::Bool) - @assert (model == "BM") "The 'vcv' function only works for a BM process (for now)." - V = sharedPathMatrix(net; checkPreorder=checkPreorder) - C = V[:Tips] - corr && StatsBase.cov2cor!(C, sqrt.(diag(C))) - Cd = DataFrame(C, map(Symbol, V.tipNames)) - return(Cd) -end - - -""" - sharedPathMatrix(net::HybridNetwork; checkPreorder=true::Bool) - -This function computes the shared path matrix between all the nodes of a -network. It assumes that the network is in the pre-order. If checkPreorder is -true (default), then it runs function `preorder!` on the network beforehand. - -Returns an object of type [`MatrixTopologicalOrder`](@ref). - -""" -function sharedPathMatrix(net::HybridNetwork; - checkPreorder=true::Bool) - check_nonmissing_nonnegative_edgelengths(net, - """The variance-covariance matrix of the network is not defined. - A phylogenetic regression cannot be done.""") - recursionPreOrder(net, - checkPreorder, - initsharedPathMatrix, - updateRootSharedPathMatrix!, - updateTreeSharedPathMatrix!, - updateHybridSharedPathMatrix!, - "b") -end - -function updateRootSharedPathMatrix!(V::AbstractArray, i::Int, params) - return -end - - -function updateTreeSharedPathMatrix!(V::Matrix, - i::Int, - parentIndex::Int, - edge::Edge, - params) - for j in 1:(i-1) - V[i,j] = V[j,parentIndex] - V[j,i] = V[j,parentIndex] - end - V[i,i] = V[parentIndex,parentIndex] + edge.length -end - -function updateHybridSharedPathMatrix!(V::Matrix, - i::Int, - parentIndex1::Int, - parentIndex2::Int, - edge1::Edge, - edge2::Edge, - params) - for j in 1:(i-1) - V[i,j] = V[j,parentIndex1]*edge1.gamma + V[j,parentIndex2]*edge2.gamma - V[j,i] = V[i,j] - end - V[i,i] = edge1.gamma*edge1.gamma*(V[parentIndex1,parentIndex1] + edge1.length) + edge2.gamma*edge2.gamma*(V[parentIndex2,parentIndex2] + edge2.length) + 2*edge1.gamma*edge2.gamma*V[parentIndex1,parentIndex2] -end - -function initsharedPathMatrix(nodes::Vector{Node}, params) - n = length(nodes) - return(zeros(Float64,n,n)) -end - -""" - check_nonmissing_nonnegative_edgelengths(net, str="") - -Throw an Exception if `net` has undefined edge lengths (coded as -1.0) or -negative edge lengths. The error message indicates the number of the offending -edge(s), followed by `str`. -""" -function check_nonmissing_nonnegative_edgelengths(net::HybridNetwork, str="") - if any(e.length == -1.0 for e in net.edge) - undefined = [e.number for e in net.edge if e.length == -1.0] - error(string("Branch(es) number ", join(undefined,","), " have no length.\n", str)) - end - if any(e.length < 0 for e in net.edge) - negatives = [e.number for e in net.edge if e.length < 0.0] - error(string("Branch(es) number ", join(negatives,","), " have negative length.\n", str)) - end -end - -############################################################################### -""" - descendenceMatrix(net::HybridNetwork; checkPreorder=true::Bool) - -Descendence matrix between all the nodes of a network: -object `D` of type [`MatrixTopologicalOrder`](@ref) in which -`D[i,j]` is the proportion of genetic material in node `i` that can be traced -back to node `j`. If `D[i,j]>0` then `j` is a descendent of `i` (and `j` is -an ancestor of `i`). -The network is assumed to be pre-ordered if `checkPreorder` is false. -If `checkPreorder` is true (default), `preorder!` is run on the network beforehand. -""" -function descendenceMatrix(net::HybridNetwork; - checkPreorder=true::Bool) - recursionPostOrder(net, - checkPreorder, - initDescendenceMatrix, - updateTipDescendenceMatrix!, - updateNodeDescendenceMatrix!, - "r") -end - -function updateTipDescendenceMatrix!(::Matrix, ::Int, params) - return -end - -function updateNodeDescendenceMatrix!(V::Matrix, - i::Int, - childrenIndex::Vector{Int}, - edges::Vector{Edge}, - params) - for j in 1:length(edges) - V[:,i] .+= edges[j].gamma .* V[:,childrenIndex[j]] - end -end - -function initDescendenceMatrix(nodes::Vector{Node}, params) - n = length(nodes) - return(Matrix{Float64}(I, n, n)) # identity matrix -end - -############################################################################### -""" - regressorShift(node::Vector{Node}, net::HybridNetwork; checkPreorder=true) - regressorShift(edge::Vector{Edge}, net::HybridNetwork; checkPreorder=true) - -Compute the regressor vectors associated with shifts on edges that are above nodes -`node`, or on edges `edge`, on a network `net`. It uses function [`descendenceMatrix`](@ref), so -`net` might be modified to sort it in a pre-order. -Return a `DataFrame` with as many rows as there are tips in net, and a column for -each shift, each labelled according to the pattern shift_{number_of_edge}. It has -an aditional column labelled `tipNames` to allow easy fitting afterward (see example). - -# Examples -```jldoctest -julia> net = readTopology("(A:2.5,((B:1,#H1:0.5::0.4):1,(C:1,(D:0.5)#H1:0.5::0.6):1):0.5);"); - -julia> preorder!(net) - -julia> using PhyloPlots - -julia> plot(net, shownodenumber=true); # to locate nodes - -julia> nodes_shifts = indexin([1,-5], [n.number for n in net.node]) # Put a shift on edges ending at nodes 1 and -5 -2-element Vector{Union{Nothing, Int64}}: - 1 - 7 - -julia> params = ParamsBM(10, 0.1, ShiftNet(net.node[nodes_shifts], [3.0, -3.0], net)) -ParamsBM: -Parameters of a BM with fixed root: -mu: 10 -Sigma2: 0.1 - -There are 2 shifts on the network: -────────────────────────── - Edge Number Shift Value -────────────────────────── - 8.0 -3.0 - 1.0 3.0 -────────────────────────── - -julia> using Random; Random.seed!(2468); # sets the seed for reproducibility - -julia> sim = simulate(net, params); # simulate a dataset with shifts - -julia> using DataFrames # to handle data frames - -julia> dat = DataFrame(trait = sim[:Tips], tipNames = sim.M.tipNames); - -julia> dat = DataFrame(trait = [13.391976856737717, 9.55741491696386, 7.17703734817448, 7.889062527849697], - tipNames = ["A","B","C","D"]) # hard-coded, to be independent of random number generator -4×2 DataFrame - Row │ trait tipNames - │ Float64 String -─────┼──────────────────── - 1 │ 13.392 A - 2 │ 9.55741 B - 3 │ 7.17704 C - 4 │ 7.88906 D - -julia> dfr_shift = regressorShift(net.node[nodes_shifts], net) # the regressors matching the shifts. -4×3 DataFrame - Row │ shift_1 shift_8 tipNames - │ Float64 Float64 String -─────┼──────────────────────────── - 1 │ 1.0 0.0 A - 2 │ 0.0 0.0 B - 3 │ 0.0 1.0 C - 4 │ 0.0 0.6 D - -julia> dfr = innerjoin(dat, dfr_shift, on=:tipNames); # join data and regressors in a single dataframe - -julia> using StatsModels # for statistical model formulas - -julia> fitBM = phylolm(@formula(trait ~ shift_1 + shift_8), dfr, net; reml=false) # actual fit -PhyloNetworkLinearModel - -Formula: trait ~ 1 + shift_1 + shift_8 - -Model: Brownian motion - -Parameter Estimates, using ML: -phylogenetic variance rate: 0.0112618 - -Coefficients: -──────────────────────────────────────────────────────────────────────── - Coef. Std. Error t Pr(>|t|) Lower 95% Upper 95% -──────────────────────────────────────────────────────────────────────── -(Intercept) 9.48238 0.327089 28.99 0.0220 5.32632 13.6384 -shift_1 3.9096 0.46862 8.34 0.0759 -2.04479 9.86399 -shift_8 -2.4179 0.422825 -5.72 0.1102 -7.7904 2.95461 -──────────────────────────────────────────────────────────────────────── -Log Likelihood: 1.8937302027 -AIC: 4.2125395947 - -``` - -# See also -[`phylolm`](@ref), [`descendenceMatrix`](@ref), [`regressorHybrid`](@ref). -""" -function regressorShift(node::Vector{Node}, - net::HybridNetwork; checkPreorder=true::Bool) - T = descendenceMatrix(net; checkPreorder=checkPreorder) - regressorShift(node, net, T) -end - -function regressorShift(node::Vector{Node}, - net::HybridNetwork, - T::MatrixTopologicalOrder) - ## Get the descendence matrix for tips - T_t = T[:Tips] - ## Get the indices of the columns to keep - ind = zeros(Int, length(node)) - for i in 1:length(node) - !node[i].hybrid || error("Shifts on hybrid edges are not allowed") - ind[i] = getIndex(node[i], net.nodes_changed) - end - ## get column names - eNum = [getMajorParentEdgeNumber(n) for n in net.nodes_changed[ind]] - function tmp_fun(x::Int) - return(Symbol("shift_$(x)")) - end - df = DataFrame(T_t[:, ind], [tmp_fun(num) for num in eNum]) - df[!,:tipNames]=T.tipNames - return(df) -end - -function regressorShift(edge::Vector{Edge}, - net::HybridNetwork; checkPreorder=true::Bool) - childs = [getchild(ee) for ee in edge] - return(regressorShift(childs, net; checkPreorder=checkPreorder)) -end - -regressorShift(edge::Edge, net::HybridNetwork; checkPreorder=true::Bool) = regressorShift([edge], net; checkPreorder=checkPreorder) -regressorShift(node::Node, net::HybridNetwork; checkPreorder=true::Bool) = regressorShift([node], net; checkPreorder=checkPreorder) - -""" - regressorHybrid(net::HybridNetwork; checkPreorder=true::Bool) - -Compute the regressor vectors associated with shifts on edges that imediatly below -all hybrid nodes of `net`. It uses function [`descendenceMatrix`](@ref) through -a call to [`regressorShift`](@ref), so `net` might be modified to sort it in a pre-order. -Return a `DataFrame` with as many rows as there are tips in net, and a column for -each hybrid, each labelled according to the pattern shift_{number_of_edge}. It has -an aditional column labelled `tipNames` to allow easy fitting afterward (see example). - -This function can be used to test for heterosis. - -# Examples -```jldoctest -julia> using DataFrames # Needed to handle data frames. - -julia> net = readTopology("(A:2.5,((B:1,#H1:0.5::0.4):1,(C:1,(D:0.5)#H1:0.5::0.6):1):0.5);"); - -julia> preorder!(net) - -julia> using PhyloPlots - -julia> plot(net, shownodenumber=true); # to locate nodes: node 5 is child of hybrid node - -julia> nodes_hybrids = indexin([5], [n.number for n in net.node]) # Put a shift on edges below hybrids -1-element Vector{Union{Nothing, Int64}}: - 5 - -julia> params = ParamsBM(10, 0.1, ShiftNet(net.node[nodes_hybrids], [3.0], net)) -ParamsBM: -Parameters of a BM with fixed root: -mu: 10 -Sigma2: 0.1 - -There are 1 shifts on the network: -────────────────────────── - Edge Number Shift Value -────────────────────────── - 6.0 3.0 -────────────────────────── - - -julia> using Random; Random.seed!(2468); # sets the seed for reproducibility - -julia> sim = simulate(net, params); # simulate a dataset with shifts - -julia> dat = DataFrame(trait = sim[:Tips], tipNames = sim.M.tipNames); - -julia> dat = DataFrame(trait = [10.391976856737717, 9.55741491696386, 10.17703734817448, 12.689062527849698], - tipNames = ["A","B","C","D"]) # hard-code values for more reproducibility -4×2 DataFrame - Row │ trait tipNames - │ Float64 String -─────┼──────────────────── - 1 │ 10.392 A - 2 │ 9.55741 B - 3 │ 10.177 C - 4 │ 12.6891 D - -julia> dfr_hybrid = regressorHybrid(net) # the regressors matching the hybrids. -4×3 DataFrame - Row │ shift_6 tipNames sum - │ Float64 String Float64 -─────┼──────────────────────────── - 1 │ 0.0 A 0.0 - 2 │ 0.0 B 0.0 - 3 │ 0.0 C 0.0 - 4 │ 1.0 D 1.0 - -julia> dfr = innerjoin(dat, dfr_hybrid, on=:tipNames); # join data and regressors in a single dataframe - -julia> using StatsModels - -julia> fitBM = phylolm(@formula(trait ~ shift_6), dfr, net; reml=false) # actual fit -PhyloNetworkLinearModel - -Formula: trait ~ 1 + shift_6 - -Model: Brownian motion - -Parameter Estimates, using ML: -phylogenetic variance rate: 0.041206 - -Coefficients: -──────────────────────────────────────────────────────────────────────── - Coef. Std. Error t Pr(>|t|) Lower 95% Upper 95% -──────────────────────────────────────────────────────────────────────── -(Intercept) 10.064 0.277959 36.21 0.0008 8.86805 11.26 -shift_6 2.72526 0.315456 8.64 0.0131 1.36796 4.08256 -──────────────────────────────────────────────────────────────────────── -Log Likelihood: -0.7006021946 -AIC: 7.4012043891 - -``` - -# See also -[`phylolm`](@ref), [`descendenceMatrix`](@ref), [`regressorShift`](@ref). -""" -function regressorHybrid(net::HybridNetwork; checkPreorder=true::Bool) - childs = [getchild(nn) for nn in net.hybrid] # checks that each hybrid node has a single child - dfr = regressorShift(childs, net; checkPreorder=checkPreorder) - dfr[!,:sum] = sum.(eachrow(select(dfr, Not(:tipNames), copycols=false))) - return(dfr) -end - -# Type for shifts -""" - ShiftNet - -Shifts associated to a [`HybridNetwork`](@ref) sorted in topological order. -Its `shift` field is a vector of shift values, one for each node, -corresponding to the shift on the parent edge of the node -(which makes sense for tree nodes only: they have a single parent edge). - -Two `ShiftNet` objects on the same network can be concatened with `*`. - -`ShiftNet(node::Vector{Node}, value::AbstractVector, net::HybridNetwork; checkPreorder=true::Bool)` - -Constructor from a vector of nodes and associated values. The shifts are located -on the edges above the nodes provided. Warning, shifts on hybrid edges are not -allowed. - -`ShiftNet(edge::Vector{Edge}, value::AbstractVector, net::HybridNetwork; checkPreorder=true::Bool)` - -Constructor from a vector of edges and associated values. -Warning, shifts on hybrid edges are not allowed. - -Extractors: [`getShiftEdgeNumber`](@ref), [`getShiftValue`](@ref) -""" -struct ShiftNet - shift::Matrix{Float64} - net::HybridNetwork -end - -# Default -ShiftNet(net::HybridNetwork, dim::Int) = ShiftNet(zeros(length(net.node), dim), net) -ShiftNet(net::HybridNetwork) = ShiftNet(net, 1) - -function ShiftNet(node::Vector{Node}, value::AbstractMatrix, - net::HybridNetwork; checkPreorder=true::Bool) - - n_nodes, dim = size(value) - if length(node) != n_nodes - error("The vector of nodes/edges and of values must have the same number or rows.") - end - if checkPreorder - preorder!(net) - end - obj = ShiftNet(net, dim) - for i in 1:length(node) - !node[i].hybrid || error("Shifts on hybrid edges are not allowed") - ind = findfirst(x -> x===node[i], net.nodes_changed) - obj.shift[ind, :] .= @view value[i, :] - end - return(obj) -end - -function ShiftNet(node::Vector{Node}, value::AbstractVector, - net::HybridNetwork; checkPreorder=true::Bool) - return ShiftNet(node, reshape(value, (length(value), 1)), net, - checkPreorder = checkPreorder) -end - -# Construct from edges and values -function ShiftNet(edge::Vector{Edge}, - value::Union{AbstractVector, AbstractMatrix}, - net::HybridNetwork; checkPreorder=true::Bool) - childs = [getchild(ee) for ee in edge] - return(ShiftNet(childs, value, net; checkPreorder=checkPreorder)) -end - -ShiftNet(edge::Edge, value::Float64, net::HybridNetwork; checkPreorder=true::Bool) = ShiftNet([edge], [value], net; checkPreorder=checkPreorder) -ShiftNet(node::Node, value::Float64, net::HybridNetwork; checkPreorder=true::Bool) = ShiftNet([node], [value], net; checkPreorder=checkPreorder) - -function ShiftNet(edge::Edge, value::AbstractVector{Float64}, - net::HybridNetwork; checkPreorder=true::Bool) - return ShiftNet([edge], reshape(value, (1, length(value))), net, - checkPreorder = checkPreorder) -end - -function ShiftNet(node::Node, value::AbstractVector{Float64}, - net::HybridNetwork; checkPreorder=true::Bool) - return ShiftNet([node], reshape(value, (1, length(value))), net, - checkPreorder = checkPreorder) -end - - -""" - shiftHybrid(value::Vector{T} where T<:Real, net::HybridNetwork; checkPreorder=true::Bool) - -Construct an object [`ShiftNet`](@ref) with shifts on all the edges below -hybrid nodes, with values provided. The vector of values must have the -same length as the number of hybrids in the network. - -""" -function shiftHybrid(value::Union{Matrix{T}, Vector{T}} where T<:Real, - net::HybridNetwork; checkPreorder=true::Bool) - if length(net.hybrid) != size(value, 1) - error("You must provide as many values as the number of hybrid nodes.") - end - childs = [getchild(nn) for nn in net.hybrid] # checks for single child - return(ShiftNet(childs, value, net; checkPreorder=checkPreorder)) -end -shiftHybrid(value::Real, net::HybridNetwork; checkPreorder=true::Bool) = shiftHybrid([value], net; checkPreorder=checkPreorder) - -""" - getShiftEdgeNumber(shift::ShiftNet) - -Get the edge numbers where the shifts are located, for an object [`ShiftNet`](@ref). -If a shift is placed at the root node with no parent edge, the edge number -of a shift is set to -1 (as if missing). -""" -function getShiftEdgeNumber(shift::ShiftNet) - nodInd = getShiftRowInds(shift) - [getMajorParentEdgeNumber(n) for n in shift.net.nodes_changed[nodInd]] -end - -function getMajorParentEdgeNumber(n::Node) - try - getparentedge(n).number - catch - -1 - end -end - -function getShiftRowInds(shift::ShiftNet) - n, p = size(shift.shift) - inds = zeros(Int, n) - counter = 0 - for i = 1:n - use_row = !all(iszero, @view shift.shift[i, :]) - if use_row - counter += 1 - inds[counter] = i - end - end - - return inds[1:counter] -end -""" - getShiftValue(shift::ShiftNet) - -Get the values of the shifts, for an object [`ShiftNet`](@ref). -""" -function getShiftValue(shift::ShiftNet) - rowInds = getShiftRowInds(shift) - shift.shift[rowInds, :] -end - -function shiftTable(shift::ShiftNet) - sv = getShiftValue(shift) - if size(sv, 2) == 1 - shift_labels = ["Shift Value"] - else - shift_labels = ["Shift Value $i" for i = 1:size(sv, 2)] - end - CoefTable(hcat(getShiftEdgeNumber(shift), sv), - ["Edge Number"; shift_labels], - fill("", size(sv, 1))) -end - -function Base.show(io::IO, obj::ShiftNet) - println(io, "$(typeof(obj)):\n", - shiftTable(obj)) -end - -function Base.:*(sh1::ShiftNet, sh2::ShiftNet) - isEqual(sh1.net, sh2.net) || error("Shifts to be concatenated must be defined on the same network.") - size(sh1.shift) == size(sh2.shift) || error("Shifts to be concatenated must have the same dimensions.") - shiftNew = zeros(size(sh1.shift)) - for i in 1:length(sh1.shift) - if iszero(sh1.shift[i]) - shiftNew[i] = sh2.shift[i] - elseif iszero(sh2.shift[i]) - shiftNew[i] = sh1.shift[i] - elseif sh1.shift[i] == sh2.shift[i] - shiftNew[i] = sh1.shift[i] - else - error("The two shifts matrices you provided affect the same " * - "trait for the same edge, so I cannot choose which one you want.") - end - end - return(ShiftNet(shiftNew, sh1.net)) -end - -# function Base.:(==)(sh1::ShiftNet, sh2::ShiftNet) -# isEqual(sh1.net, sh2.net) || return(false) -# sh1.shift == sh2.shift || return(false) -# return(true) -# end - -################################################### -# types to hold parameters for evolutionary process -# like scalar BM, multivariate BM, OU? - -abstract type ParamsProcess end - -""" - ParamsBM <: ParamsProcess - -Type for a BM process on a network. Fields are `mu` (expectation), -`sigma2` (variance), `randomRoot` (whether the root is random, default to `false`), -and `varRoot` (if the root is random, the variance of the root, default to `NaN`). - -""" -mutable struct ParamsBM <: ParamsProcess - mu::Real # Ancestral value or mean - sigma2::Real # variance - randomRoot::Bool # Root is random ? default false - varRoot::Real # root variance. Default NaN - shift::Union{ShiftNet, Missing} # shifts - - function ParamsBM(mu::Real, - sigma2::Real, - randomRoot::Bool, - varRoot::Real, - shift::Union{ShiftNet, Missing}) - if !ismissing(shift) && size(shift.shift, 2) != 1 - error("ShiftNet must have only a single shift dimension.") - end - return new(mu, sigma2, randomRoot, varRoot, shift) - end -end -# Constructor -ParamsBM(mu::Real, sigma2::Real) = ParamsBM(mu, sigma2, false, NaN, missing) # default values -ParamsBM(mu::Real, sigma2::Real, net::HybridNetwork) = ParamsBM(mu, sigma2, false, NaN, ShiftNet(net)) # default values -ParamsBM(mu::Real, sigma2::Real, shift::ShiftNet) = ParamsBM(mu, sigma2, false, NaN, shift) # default values - -function anyShift(params::ParamsProcess) - if ismissing(params.shift) return(false) end - for v in params.shift.shift - if v != 0 return(true) end - end - return(false) -end - -function process_dim(::ParamsBM) - return 1 -end - -function Base.show(io::IO, obj::ParamsBM) - disp = "$(typeof(obj)):\n" - pt = paramstable(obj) - if obj.randomRoot - disp = disp * "Parameters of a BM with random root:\n" * pt - else - disp = disp * "Parameters of a BM with fixed root:\n" * pt - end - println(io, disp) -end - -function paramstable(obj::ParamsBM) - disp = "mu: $(obj.mu)\nSigma2: $(obj.sigma2)" - if obj.randomRoot - disp = disp * "\nvarRoot: $(obj.varRoot)" - end - if anyShift(obj) - disp = disp * "\n\nThere are $(length(getShiftValue(obj.shift))) shifts on the network:\n" - disp = disp * "$(shiftTable(obj.shift))" - end - return(disp) -end - - -""" - ParamsMultiBM <: ParamsProcess - -Type for a multivariate Brownian diffusion (MBD) process on a network. Fields are `mu` (expectation), -`sigma` (covariance matrix), `randomRoot` (whether the root is random, default to `false`), -`varRoot` (if the root is random, the covariance matrix of the root, default to `[NaN]`), -`shift` (a ShiftNet type, default to `missing`), -and `L` (the lower triangular of the cholesky decomposition of `sigma`, computed automatically) - -# Constructors -```jldoctest -julia> ParamsMultiBM([1.0, -0.5], [2.0 0.3; 0.3 1.0]) # no shifts -ParamsMultiBM: -Parameters of a MBD with fixed root: -mu: [1.0, -0.5] -Sigma: [2.0 0.3; 0.3 1.0] - -julia> net = readTopology("((A:1,B:1):1,C:2);"); - -julia> shifts = ShiftNet(net.node[2], [-1.0, 2.0], net); - -julia> ParamsMultiBM([1.0, -0.5], [2.0 0.3; 0.3 1.0], shifts) # with shifts -ParamsMultiBM: -Parameters of a MBD with fixed root: -mu: [1.0, -0.5] -Sigma: [2.0 0.3; 0.3 1.0] - -There are 2 shifts on the network: -─────────────────────────────────────────── - Edge Number Shift Value 1 Shift Value 2 -─────────────────────────────────────────── - 2.0 -1.0 2.0 -─────────────────────────────────────────── - - -``` - -""" -mutable struct ParamsMultiBM <: ParamsProcess - mu::AbstractArray{Float64, 1} - sigma::AbstractArray{Float64, 2} - randomRoot::Bool - varRoot::AbstractArray{Float64, 2} - shift::Union{ShiftNet, Missing} - L::LowerTriangular{Float64} - - function ParamsMultiBM(mu::AbstractArray{Float64, 1}, - sigma::AbstractArray{Float64, 2}, - randomRoot::Bool, - varRoot::AbstractArray{Float64, 2}, - shift::Union{ShiftNet, Missing}, - L::LowerTriangular{Float64}) - dim = length(mu) - if size(sigma) != (dim, dim) - error("The mean and variance do must have conforming dimensions.") - end - if randomRoot && size(sigma) != size(varRoot) - error("The root variance and process variance must have the same dimensions.") - end - if !ismissing(shift) && size(shift.shift, 2) != dim - error("The ShiftNet and diffusion process must have the same dimensions.") - end - return new(mu, sigma, randomRoot, varRoot, shift, L) - end -end - -ParamsMultiBM(mu::AbstractArray{Float64, 1}, - sigma::AbstractArray{Float64, 2}) = - ParamsMultiBM(mu, sigma, false, Diagonal([NaN]), missing, cholesky(sigma).L) - -function ParamsMultiBM(mu::AbstractArray{Float64, 1}, - sigma::AbstractArray{Float64, 2}, - shift::ShiftNet) - ParamsMultiBM(mu, sigma, false, Diagonal([NaN]), shift, cholesky(sigma).L) -end - -function ParamsMultiBM(mu::AbstractArray{Float64, 1}, - sigma::AbstractArray{Float64, 2}, - net::HybridNetwork) - ParamsMultiBM(mu, sigma, ShiftNet(net, length(mu))) -end - - -function process_dim(params::ParamsMultiBM) - return length(params.mu) -end - - -function Base.show(io::IO, obj::ParamsMultiBM) - disp = "$(typeof(obj)):\n" - pt = paramstable(obj) - if obj.randomRoot - disp = disp * "Parameters of a MBD with random root:\n" * pt - else - disp = disp * "Parameters of a MBD with fixed root:\n" * pt - end - println(io, disp) -end - -function paramstable(obj::ParamsMultiBM) - disp = "mu: $(obj.mu)\nSigma: $(obj.sigma)" - if obj.randomRoot - disp = disp * "\nvarRoot: $(obj.varRoot)" - end - if anyShift(obj) - disp = disp * "\n\nThere are $(length(getShiftValue(obj.shift))) shifts on the network:\n" - disp = disp * "$(shiftTable(obj.shift))" - end - return(disp) -end - - -function partitionMBDMatrix(M::Matrix{Float64}, dim::Int) - - means = @view M[1:dim, :] - vals = @view M[(dim + 1):(2 * dim), :] - return means, vals -end - - -############################################################################### -## Simulation of continuous traits -############################################################################### - -""" - TraitSimulation - -Result of a trait simulation on an [`HybridNetwork`](@ref) with function [`simulate`](@ref). - -The following functions and extractors can be applied to it: [`tipLabels`](@ref), `obj[:Tips]`, `obj[:InternalNodes]` (see documentation for function [`getindex(::TraitSimulation, ::Symbol)`](@ref)). - -The `TraitSimulation` object has fields: `M`, `params`, `model`. -""" -struct TraitSimulation - M::MatrixTopologicalOrder - params::ParamsProcess - evomodel::AbstractString -end - -function Base.show(io::IO, obj::TraitSimulation) - disp = "$(typeof(obj)):\n" - disp = disp * "Trait simulation results on a network with $(length(obj.M.tipNames)) tips, using a $(obj.evomodel) model, with parameters:\n" - disp = disp * paramstable(obj.params) - println(io, disp) -end - -# docstring already in descriptive.jl -function tipLabels(obj::TraitSimulation) - return tipLabels(obj.M) -end - - -""" - simulate(net::HybridNetwork, params::ParamsProcess, checkPreorder=true::Bool) - -Simulate traits on `net` using the parameters `params`. For now, only -parameters of type [`ParamsBM`](@ref) (univariate Brownian Motion) and -[`ParamsMultiBM`](@ref) (multivariate Brownian motion) are accepted. - -The simulation using a recursion from the root to the tips of the network, -therefore, a pre-ordering of nodes is needed. If `checkPreorder=true` (default), -[`preorder!`](@ref) is called on the network beforehand. Otherwise, it is assumed -that the preordering has already been calculated. - -Returns an object of type [`TraitSimulation`](@ref), -which has a matrix with the trait expecations and simulated trait values at -all the nodes. - -See examples below for accessing expectations and simulated trait values. - -# Examples -## Univariate -```jldoctest -julia> phy = readTopology("(A:2.5,((U:1,#H1:0.5::0.4):1,(C:1,(D:0.5)#H1:0.5::0.6):1):0.5);"); - -julia> par = ParamsBM(1, 0.1) # BM with expectation 1 and variance 0.1. -ParamsBM: -Parameters of a BM with fixed root: -mu: 1 -Sigma2: 0.1 - - -julia> using Random; Random.seed!(17920921); # for reproducibility - -julia> sim = simulate(phy, par) # Simulate on the tree. -TraitSimulation: -Trait simulation results on a network with 4 tips, using a BM model, with parameters: -mu: 1 -Sigma2: 0.1 - - -julia> traits = sim[:Tips] # Extract simulated values at the tips. -4-element Vector{Float64}: - 0.9664650558470932 - 0.4104321932336118 - 0.2796524923704289 - 0.7306692819731366 - -julia> sim.M.tipNames # name of tips, in the same order as values above -4-element Vector{String}: - "A" - "U" - "C" - "D" - -julia> traits = sim[:InternalNodes] # Extract simulated values at internal nodes. Order: as in sim.M.internalNodeNumbers -5-element Vector{Float64}: - 0.5200361297500204 - 0.8088890626285765 - 0.9187604100796469 - 0.711921371091375 - 1.0 - -julia> traits = sim[:All] # simulated values at all nodes, ordered as in sim.M.nodeNumbersTopOrder -9-element Vector{Float64}: - 1.0 - 0.711921371091375 - 0.9187604100796469 - 0.2796524923704289 - 0.5200361297500204 - 0.8088890626285765 - 0.7306692819731366 - 0.4104321932336118 - 0.9664650558470932 - -julia> traits = sim[:Tips, :Exp] # Extract expected values at the tips (also works for sim[:All, :Exp] and sim[:InternalNodes, :Exp]). -4-element Vector{Float64}: - 1.0 - 1.0 - 1.0 - 1.0 -``` - -## Multivariate -```jldoctest -julia> phy = readTopology("(A:2.5,((B:1,#H1:0.5::0.4):1,(C:1,(V:0.5)#H1:0.5::0.6):1):0.5);"); - -julia> par = ParamsMultiBM([1.0, 2.0], [1.0 0.5; 0.5 1.0]) # BM with expectation [1.0, 2.0] and variance [1.0 0.5; 0.5 1.0]. -ParamsMultiBM: -Parameters of a MBD with fixed root: -mu: [1.0, 2.0] -Sigma: [1.0 0.5; 0.5 1.0] - -julia> using Random; Random.seed!(17920921); # for reproducibility - -julia> sim = simulate(phy, par) # simulate on the phylogeny -TraitSimulation: -Trait simulation results on a network with 4 tips, using a MBD model, with parameters: -mu: [1.0, 2.0] -Sigma: [1.0 0.5; 0.5 1.0] - - -julia> traits = sim[:Tips] # Extract simulated values at the tips (each column contains the simulated traits for one node). -2×4 Matrix{Float64}: - 2.99232 -0.548734 -1.79191 -0.773613 - 4.09575 0.712958 0.71848 2.00343 - -julia> traits = sim[:InternalNodes] # simulated values at internal nodes. order: same as in sim.M.internalNodeNumbers -2×5 Matrix{Float64}: - -0.260794 -1.61135 -1.93202 0.0890154 1.0 - 1.46998 1.28614 0.409032 1.94505 2.0 - -julia> traits = sim[:All]; # 2×9 Matrix: values at all nodes, ordered as in sim.M.nodeNumbersTopOrder - -julia> sim[:Tips, :Exp] # Extract expected values (also works for sim[:All, :Exp] and sim[:InternalNodes, :Exp]) -2×4 Matrix{Float64}: - 1.0 1.0 1.0 1.0 - 2.0 2.0 2.0 2.0 -``` -""" -function simulate(net::HybridNetwork, - params::ParamsProcess, - checkPreorder=true::Bool) - if isa(params, ParamsBM) - model = "BM" - elseif isa(params, ParamsMultiBM) - model = "MBD" - else - error("The 'simulate' function only works for a BM process (for now).") - end - !ismissing(params.shift) || (params.shift = ShiftNet(net, process_dim(params))) - - net.isRooted || error("The net needs to be rooted for trait simulation.") - !anyShiftOnRootEdge(params.shift) || error("Shifts are not allowed above the root node. Please put all root specifications in the process parameter.") - - funcs = preorderFunctions(params) - M = recursionPreOrder(net, - checkPreorder, - funcs["init"], - funcs["root"], - funcs["tree"], - funcs["hybrid"], - "c", - params) - TraitSimulation(M, params, model) -end - - -function preorderFunctions(::ParamsBM) - return Dict("init" => initSimulateBM, - "root" => updateRootSimulateBM!, - "tree" => updateTreeSimulateBM!, - "hybrid" => updateHybridSimulateBM!) -end - -function preorderFunctions(::ParamsMultiBM) - return Dict("init" => initSimulateMBD, - "root" => updateRootSimulateMBD!, - "tree" => updateTreeSimulateMBD!, - "hybrid" => updateHybridSimulateMBD!) -end - - -function anyShiftOnRootEdge(shift::ShiftNet) - nodInd = getShiftRowInds(shift) - for n in shift.net.nodes_changed[nodInd] - !(getMajorParentEdgeNumber(n) == -1) || return(true) - end - return(false) -end - -# Initialization of the structure -function initSimulateBM(nodes::Vector{Node}, ::Tuple{ParamsBM}) - return(zeros(2, length(nodes))) -end - -function initSimulateMBD(nodes::Vector{Node}, params::Tuple{ParamsMultiBM}) - n = length(nodes) - p = process_dim(params[1]) - return zeros(2 * p, n) # [means vals] -end - - -# Initialization of the root -function updateRootSimulateBM!(M::Matrix, i::Int, params::Tuple{ParamsBM}) - params = params[1] - if (params.randomRoot) - M[1, i] = params.mu # expectation - M[2, i] = params.mu + sqrt(params.varRoot) * randn() # random value - else - M[1, i] = params.mu # expectation - M[2, i] = params.mu # random value (root fixed) - end -end - -function updateRootSimulateMBD!(M::Matrix{Float64}, - i::Int, - params::Tuple{ParamsMultiBM}) - params = params[1] - p = process_dim(params) - - means, vals = partitionMBDMatrix(M, p) - - if (params.randomRoot) - means[:, i] .= params.mu # expectation - vals[:, i] .= params.mu + cholesky(params.varRoot).L * randn(p) # random value - else - means[:, i] .= params.mu # expectation - vals[:, i] .= params.mu # random value - end -end - -# Going down to a tree node -function updateTreeSimulateBM!(M::Matrix, - i::Int, - parentIndex::Int, - edge::Edge, - params::Tuple{ParamsBM}) - params = params[1] - M[1, i] = M[1, parentIndex] + params.shift.shift[i] # expectation - M[2, i] = M[2, parentIndex] + params.shift.shift[i] + sqrt(params.sigma2 * edge.length) * randn() # random value -end - -function updateTreeSimulateMBD!(M::Matrix{Float64}, - i::Int, - parentIndex::Int, - edge::Edge, - params::Tuple{ParamsMultiBM}) - params = params[1] - p = process_dim(params) - - means, vals = partitionMBDMatrix(M, p) - - μ = @view means[:, i] - val = @view vals[:, i] - - # μ .= means[:, parentIndex] + params.shift.shift[i, :] - μ .= @view means[:, parentIndex] - μ .+= @view params.shift.shift[i, :] - - # val .= sqrt(edge.length) * params.L * randn(p) + vals[:, parentIndex] + params.shift.shift[i, :] - mul!(val, params.L, randn(p)) - val .*= sqrt(edge.length) - val .+= @view vals[:, parentIndex] - val .+= params.shift.shift[i, :] -end - -# Going down to an hybrid node -function updateHybridSimulateBM!(M::Matrix, - i::Int, - parentIndex1::Int, - parentIndex2::Int, - edge1::Edge, - edge2::Edge, - params::Tuple{ParamsBM}) - params = params[1] - M[1, i] = edge1.gamma * M[1, parentIndex1] + edge2.gamma * M[1, parentIndex2] # expectation - M[2, i] = edge1.gamma * (M[2, parentIndex1] + sqrt(params.sigma2 * edge1.length) * randn()) + edge2.gamma * (M[2, parentIndex2] + sqrt(params.sigma2 * edge2.length) * randn()) # random value -end - -function updateHybridSimulateMBD!(M::Matrix{Float64}, - i::Int, - parentIndex1::Int, - parentIndex2::Int, - edge1::Edge, - edge2::Edge, - params::Tuple{ParamsMultiBM}) - - params = params[1] - p = process_dim(params) - - means, vals = partitionMBDMatrix(M, p) - - μ = @view means[:, i] - val = @view vals[:, i] - - μ1 = @view means[:, parentIndex1] - μ2 = @view means[:, parentIndex2] - - v1 = @view vals[:, parentIndex1] - v2 = @view vals[:, parentIndex2] - - # means[:, i] .= edge1.gamma * μ1 + edge2.gamma * μ2 - mul!(μ, μ1, edge1.gamma) - BLAS.axpy!(edge2.gamma, μ2, μ) # expectation - - # val .= edge1.gamma * (v1 + sqrt(edge1.length) * params.L * r1) + - # edge2.gamma * (v2 + sqrt(edge2.length) * params.L * r2) # random value - mul!(val, params.L, randn(p)) - val .*= sqrt(edge1.length) - val .+= v1 - - buffer = params.L * randn(p) - buffer .*= sqrt(edge2.length) - buffer .+= v2 - BLAS.axpby!(edge2.gamma, buffer, edge1.gamma, val) # random value -end - -# Extract the vector of simulated values at the tips -""" - getindex(obj, d) - -Getting submatrices of an object of type [`TraitSimulation`](@ref). - -# Arguments -* `obj::TraitSimulation`: the matrix from which to extract. -* `d::Symbol`: a symbol precising which sub-matrix to extract. Can be: - * `:Tips` columns and/or rows corresponding to the tips - * `:InternalNodes` columns and/or rows corresponding to the internal nodes -""" -function Base.getindex(obj::TraitSimulation, d::Symbol, w=:Sim::Symbol) - inds = siminds(obj.params, w) - return getindex(obj.M, d)[inds, :] -end - -function siminds(::ParamsBM, w::Symbol) - if w == :Sim - return 2 - elseif w == :Exp - return 1 - else - error("The argument 'w' must be ':Sim' or ':Exp'. (':$w' was supplied)") - end -end - -function siminds(params::ParamsMultiBM, w::Symbol) - p = process_dim(params) - if w == :Sim - return (p + 1):(2 * p) - elseif w == :Exp - return 1:p - else - error("The argument 'w' must be ':Sim' or ':Exp'. (':$w' was supplied)") - end -end - -############################################################################### -## Type for models with within-species variation (including measurement error) -############################################################################### - -""" - WithinSpeciesCTM - -CTM stands for "continuous trait model". Contains the estimated variance components -(between-species phylogenetic variance rate and within-species variance) -and output from the `NLopt` optimization used in the estimation. - -## Fields - -- `wsp_var`: intra/within-species variance. -- `bsp_var`: inter/between-species variance-rate. -- `wsp_ninv`: vector of the inverse sample-sizes (e.g. [1/n₁, ..., 1/nₖ], where - data from k species was used to fit the model and nᵢ is the no. of observations - for the ith species). -- `rss`: within-species sum of squares -- `optsum`: an [`OptSummary`](@ref) object. -""" -struct WithinSpeciesCTM - "within-species variance η*σ², assumes Normal distribution" - wsp_var::Vector{Float64} # vector to make it mutable - "between-species variance rate σ², such as from Brownian motion" - bsp_var::Vector{Float64} - "inverse sample sizes (or precision): 1/(no. of individuals) within each species" - wsp_ninv::Vector{Float64} - "within-species sum of squares" - rss::Float64 - "NLopt & NLopt summary object" - optsum::OptSummary -end - -""" - ContinuousTraitEM - -Abstract type for evolutionary models for continuous traits, using a continuous-time -stochastic process on a phylogeny. - -For subtypes, see [`BM`](@ref), [`PagelLambda`](@ref), [`ScalingHybrid`](@ref). - -Each of these subtypes/models has the field `lambda`, whose default value is 1.0. -However, the interpretation of this field differs across models. -""" -abstract type ContinuousTraitEM end - -# current concrete subtypes: BM, PagelLambda, ScalingHybrid -# possible future additions: OU (Ornstein-Uhlenbeck)? -""" - BM(λ) - -Brownian Motion, subtype of [`ContinuousTraitEM`](@ref), to model the population mean -of a trait (or of the residuals from a linear model). Under the BM model, -the population (or species) means have a multivariate normal distribution with -covariance matrix = σ²λV, where σ² is the between-species -variance-rate (to be estimated), and the matrix V is obtained from -[`sharedPathMatrix`](@ref)(net)[:Tips]. - -λ is set to 1 by default, and is immutable. -In future versions, λ may be used to control the scale for σ². - -On a tree, V is the length of shared ancestry. -On a network, the BM model assumes that the trait at a hybrid node -is the weighted average of its immediate parents (plus possibly a fixed shift). -The weights are the proportion of genes inherited from each parent: -the γ parameters of hybrid edges. -""" -struct BM <: ContinuousTraitEM - lambda::Float64 # immutable -end -BM() = BM(1.0) -evomodelname(::BM) = "Brownian motion" - -""" - PagelLambda(λ) - -Pagel's λ model, subtype of [`ContinuousTraitEM`](@ref), with covariance matrix σ²V(λ). -σ² is the between-species variance-rate (to be estimated), and V(λ) = λV + (1-λ)T, -where V is the covariance under a Brownian motion [`BM`](@ref) and T is a diagonal -matrix containing the total branch length elapsed from the root to each leaf (if -the phylogeny is a tree, or more generally if the network is time consistent: the -time from the root to a given node does not depend on the path). - -λ ∈ [0,1] is mutable and may be optimized. It is a measure of phylogenetic -signal, that is, how important the given network is for explaining variation in -the response. When λ=1, the `PagelLambda` model reduces to the `BM` model. -""" -mutable struct PagelLambda <: ContinuousTraitEM - lambda::Float64 # mutable: can be optimized -end -PagelLambda() = PagelLambda(1.0) -evomodelname(::PagelLambda) = "Pagel's lambda" - -""" - ScalingHybrid(λ) - -Scaling Hybrid model, subtype of [`ContinuousTraitEM`](@ref), with covariance matrix -σ²V(N(λ)). σ² is the between-species variance-rate (to be estimated), -V(N) is the Brownian motion [`BM`](@ref) covariance obtained from network N, -and N(λ) is a obtained from the input network by rescaling the inheritance -parameter γ of all minor edges by the same λ: a minor edge has its original γ -changed to λγ, using the same λ at all reticulations. -Note that for a major edge with original inheritance γ, the partner minor edge -has inheritance γ_minor = 1-γ, so the major edge's inheritance is changed to -1-λγ_minor = λγ+1-λ. - -For more information: see Bastide (2017) dissertation, section 4.3.2 p.175, -available at https://tel.archives-ouvertes.fr/tel-01629648 - -λ ∈ [0,1] is mutable and may be optimized. It is a measure of how important the -reticulations are for explaining variation in the response. -When λ=1, the `ScalingHybrid` model reduces to the `BM` model. -""" -mutable struct ScalingHybrid <: ContinuousTraitEM - lambda::Float64 -end -ScalingHybrid() = ScalingHybrid(1.0) -evomodelname(::ScalingHybrid) = "Lambda's scaling hybrid" - -############################################################################### -## phylogenetic network regression -############################################################################### - -""" - PhyloNetworkLinearModel <: GLM.LinPredModel - -Phylogenetic linear model representation. - -## Fields - -`lm`, `V`, `Vy`, `RL`, `Y`, `X`, `logdetVy`, `reml`, `ind`, `nonmissing`, -`evomodel`, `model_within` and `formula`. -The following syntax pattern can be used to get more information on a specific field: -e.g. to find out about the `lm` field, do `?PhyloNetworkLinearModel.lm`. - -## Methods applied to fitted models - -The following StatsBase functions can be applied: -`coef`, `nobs`, `vcov`, `stderror`, `confint`, `coeftable`, `dof_residual`, `dof`, `deviance`, -`residuals`, `response`, `predict`, `loglikelihood`, `nulldeviance`, `nullloglikelihood`, -`r2`, `adjr2`, `aic`, `aicc`, `bic`, `ftest`, `lrtest` etc. - -The estimated variance-rate and estimated mean of the species-level trait model -(see [`ContinuousTraitEM`](@ref)) can be retrieved using [`sigma2_phylo`](@ref) -and [`mu_phylo`](@ref) respectively. - -If relevant, the estimated individual-level/within-species variance can be retrieved -using [`sigma2_within`](@ref). - -The optimized λ parameter for Pagel's λ model (see [`PagelLambda`](@ref)) can -be retrieved using [`lambda_estim`](@ref). - -An ancestral state reconstruction can be performed using [`ancestralStateReconstruction`](@ref). - -## Within-species variation - -The true species/population means for the response trait/variable (or the residuals: -conditional on the predictors) are jointly modeled as 𝒩(·, σ²ₛV) where V depends on -the trait model (see [`ContinuousTraitEM`](@ref)) and on the species network. -σ²ₛ is the between-species variance-rate. - -Within-species variation is modeled by assuming that the individual-level -responses are iid 𝒩(0, σ²ₑ) about the true species means, so that the -species-level sample means (conditional on the predictors) are jointly modeled -as 𝒩(·, σ²ₛV + σ²ₑD⁻¹), where σ²ₑ is the within-species variance and D⁻¹ is a -diagonal matrix whose entries are the inverse sample-sizes (see [`WithinSpeciesCTM`](@ref)). - -Although the above two models can be expressed in terms of a joint distribution -for the species-level sample means (or residuals conditional on the predictors), -more data are required to fit a model accounting for within-species variation, -that is, a model recognizing that the sample means are estimates of the true -population means. To fit a model *without* within-species variation, data on the -species means are sufficient. To fit a model *with* within-species variation, -we need to have the species means and the standard deviations of the response -variable for each species. - -`phylolm` can fit a model with within-species variation either from -species-level statistics ("mean response" and "standard deviation in response") -or from individual-level data (in which case the species-level statistics are -computed internally). See [`phylolm`](@ref) for more details on these two -input choices. - -In the object, `obj.Y` and `obj.X` are the observed species means. -`predict`, `residuals` and `response` return the values at the species level. -""" -mutable struct PhyloNetworkLinearModel <: GLM.LinPredModel - "lm: a GLM.LinearModel object, fitted on the cholesky-tranformed problem" - lm::GLM.LinearModel # result of a lm on a matrix - "V: a MatrixTopologicalOrder object of the network-induced correlations" - V::MatrixTopologicalOrder - "Vy: the sub matrix corresponding to the tips and actually used for the correction" - Vy::Matrix - """RL: a LowerTriangular matrix, the lower Cholesky factor of Vy=RL*RL' - obtained with `cholesky(Vy).L`. The data stored in `lm` are RL⁻¹Y and RL⁻¹X. - """ - RL::LowerTriangular - "Y: the vector of data" - Y::Vector - "X: the matrix of regressors" - X::Matrix - "logdetVy: the log-determinant of Vy" - logdetVy::Float64 - "criterion: REML if reml is true, ML otherwise" - reml::Bool - "ind: vector matching the tips of the network against the names of the dataframe provided. 0 if the match could not be performed." - ind::Vector{Int} - "nonmissing: vector indicating which tips have non-missing data" - nonmissing::BitArray{1} - "evomodel: the model used for the fit" - evomodel::ContinuousTraitEM - # ContinuousTraitEM is abstract: not efficient. parametrize PhyloNetworkLinearModel? - # but the types for Vy, Y and X are also abstract. - "model_within: the model used for within-species variation (if needed)" - model_within::Union{Nothing, WithinSpeciesCTM} - "formula: a StatsModels.FormulaTerm formula" - formula::Union{StatsModels.FormulaTerm,Nothing} -end - -# default model_within=nothing -PhyloNetworkLinearModel(lm, V,Vy,RL,Y,X,logdetVy, reml,ind,nonmissing, model) = - PhyloNetworkLinearModel(lm,V,Vy,RL,Y,X,logdetVy, reml,ind,nonmissing, model,nothing,nothing) -# default formula=nothing -PhyloNetworkLinearModel(lm,V,Vy,RL,Y,X,logdetVy,reml,ind,nonmissing,model,model_within) = -PhyloNetworkLinearModel(lm,V,Vy,RL,Y,X,logdetVy, reml,ind,nonmissing,model,model_within,nothing) - - -#= ------ roadmap of phylolm methods -------------- - -with or without within-species variation: -- phylolm(formula, dataframe, net; model="BM",...,withinspecies_var=false,...) -- phylolm(X,Y,net, model::ContinuousTraitEM; kwargs...) - calls a function with or without within-species variation. - -1. no measurement error in species means: - - phylolm(model, X,Y,net, reml; kwargs...) dispatches based on model type - - phylolm_lambda(X,Y,V,reml, gammas,times; ...) - - phylolm_scalingHybrid(X,Y,net,reml, gammas; ...) - - helpers: - - pgls(X,Y,V; ...) for vanilla BM, but called by others with fixed V_theta - - logLik_lam(lambda, X,Y,V,gammas,times; ...) - - logLik_lam_hyb(lambda, X,Y,net,gammas; ...) - -2. with measurement error (within-species variation): - - phylolm_wsp(model, X,Y,net, reml; kwargs...) dispatch based on model - implemented for model <: BM only - - - phylolm_wsp(X,Y,V,reml, nonmissing,ind, counts,ySD, model_within) - - phylolm_wsp(Xsp,Ysp,Vsp,reml, d_inv,RSS, n,p,a, model_within) -=# -""" - phylolm(X::Matrix, Y::Vector, net::HybridNetwork, model::ContinuousTraitEM=BM(); kwargs...) - -Return a [`PhyloNetworkLinearModel`](@ref) object. -This method is called by `phylolm(formula, data, network; kwargs...)`. -""" -function phylolm(X::Matrix, Y::Vector, net::HybridNetwork, - model::ContinuousTraitEM = BM(); - reml::Bool=true, - nonmissing=trues(length(Y))::BitArray{1}, - ind=[0]::Vector{Int}, - startingValue=0.5::Real, - fixedValue=missing::Union{Real,Missing}, - withinspecies_var::Bool=false, - counts::Union{Nothing, Vector}=nothing, - ySD::Union{Nothing, Vector}=nothing) - if withinspecies_var - phylolm_wsp(model, X,Y,net, reml; nonmissing=nonmissing, ind=ind, - counts=counts, ySD=ySD) - else - phylolm(model, X,Y,net, reml; nonmissing=nonmissing, ind=ind, - startingValue=startingValue, fixedValue=fixedValue) - end -end - -function phylolm(::BM, X::Matrix, Y::Vector, net::HybridNetwork,reml::Bool; - nonmissing=trues(length(Y))::BitArray{1}, - ind=[0]::Vector{Int}, - kwargs...) - # BM variance covariance: - # V_ij = expected shared time for independent genes in i & j - V = sharedPathMatrix(net) - linmod, Vy, RL, logdetVy = pgls(X,Y,V; nonmissing=nonmissing, ind=ind) - return PhyloNetworkLinearModel(linmod, V, Vy, RL, Y, X, - logdetVy, reml, ind, nonmissing, BM()) -end - -function phylolm(::PagelLambda, X::Matrix, Y::Vector, net::HybridNetwork, - reml::Bool; - nonmissing=trues(length(Y))::BitArray{1}, - ind=[0]::Vector{Int}, - startingValue=0.5::Real, - fixedValue=missing::Union{Real,Missing}) - # BM variance covariance - V = sharedPathMatrix(net) - gammas = getGammas(net) - times = getHeights(net, false) # false: no need to preorder again - phylolm_lambda(X,Y,V,reml, gammas, times; - nonmissing=nonmissing, ind=ind, - startingValue=startingValue, fixedValue=fixedValue) -end - -#= ScalingHybrid = BM but with optimized weights of hybrid edges: -minor edges have their original γ's changed to λγ. Same λ at all hybrids. -see Bastide (2017) dissertation, section 4.3.2 p.175, at -https://tel.archives-ouvertes.fr/tel-01629648 -=# -function phylolm(::ScalingHybrid, X::Matrix, Y::Vector, net::HybridNetwork, - reml::Bool; - nonmissing=trues(length(Y))::BitArray{1}, - ind=[0]::Vector{Int}, - startingValue=0.5::Real, - fixedValue=missing::Union{Real,Missing}) - preorder!(net) - gammas = getGammas(net) - phylolm_scalingHybrid(X, Y, net, reml, gammas; - nonmissing=nonmissing, ind=ind, - startingValue=startingValue, fixedValue=fixedValue) -end - -############################################################################### -## Fit BM - -# Vanilla BM using covariance V. used for other models: V calculated beforehand -function pgls(X::Matrix, Y::Vector, V::MatrixTopologicalOrder; - nonmissing=trues(length(Y))::BitArray{1}, # which tips are not missing? - ind=[0]::Vector{Int}) - # Extract tips matrix - Vy = V[:Tips] - # Re-order if necessary - if (ind != [0]) Vy = Vy[ind, ind] end - # Keep only not missing values - Vy = Vy[nonmissing, nonmissing] - # Cholesky decomposition - R = cholesky(Vy) - RL = R.L - # Fit with GLM.lm, and return quantities needed downstream - return lm(RL\X, RL\Y), Vy, RL, logdet(R) -end - -############################################################################### -## helper functions for lambda models - -""" - getGammas(net) - -Vector of inheritance γ's of all major edges (tree edges and major hybrid edges), -ordered according to the pre-order index of their child node, -assuming this pre-order is already calculated -(with up-to-date field `nodes_changed`). -Here, a "major" edge is an edge with field `isMajor` set to true, -regardless of its actual γ (below, at or above 0.5). - -See [`setGammas!`](@ref) -""" -function getGammas(net::HybridNetwork) - gammas = ones(length(net.nodes_changed)) - for (i,node) in enumerate(net.nodes_changed) - node.hybrid || continue # skip tree nodes: their gamma is already set to 1 - majorhybedge = getparentedge(node) # major - gammas[i] = majorhybedge.gamma - end - return gammas -end - -""" - setGammas!(net, γ vector) - -Set inheritance γ's of hybrid edges, using input vector for *major* edges. -Assume pre-order calculated already, with up-to-date field `nodes_changed`. -See [`getGammas`](@ref). - -**Warning**: very different from [`setGamma!`](@ref), which focuses on a -single hybrid event, -updates the field `isMajor` according to the new γ, and is not used here. - -**Assumption**: each hybrid node has only 2 parents, a major and a minor parent -(according to the edges' field `isMajor`). -""" -function setGammas!(net::HybridNetwork, gammas::Vector) - for (i,nod) in enumerate(net.nodes_changed) - nod.hybrid || continue # skip tree nodes: nothing to do - majorhyb = getparentedge(nod) # major - minorhyb = getparentedgeminor(nod) # error if doesn't exit - majorhyb.gamma = gammas[i] - minorhyb.gamma = 1 - gammas[i] - end - return nothing -end - -""" - getHeights(net, checkpreorder::Bool=true) - -Return the height (distance to the root) of all nodes, assuming a time-consistent network -(where all paths from the root to a given hybrid node have the same length) -but not necessarily ultrametric: tips need not all be at the same distance from the root. -If `checkpreorder=false`, assumes the network has already been preordered -with [`preorder!`](@ref), because it uses -[`getGammas`](@ref) and [`setGammas!`](@ref)). - -Output: vector of node heights, one per node, in the same order as in -`net.nodes_changed`. Examples: - -```jldoctest -julia> net = readTopology("(((C:1,(A:1)#H1:1.5::0.7):1,(#H1:0.3::0.3,E:2.0):2.2):1.0,O:5.2);"); - -julia> # using PhyloPlots; plot(net, useedgelength=true, showedgelength=true, shownodenumber=true); # to see - -julia> nodeheight = PhyloNetworks.getHeights(net) -9-element Vector{Float64}: - 0.0 - 5.2 - 1.0 - 3.2 - 5.2 - 2.0 - 3.5 - 4.5 - 3.0 - -julia> [node.number => (nodeheight[i], node.name) for (i,node) in enumerate(net.nodes_changed)] -9-element Vector{Pair{Int64, Tuple{Float64, String}}}: - -2 => (0.0, "") - 5 => (5.2, "O") - -3 => (1.0, "") - -6 => (3.2, "") - 4 => (5.2, "E") - -4 => (2.0, "") - 3 => (3.5, "H1") - 2 => (4.5, "A") - 1 => (3.0, "C") - -``` -""" -function getHeights(net::HybridNetwork, checkpreorder::Bool=true) - checkpreorder && preorder!(net) - gammas = getGammas(net) # uses net.nodes_changed - setGammas!(net, ones(net.numNodes)) - V = sharedPathMatrix(net; checkPreorder=false) # no need to preorder again - setGammas!(net, gammas) - return(diag(V[:All])) -end - -function maxLambda(times::Vector, V::MatrixTopologicalOrder) - maskTips = indexin(V.tipNumbers, V.nodeNumbersTopOrder) - maskNodes = indexin(V.internalNodeNumbers, V.nodeNumbersTopOrder) - return minimum(times[maskTips]) / maximum(times[maskNodes]) - # res = minimum(times[maskTips]) / maximum(times[maskNodes]) - # res = res * (1 - 1/5/maximum(times[maskTips])) -end - -function transform_matrix_lambda!(V::MatrixTopologicalOrder, lam::AbstractFloat, - gammas::Vector, times::Vector) - for i in 1:size(V.V, 1) - for j in 1:size(V.V, 2) - V.V[i,j] *= lam - end - end - maskTips = indexin(V.tipNumbers, V.nodeNumbersTopOrder) - for i in maskTips - V.V[i, i] += (1-lam) * (gammas[i]^2 + (1-gammas[i])^2) * times[i] - end - # V_diag = Matrix(Diagonal(diag(V.V))) - # V.V = lam * V.V .+ (1 - lam) .* V_diag -end - -function logLik_lam(lam::AbstractFloat, - X::Matrix, Y::Vector, - V::MatrixTopologicalOrder, - reml::Bool, - gammas::Vector, times::Vector; - nonmissing=trues(length(Y))::BitArray{1}, # Which tips are not missing ? - ind=[0]::Vector{Int}) - # Transform V according to lambda - Vp = deepcopy(V) - transform_matrix_lambda!(Vp, lam, gammas, times) - # Fit and take likelihood - linmod, Vy, RL, logdetVy = pgls(X,Y,Vp; nonmissing=nonmissing, ind=ind) - n = (reml ? dof_residual(linmod) : nobs(linmod)) - res = n*log(deviance(linmod)) + logdetVy - if reml res += logdet(linmod.pp.chol); end - return res -end - -function phylolm_lambda(X::Matrix,Y::Vector, - V::MatrixTopologicalOrder, - reml::Bool, - gammas::Vector, - times::Vector; - nonmissing=trues(length(Y))::BitArray{1}, # Which tips are not missing ? - ind=[0]::Vector{Int}, - ftolRel=fRelTr::AbstractFloat, - xtolRel=xRelTr::AbstractFloat, - ftolAbs=fAbsTr::AbstractFloat, - xtolAbs=xAbsTr::AbstractFloat, - startingValue=0.5::Real, - fixedValue=missing::Union{Real,Missing}) - if ismissing(fixedValue) - # Find Best lambda using optimize from package NLopt - opt = NLopt.Opt(:LN_BOBYQA, 1) - NLopt.ftol_rel!(opt, ftolRel) # relative criterion - NLopt.ftol_abs!(opt, ftolAbs) # absolute critetion - NLopt.xtol_rel!(opt, xtolRel) # criterion on parameter value changes - NLopt.xtol_abs!(opt, xtolAbs) # criterion on parameter value changes - NLopt.maxeval!(opt, 1000) # max number of iterations - NLopt.lower_bounds!(opt, 1e-100) # Lower bound - # Upper Bound - up = maxLambda(times, V) - up = up-up/1000 - NLopt.upper_bounds!(opt, up) - @info "Maximum lambda value to maintain positive branch lengths: " * @sprintf("%.6g", up) - count = 0 - function fun(x::Vector{Float64}, g::Vector{Float64}) - x = convert(AbstractFloat, x[1]) - res = logLik_lam(x, X,Y,V, reml, gammas, times; nonmissing=nonmissing, ind=ind) - count =+ 1 - #println("f_$count: $(round(res, digits=5)), x: $(x)") - return res - end - NLopt.min_objective!(opt, fun) - fmin, xmin, ret = NLopt.optimize(opt, [startingValue]) - # Best value dans result - res_lam = xmin[1] - else - res_lam = fixedValue - end - transform_matrix_lambda!(V, res_lam, gammas, times) - linmod, Vy, RL, logdetVy = pgls(X,Y,V; nonmissing=nonmissing, ind=ind) - res = PhyloNetworkLinearModel(linmod, V, Vy, RL, Y, X, - logdetVy, reml, ind, nonmissing, PagelLambda(res_lam)) - return res -end - -############################################################################### -## Fit scaling hybrid - -function matrix_scalingHybrid(net::HybridNetwork, lam::AbstractFloat, - gammas::Vector) - setGammas!(net, 1.0 .- lam .* (1. .- gammas)) - V = sharedPathMatrix(net) - setGammas!(net, gammas) - return V -end - -function logLik_lam_hyb(lam::AbstractFloat, - X::Matrix, Y::Vector, - net::HybridNetwork, reml::Bool, gammas::Vector; - nonmissing=trues(length(Y))::BitArray{1}, # Which tips are not missing ? - ind=[0]::Vector{Int}) - # Transform V according to lambda - V = matrix_scalingHybrid(net, lam, gammas) - # Fit and take likelihood - linmod, Vy, RL, logdetVy = pgls(X,Y,V; nonmissing=nonmissing, ind=ind) - n = (reml ? dof_residual(linmod) : nobs(linmod)) - res = n*log(deviance(linmod)) + logdetVy - if reml res += logdet(linmod.pp.chol); end - return res -end - -function phylolm_scalingHybrid(X::Matrix,Y::Vector, - net::HybridNetwork, - reml::Bool, - gammas::Vector; - nonmissing=trues(length(Y))::BitArray{1}, # Which tips are not missing ? - ind=[0]::Vector{Int}, - ftolRel=fRelTr::AbstractFloat, - xtolRel=xRelTr::AbstractFloat, - ftolAbs=fAbsTr::AbstractFloat, - xtolAbs=xAbsTr::AbstractFloat, - startingValue=0.5::Real, - fixedValue=missing::Union{Real,Missing}) - if ismissing(fixedValue) - # Find Best lambda using optimize from package NLopt - opt = NLopt.Opt(:LN_BOBYQA, 1) - NLopt.ftol_rel!(opt, ftolRel) # relative criterion - NLopt.ftol_abs!(opt, ftolAbs) # absolute critetion - NLopt.xtol_rel!(opt, xtolRel) # criterion on parameter value changes - NLopt.xtol_abs!(opt, xtolAbs) # criterion on parameter value changes - NLopt.maxeval!(opt, 1000) # max number of iterations - #NLopt.lower_bounds!(opt, 1e-100) # Lower bound - #NLopt.upper_bounds!(opt, 1.0) - count = 0 - function fun(x::Vector{Float64}, g::Vector{Float64}) - x = convert(AbstractFloat, x[1]) - res = logLik_lam_hyb(x, X, Y, net, reml, gammas; nonmissing=nonmissing, ind=ind) - #count =+ 1 - #println("f_$count: $(round(res, digits=5)), x: $(x)") - return res - end - NLopt.min_objective!(opt, fun) - fmin, xmin, ret = NLopt.optimize(opt, [startingValue]) - # Best value dans result - res_lam = xmin[1] - else - res_lam = fixedValue - end - V = matrix_scalingHybrid(net, res_lam, gammas) - linmod, Vy, RL, logdetVy = pgls(X,Y,V; nonmissing=nonmissing, ind=ind) - res = PhyloNetworkLinearModel(linmod, V, Vy, RL, Y, X, - logdetVy, reml, ind, nonmissing, ScalingHybrid(res_lam)) - return res -end - - -""" - phylolm(f::StatsModels.FormulaTerm, fr::AbstractDataFrame, net::HybridNetwork; kwargs...) - -Fit a phylogenetic linear regression model to data. -Return an object of type [`PhyloNetworkLinearModel`](@ref). -It contains a linear model from the GLM package, in `object.lm`, of type -[GLM.LinearModel](https://juliastats.org/GLM.jl/stable/api/#GLM.LinearModel). - -## Arguments - -* `f`: formula to use for the regression, see [StatsModels](https://juliastats.org/StatsModels.jl/stable/) -* `fr`: DataFrame containing the response values, predictor values, species/tip labels for each observation/row. -* `net`: phylogenetic network to use. Should have labelled tips. - -Keyword arguments - -* `model="BM"`: model for trait evolution (as a string) - "lambda" (Pagel's lambda), "scalingHybrid" are other possible values - (see [`ContinuousTraitEM`](@ref)) -* `tipnames=:tipNames`: column name for species/tip-labels, represented - as a symbol. For example, if the column containing the species/tip labels in - `fr` is named "Species", then do `tipnames=:Species`. -* `no_names=false`: If `true`, force the function to ignore the tips names. - The data is then assumed to be in the same order as the tips of the network. - Default is false, setting it to true is dangerous, and strongly discouraged. -* `reml=true`: if `true`, use REML criterion ("restricted maximum likelihood") - for estimating variance components, else use ML criterion. - -The following tolerance parameters control the optimization of lambda if -`model="lambda"` or `model="scalingHybrid"`, and control the optimization of the -variance components if `model="BM"` and `withinspecies_var=true`. -* `fTolRel=1e-10`: relative tolerance on the likelihood value -* `fTolAbs=1e-10`: absolute tolerance on the likelihood value -* `xTolRel=1e-10`: relative tolerance on the parameter value -* `xTolAbs=1e-10`: absolute tolerance on the parameter value - -* `startingValue=0.5`: If `model`="lambda" or "scalingHybrid", this - provides the starting value for the optimization in lambda. -* `fixedValue=missing`: If `model`="lambda" or "scalingHybrid", and - `fixedValue` is a number, then lambda is set to this number and is not optimized. -* `withinspecies_var=false`: If `true`, fits a within-species variation model. - Currently only implemented for `model`="BM". -* `y_mean_std::Bool=false`: If `true`, and `withinspecies_var=true`, then accounts for - within-species variation, using species-level statistics provided in `fr`. - -## Methods applied to fitted models - -To access the response values, do `response(object)`. -To access the model matrix, do `modelmatrix(object)`. -To access the model formula, do `formula(object)`. - -## Within-species variation - -For a high-level description, see [`PhyloNetworkLinearModel`](@ref). -To fit a model with within-species variation in the response variable, -either of the following must be provided in the data frame `fr`: - -(1) Individual-level data: There should be columns for response, predictors, and -species/tip-labels. Every row should correspond to an individual observation. -At least one species must be represented by two or more individuals. - -(2) Species-level statistics: There should be columns for mean response, predictors, -species/tip-labels, species sample-sizes (number of individuals for each species), -and species standard deviations (standard deviations of the response values -by species). Every row should correspond to a species: each species should be -represented by a unique row. The column names for species sample-sizes and -species standard deviations are expected to be "[response column name]\\_n" -and "[response column name]\\_sd". For example, if the response column name is "y", -then the column names should be "y\\_n" and "y\\_sd" for the sample-sizes and -standard deviations. - -Regardless of whether the data provided follows (1) or (2), -`withinspecies_var` should be set to true. -If the data provided follows (2), then `y_mean_std` should be set to false. - -## Within-species variation in predictors - -The model assumes *no* within-species variation in predictors, because it aims to -capture the evolutionary (historical, phylogenetic) relationship between the -predictors and the response, not the within-species (present-day, or phenotypic) -relationship. - -If a within-species variation model is fitted on individual-level data, and -if there are individuals within the same species with different values for -the same predictor, these values are all replaced by the mean predictor value -for all the individuals in that species. -For example, suppose there are 3 individuals in a given species, and that their -predictor values are (x₁=3, x₂=6), (x₁=4, x₂=8) and (x₁=2, x₂=1). Then the predictor -values for these 3 individuals are each replaced by (x₁=(3+4+2)/3, x₂=(6+8+1)/3) -before model fitting. If a fourth individual had data (x₁=10, x₂=missing), then that -individual would be ignored for any model using x₂, and would not contribute any -information to its species data for these models. - -## Missing data - -Rows with missing data for either the response or the predictors are omitted from -the model-fitting. There should minimally be columns for response, predictors, -species/tip-labels. As detailed above, additional columns may be required for fitting -within-species variation. Missing data in the columns for species names, -species standard deviation / sample sizes (if used) will throw an error. - -## See also - -[`simulate`](@ref), [`ancestralStateReconstruction`](@ref), [`vcv`](@ref) - -## Examples: Without within-species variation - -```jldoctest -julia> phy = readTopology(joinpath(dirname(pathof(PhyloNetworks)), "..", "examples", "caudata_tree.txt")); - -julia> using DataFrames, CSV # to read data file, next - -julia> dat = CSV.File(joinpath(dirname(pathof(PhyloNetworks)), "..", "examples", "caudata_trait.txt")) |> DataFrame; - -julia> using StatsModels # for stat model formulas - -julia> fitBM = phylolm(@formula(trait ~ 1), dat, phy; reml=false); - -julia> fitBM # Shows a summary -PhyloNetworkLinearModel - -Formula: trait ~ 1 - -Model: Brownian motion - -Parameter Estimates, using ML: -phylogenetic variance rate: 0.00294521 - -Coefficients: -───────────────────────────────────────────────────────────────────── - Coef. Std. Error t Pr(>|t|) Lower 95% Upper 95% -───────────────────────────────────────────────────────────────────── -(Intercept) 4.679 0.330627 14.15 <1e-31 4.02696 5.33104 -───────────────────────────────────────────────────────────────────── -Log Likelihood: -78.9611507833 -AIC: 161.9223015666 - -julia> round(sigma2_phylo(fitBM), digits=6) # rounding for jldoctest convenience -0.002945 - -julia> round(mu_phylo(fitBM), digits=4) -4.679 - -julia> using StatsBase # for aic() stderror() loglikelihood() etc. - -julia> round(loglikelihood(fitBM), digits=10) --78.9611507833 - -julia> round(aic(fitBM), digits=10) -161.9223015666 - -julia> round(aicc(fitBM), digits=10) -161.9841572367 - -julia> round(bic(fitBM), digits=10) -168.4887090241 - -julia> round.(coef(fitBM), digits=4) -1-element Vector{Float64}: - 4.679 - -julia> confint(fitBM) -1×2 Matrix{Float64}: - 4.02696 5.33104 - -julia> abs(round(r2(fitBM), digits=10)) # absolute value for jldoctest convenience -0.0 - -julia> abs(round(adjr2(fitBM), digits=10)) -0.0 - -julia> round.(vcov(fitBM), digits=6) -1×1 Matrix{Float64}: - 0.109314 - -julia> round.(residuals(fitBM), digits=6) -197-element Vector{Float64}: - -0.237648 - -0.357937 - -0.159387 - -0.691868 - -0.323977 - -0.270452 - -0.673486 - -0.584654 - -0.279882 - -0.302175 - ⋮ - -0.777026 - -0.385121 - -0.443444 - -0.327303 - -0.525953 - -0.673486 - -0.603158 - -0.211712 - -0.439833 - -julia> round.(response(fitBM), digits=5) -197-element Vector{Float64}: - 4.44135 - 4.32106 - 4.51961 - 3.98713 - 4.35502 - 4.40855 - 4.00551 - 4.09434 - 4.39912 - 4.37682 - ⋮ - 3.90197 - 4.29388 - 4.23555 - 4.3517 - 4.15305 - 4.00551 - 4.07584 - 4.46729 - 4.23917 - -julia> round.(predict(fitBM), digits=5) -197-element Vector{Float64}: - 4.679 - 4.679 - 4.679 - 4.679 - 4.679 - 4.679 - 4.679 - 4.679 - 4.679 - 4.679 - ⋮ - 4.679 - 4.679 - 4.679 - 4.679 - 4.679 - 4.679 - 4.679 - 4.679 - 4.679 -``` - -## Examples: With within-species variation (two different input formats shown) - -```jldoctest -julia> using DataFrames, StatsModels # for statistical model formulas - -julia> net = readTopology("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); - -julia> df = DataFrame( # individual-level observations - species = repeat(["D","C","A","B","E","O"],inner=3), - trait1 = [4.08298,4.08298,4.08298,3.10782,3.10782,3.10782,2.17078,2.17078,2.17078,1.87333,1.87333, - 1.87333,2.8445,2.8445,2.8445,5.88204,5.88204,5.88204], - trait2 = [-7.34186,-7.34186,-7.34186,-7.45085,-7.45085,-7.45085,-3.32538,-3.32538,-3.32538,-4.26472, - -4.26472,-4.26472,-5.96857,-5.96857,-5.96857,-1.99388,-1.99388,-1.99388], - trait3 = [18.8101,18.934,18.9438,17.0687,17.0639,17.0732,14.4818,14.1112,14.2817,13.0842,12.9562, - 12.9019,15.4373,15.4075,15.4317,24.2249,24.1449,24.1302]); - -julia> m1 = phylolm(@formula(trait3 ~ trait1), df, net; - tipnames=:species, withinspecies_var=true) -PhyloNetworkLinearModel - -Formula: trait3 ~ 1 + trait1 - -Model: Brownian motion - -Parameter Estimates, using REML: -phylogenetic variance rate: 0.156188 -within-species variance: 0.0086343 - -Coefficients: -────────────────────────────────────────────────────────────────────── - Coef. Std. Error t Pr(>|t|) Lower 95% Upper 95% -────────────────────────────────────────────────────────────────────── -(Intercept) 9.65347 1.3066 7.39 0.0018 6.02577 13.2812 -trait1 2.30358 0.276163 8.34 0.0011 1.53683 3.07033 -────────────────────────────────────────────────────────────────────── -Log Likelihood: 1.9446255188 -AIC: 4.1107489623 - -julia> df_r = DataFrame( # species-level statistics (sample means, standard deviations) - species = ["D","C","A","B","E","O"], - trait1 = [4.08298,3.10782,2.17078,1.87333,2.8445,5.88204], - trait2 = [-7.34186,-7.45085,-3.32538,-4.26472,-5.96857,-1.99388], - trait3 = [18.896,17.0686,14.2916,12.9808,15.4255,24.1667], - trait3_sd = [0.074524,0.00465081,0.185497,0.0936,0.0158379,0.0509643], - trait3_n = [3, 3, 3, 3, 3, 3]); - -julia> m2 = phylolm(@formula(trait3 ~ trait1), df_r, net; - tipnames=:species, withinspecies_var=true, y_mean_std=true) -PhyloNetworkLinearModel - -Formula: trait3 ~ 1 + trait1 - -Model: Brownian motion - -Parameter Estimates, using REML: -phylogenetic variance rate: 0.15618 -within-species variance: 0.0086343 - -Coefficients: -────────────────────────────────────────────────────────────────────── - Coef. Std. Error t Pr(>|t|) Lower 95% Upper 95% -────────────────────────────────────────────────────────────────────── -(Intercept) 9.65342 1.30657 7.39 0.0018 6.02582 13.281 -trait1 2.30359 0.276156 8.34 0.0011 1.53686 3.07032 -────────────────────────────────────────────────────────────────────── -Log Likelihood: 1.9447243714 -AIC: 4.1105512573 -``` -""" -function phylolm(f::StatsModels.FormulaTerm, - fr::AbstractDataFrame, - net::HybridNetwork; - model::AbstractString="BM", - tipnames::Symbol=:tipNames, - no_names::Bool=false, - reml::Bool=true, - ftolRel::AbstractFloat=fRelTr, - xtolRel::AbstractFloat=xRelTr, - ftolAbs::AbstractFloat=fAbsTr, - xtolAbs::AbstractFloat=xAbsTr, - startingValue::Real=0.5, - fixedValue::Union{Real,Missing}=missing, - withinspecies_var::Bool=false, - y_mean_std::Bool=false) - # Match the tips names: make sure that the data provided by the user will - # be in the same order as the ordered tips in matrix V. - preorder!(net) - if no_names # The names should not be taken into account. - ind = [0] - @info """As requested (no_names=true), I am ignoring the tips names - in the network and in the dataframe.""" - else - nodatanames = !any(DataFrames.propertynames(fr) .== tipnames) - nodatanames && any(tipLabels(net) == "") && - error("""The network provided has no tip names, and the input dataframe has no - column "$tipnames" for species names, so I can't match the data on the network - unambiguously. If you are sure that the tips of the network are in the - same order as the values of the dataframe provided, then please re-run - this function with argument no_name=true.""") - any(tipLabels(net) == "") && - error("""The network provided has no tip names, so I can't match the data - on the network unambiguously. If you are sure that the tips of the - network are in the same order as the values of the dataframe provided, - then please re-run this function with argument no_name=true.""") - nodatanames && - error("""The input dataframe has no column "$tipnames" for species names, so I can't - match the data on the network unambiguously. If you are sure that the - tips of the network are in the same order as the values of the dataframe - provided, then please re-run this function with argument no_name=true.""") - ind = indexin(fr[!, tipnames], tipLabels(net)) - any(isnothing, ind) && - error("""Tips with data are not in the network: $(fr[isnothing.(ind), tipnames]) - please provide a larger network including these tips.""") - ind = convert(Vector{Int}, ind) # Int, not Union{Nothing, Int} - if length(unique(ind)) == length(ind) - withinspecies_var && !y_mean_std && - error("""for within-species variation, at least 1 species must have at least 2 individuals. - did you mean to use option "y_mean_std=true" perhaps?""") - else - (!withinspecies_var || y_mean_std) && - error("""Some tips have data on multiple rows.""") - end - end - # Find the regression matrix and response vector - data, nonmissing = StatsModels.missing_omit(StatsModels.columntable(fr), f) - sch = StatsModels.schema(f, data) - f = StatsModels.apply_schema(f, sch, PhyloNetworkLinearModel) - mf = ModelFrame(f, sch, data, PhyloNetworkLinearModel) - mm = StatsModels.ModelMatrix(mf) - Y = StatsModels.response(mf) - - if withinspecies_var && y_mean_std - # find columns in data frame for: # of individuals from each species - colname = Symbol(String(mf.f.lhs.sym)*"_n") - any(DataFrames.propertynames(fr) .== colname) || - error("expected # of individuals in column $colname, but no such column was found") - counts = fr[nonmissing,colname] - all(!ismissing, counts) || error("some num_individuals values are missing, column $colname") - all(x -> x>0, counts) || error("some species have 0 or <0 num_individuals, column $colname") - all(isfinite.(counts))|| error("some species have infinite num_individuals, column $colname") - # find sample SDs corresponding to the response mean in each species - colname = Symbol(String(mf.f.lhs.sym)*"_sd") - any(DataFrames.propertynames(fr) .== colname) || - error("expected the response's SD (per species) in column $colname, but no such column was found") - ySD = fr[nonmissing,colname] - all(!ismissing, ySD) || error("some SD values are missing, column $colname") - all(x -> x≥0, ySD) || error("some SD values are negative, column $colname") - all(isfinite.(ySD))|| error("some SD values are infinite, column $colname") - else - counts = nothing - ySD = nothing - end - - withinspecies_var && model != "BM" && - error("within-species variation is not implemented for non-BM models") - modeldic = Dict("BM" => BM(), - "lambda" => PagelLambda(), - "scalingHybrid" => ScalingHybrid()) - haskey(modeldic, model) || error("phylolm is not defined for model $model.") - modelobj = modeldic[model] - - - res = phylolm(mm.m, Y, net, modelobj; reml=reml, nonmissing=nonmissing, ind=ind, - startingValue=startingValue, fixedValue=fixedValue, - withinspecies_var=withinspecies_var, counts=counts, ySD=ySD) - res.formula = f - return res -end - -### Methods on type phyloNetworkRegression - -## Un-changed Quantities -# Coefficients of the regression -StatsBase.coef(m::PhyloNetworkLinearModel) = coef(m.lm) -StatsBase.coefnames(m::PhyloNetworkLinearModel) = - (m.formula === nothing ? ["x$i" for i in 1:length(coef(m))] : coefnames(formula(m).rhs)) -StatsModels.formula(obj::PhyloNetworkLinearModel) = obj.formula - -""" - StatsBase.nobs(m::PhyloNetworkLinearModel) - -Number of observations: number of species with data, if the model assumes -known species means, and number of individuals with data, if the model -accounts for within-species variation. -""" -function StatsBase.nobs(m::PhyloNetworkLinearModel) - if isnothing(m.model_within) - return nobs(m.lm) - else - return sum(1.0 ./ m.model_within.wsp_ninv) - end -end - -""" - vcov(m::PhyloNetworkLinearModel) - -Return the variance-covariance matrix of the coefficient estimates. - -For the continuous trait evolutionary models currently implemented, species-level -mean response (conditional on the predictors), Y|X is modeled as: - -1. Y|X ∼ 𝒩(Xβ, σ²ₛV) for models assuming known species mean values (no within-species variation) -2. Y|X ∼ 𝒩(Xβ, σ²ₛV + σ²ₑD⁻¹) for models with information from multiple individuals - and assuming within-species variation - -The matrix V is inferred from the phylogeny, but may also depend on additional -parameters to be estimated (e.g. `lambda` for Pagel's Lambda model). See -[`ContinuousTraitEM`](@ref), [`PhyloNetworkLinearModel`](@ref) for more details. - -If (1), then return σ²ₛ(X'V⁻¹X)⁻¹, where σ²ₛ is estimated with REML, even if -the model was fitted with `reml=false`. -This follows the conventions of [`nlme::gls`](https://www.rdocumentation.org/packages/nlme/versions/3.1-152) -and [`stats::glm`](https://www.rdocumentation.org/packages/stats/versions/3.6.2) in R. - -If (2), then return σ²ₛ(X'W⁻¹X)⁻¹, where W = V+(σ²ₑ/σ²ₛ)D⁻¹ is estimated, and -σ²ₛ & σₑ are the estimates obtained with ML or REML, depending on the `reml` -option used to fit the model `m`. This follows the convention -of [`MixedModels.fit`](https://juliastats.org/MixedModels.jl/stable/) in Julia. -""" -function StatsBase.vcov(m::PhyloNetworkLinearModel) - # GLM.vcov(x::LinPredModel) = rmul!(invchol(x.pp), dispersion(x, true)) - # GLM.dispersion (sqrt=true): sqrt(sum of working residuals / dof_residual): forces "REML" - (isnothing(m.model_within) ? vcov(m.lm) : - rmul!(GLM.invchol(m.lm.pp), sigma2_phylo(m)) ) -end -""" - stderror(m::PhyloNetworkLinearModel) - -Return the standard errors of the coefficient estimates. See [`vcov`](@ref) -for related information on how these are computed. -""" -StatsBase.stderror(m::PhyloNetworkLinearModel) = sqrt.(diag(vcov(m))) -# confidence Intervals for coefficients: GLM uses normal quantiles -# Based on: https://github.com/JuliaStats/GLM.jl/blob/d1ccc9abcc9c7ca6f640c13ff535ee8383e8f808/src/lm.jl#L240-L243 -""" - confint(m::PhyloNetworkLinearModel; level::Real=0.95) - -Return confidence intervals for coefficients, with confidence level `level`, -based on the t-distribution whose degree of freedom is determined by the -number of species (as returned by `dof_residual`) -""" -function StatsBase.confint(m::PhyloNetworkLinearModel; level::Real=0.95) - hcat(coef(m),coef(m)) + stderror(m) * - quantile(TDist(dof_residual(m)), (1. - level)/2.) * [1. -1.] -end -# Table of estimated coefficients, standard errors, t-values, p-values, CIs -# Based on: https://github.com/JuliaStats/GLM.jl/blob/d1ccc9abcc9c7ca6f640c13ff535ee8383e8f808/src/lm.jl#L193-L203 -""" - coeftable(m::PhyloNetworkLinearModel; level::Real=0.95) - -Return coefficient estimates, standard errors, t-values, p-values, and t-intervals -as a `StatsBase.CoefTable`. -""" -function StatsBase.coeftable(m::PhyloNetworkLinearModel; level::Real=0.95) - n_coef = size(m.lm.pp.X, 2) # no. of predictors - if n_coef == 0 - return CoefTable([0], ["Fixed Value"], ["(Intercept)"]) - end - cc = coef(m) - se = stderror(m) - tt = cc ./ se - p = ccdf.(Ref(FDist(1, dof_residual(m))), abs2.(tt)) - ci = se*quantile(TDist(dof_residual(m)), (1-level)/2) - levstr = isinteger(level*100) ? string(Integer(level*100)) : string(level*100) - cn = StatsModels.vectorize(coefnames(m)) - CoefTable(hcat(cc,se,tt,p,cc+ci,cc-ci), - ["Coef.","Std. Error","t","Pr(>|t|)","Lower $levstr%","Upper $levstr%"], - cn, 4, 3) -end - -# degrees of freedom for residuals: at the species level, for coefficients of -# the phylogenetic regression, assuming known co-variance between species means. -# used for F and T degrees of freedom, instead of more conservative Z -StatsBase.dof_residual(m::PhyloNetworkLinearModel) = nobs(m.lm) - length(coef(m)) - -# degrees of freedom consumed by the species-level model -function StatsBase.dof(m::PhyloNetworkLinearModel) - res = length(coef(m)) + 1 # +1: phylogenetic variance - if any(typeof(m.evomodel) .== [PagelLambda, ScalingHybrid]) - res += 1 # lambda is one parameter - end - if !isnothing(m.model_within) - res += 1 # within-species variance - end - return res -end -""" - StatsBase.deviance(m::PhyloNetworkLinearModel) - --2 loglikelihood of the fitted model. See also [`loglikelihood`](@ref). - -Note: this is not the residual-sum-of-squares deviance as output by GLM, -such as one would get with `deviance(m.model)`. -""" -function StatsBase.deviance(m::PhyloNetworkLinearModel, ::Val{false}=Val(false)) - -2*loglikelihood(m) -end - -""" - StatsBase.deviance(m::PhyloNetworkLinearModel, Val(true)) - -Residual sum of squares with metric V, the estimated phylogenetic covariance, -if the model is appropriate. -""" -function StatsBase.deviance(m::PhyloNetworkLinearModel, ::Val{true}) - isnothing(m.model_within) || - error("deviance measured as SSR not implemented for within-species variation") - deviance(m.lm) -end - -## Changed Quantities -# Compute the residuals -# (Rescaled by cholesky of variance between tips) -StatsBase.residuals(m::PhyloNetworkLinearModel) = m.RL * residuals(m.lm) -# Tip data: m.Y is different from response(m.lm) -# and m.X is different from modelmatrix(m.lm) -StatsBase.response(m::PhyloNetworkLinearModel) = m.Y -StatsBase.modelmatrix(m::PhyloNetworkLinearModel) = m.X -# Predicted values at the tips -# (rescaled by cholesky of tips variances) -StatsBase.predict(m::PhyloNetworkLinearModel) = m.RL * predict(m.lm) - -# log likelihood of the fitted linear model -""" - loglikelihood(m::PhyloNetworkLinearModel) - -Log likelihood, or log restricted likelihood (REML), depending on `m.reml`. - -For models with no within-species variation, the likelihood (or REML) is -calculated based on the joint density for species-level mean responses. - -For within-species variation models, the likelihood is calculated based on the joint -density for individual-level responses. This can be calculated from individual-level -data, but also by providing species-level means and standard deviations which is -accepted by [`phylolm`](@ref). - -**Warning**: many summaries are based on the species-level model, like -"dof_residual", "residuals", "predict" or "deviance". -So `deviance` is innapropriate to compare models with within-species variation. -Use `loglikelihood` to compare models based on data at the individual level. - -Reminder: do not compare ML or REML values across models fit on different data. -Do not compare REML values across models that do not have the same predictors -(fixed effects): use ML instead, for that purpose. -""" -function StatsBase.loglikelihood(m::PhyloNetworkLinearModel) - linmod = m.lm - if isnothing(m.model_within) # not a msrerr model - n = (m.reml ? dof_residual(linmod) : nobs(linmod) ) - σ² = deviance(linmod)/n - ll = - n * (1. + log2π + log(σ²))/2 - m.logdetVy/2 - else # if msrerr model, return loglikelihood of individual-level data - modwsp = m.model_within - ntot = sum(1.0 ./ modwsp.wsp_ninv) # total number of individuals - nsp = nobs(linmod) # number of species - ncoef = length(coef(linmod)) - bdof = (m.reml ? nsp - ncoef : nsp ) - wdof = ntot - nsp - N = wdof + bdof # ntot or ntot - ncoef - σ² = modwsp.bsp_var[1] - σw² = modwsp.wsp_var[1] - ll = sum(log.(modwsp.wsp_ninv)) - - (N + N * log2π + bdof * log(σ²) + wdof * log(σw²) + m.logdetVy) - ll /= 2 - end - if m.reml - ll -= logdet(linmod.pp.chol)/2 # -1/2 log|X'Vm^{-1}X| - end - return ll -end - -# REMARK Not just the null deviance of the cholesky regression -# Might be something better to do than this, though. -""" - StatsBase.nulldeviance(m::PhyloNetworkLinearModel) - -For appropriate phylogenetic linear models, the deviance of the null model -is the total sum of square with respect to the metric V, -the estimated phylogenetic covariance matrix. -""" -function StatsBase.nulldeviance(m::PhyloNetworkLinearModel) - isnothing(m.model_within) || - error("""null loglik / deviance not implemented for within-species variation (mixed model): - please fit the model with an intercept only instead.""") - ro = response(m.lm) - if hasintercept(m) - vo = ones(length(m.Y), 1) - vo = m.RL \ vo - bo = inv(vo'*vo)*vo'*ro - ro = ro - vo*bo - end - return sum(ro.^2) -end -StatsModels.hasintercept(m::PhyloNetworkLinearModel) = any(i -> all(==(1), view(m.X , :, i)), 1:size(m.X, 2)) -# Null Log likelihood (null model with only the intercept) -# Same remark -function StatsBase.nullloglikelihood(m::PhyloNetworkLinearModel) - nulldev = nulldeviance(m) # error & exit if within-species variation - m.reml && @warn "ML null loglik: do not compare with REML on model with predictors" - n = length(m.Y) - return -n/2 * (log(2*pi * nulldev/n) + 1) - 1/2 * m.logdetVy -end -# coefficient of determination (1 - SS_res/SS_null) -# Copied from GLM.jl/src/lm.jl, line 139 -function StatsBase.r2(m::PhyloNetworkLinearModel) - isnothing(m.model_within) || - error("r2 and adjusted r2 not implemented for within-species variation (mixed model)") - 1 - deviance(m, Val(true))/nulldeviance(m) -end -# adjusted coefficient of determination -# in GLM.jl/src/lm.jl: p = dof-1 and dof(x::LinearModel) = length(coef(x))+1, +1 for the dispersion parameter -function StatsBase.adjr2(obj::PhyloNetworkLinearModel) - n = nobs(obj) - # dof() includes the dispersion parameter sigma2, and lambda if relevant - p = dof(obj)-1 # like in GLM - # one could argue to use this: p = length(coef(obj)), to ignore lambda or other parameters - 1 - (1 - r2(obj))*(n-1)/(n-p) -end - -## REMARK -# As PhyloNetworkLinearModel <: GLM.LinPredModel, the following functions are automatically defined: -# aic, aicc, bic - -## New quantities -# ML estimate for variance of the BM -""" - sigma2_phylo(m::PhyloNetworkLinearModel) - -Estimated between-species variance-rate for a fitted object. -""" -function sigma2_phylo(m::PhyloNetworkLinearModel) - linmod = m.lm - if isnothing(m.model_within) - n = (m.reml ? dof_residual(linmod) : nobs(linmod) ) - σ² = deviance(linmod)/n - else - σ² = m.model_within.bsp_var[1] - end - return σ² -end - -""" - sigma2_within(m::PhyloNetworkLinearModel) - -Estimated within-species variance for a fitted object. -""" -sigma2_within(m::PhyloNetworkLinearModel) = (isnothing(m.model_within) ? nothing : m.model_within.wsp_var[1]) -# ML estimate for ancestral state of the BM -""" - mu_phylo(m::PhyloNetworkLinearModel) - -Estimated root value for a fitted object. -""" -function mu_phylo(m::PhyloNetworkLinearModel) - if m.formula === nothing - @warn """You fitted the data against a custom matrix, so I have no way - to know which column is your intercept (column of ones). - I am using the first coefficient for ancestral mean mu by convention, - but that might not be what you are looking for.""" - size(m.lm.pp.X,2) == 0 && return 0 - elseif m.formula.rhs.terms[1] != StatsModels.InterceptTerm{true}() - error("The fit was done without intercept, so I cannot estimate mu") - end - return coef(m)[1] -end - -""" - lambda(m::PhyloNetworkLinearModel) - lambda(m::ContinuousTraitEM) - -Value assigned to the lambda parameter, if appropriate. -""" -lambda(m::PhyloNetworkLinearModel) = lambda(m.evomodel) -lambda(m::Union{BM,PagelLambda,ScalingHybrid}) = m.lambda - -""" - lambda!(m::PhyloNetworkLinearModel, newlambda) - lambda!(m::ContinuousTraitEM, newlambda) - -Assign a new value to the lambda parameter. -""" -lambda!(m::PhyloNetworkLinearModel, lambda_new) = lambda!(m.evomodel, lambda_new) -lambda!(m::Union{BM,PagelLambda,ScalingHybrid}, lambda_new::Real) = (m.lambda = lambda_new) - -""" - lambda_estim(m::PhyloNetworkLinearModel) - -Estimated lambda parameter for a fitted object. -""" -lambda_estim(m::PhyloNetworkLinearModel) = lambda(m) - -### Print the results -# Variance -function paramstable(m::PhyloNetworkLinearModel) - Sig = sigma2_phylo(m) - res = "phylogenetic variance rate: " * @sprintf("%.6g", Sig) - if any(typeof(m.evomodel) .== [PagelLambda, ScalingHybrid]) - Lamb = lambda_estim(m) - res = res*"\nLambda: " * @sprintf("%.6g", Lamb) - end - mw = m.model_within - if !isnothing(mw) - res = res*"\nwithin-species variance: " * @sprintf("%.6g", mw.wsp_var[1]) - end - return(res) -end -# For DataFrameModel. see also Base.show in -# https://github.com/JuliaStats/StatsModels.jl/blob/master/src/statsmodel.jl -function Base.show(io::IO, obj::PhyloNetworkLinearModel) - ct = coeftable(obj) - println(io, "$(typeof(obj))") - if !(obj.formula === nothing) - print(io, "\nFormula: ") - println(io, string(obj.formula)) # formula - end - println(io) - println(io, "Model: $(evomodelname(obj.evomodel))") - println(io) - println(io,"Parameter Estimates, using ", (obj.reml ? "REML" : "ML"),":") - println(io, paramstable(obj)) - println(io) - println(io,"Coefficients:") - show(io, ct) - println(io) - println(io, "Log Likelihood: "*"$(round(loglikelihood(obj), digits=10))") - println(io, "AIC: "*"$(round(aic(obj), digits=10))") -end - -############################################################################### -# within-species variation (including measurement error) -############################################################################### - -function phylolm_wsp(::BM, X::Matrix, Y::Vector, net::HybridNetwork, reml::Bool; - nonmissing=trues(length(Y))::BitArray{1}, # which individuals have non-missing data? - ind=[0]::Vector{Int}, - counts::Union{Nothing, Vector}=nothing, - ySD::Union{Nothing, Vector}=nothing) - V = sharedPathMatrix(net) - phylolm_wsp(X,Y,V, reml, nonmissing,ind, counts,ySD) -end - -#= notes about missing data: after X and Y produced by stat formula: -- individuals with missing data (in response or any predictor) - already removed from both X and Y -- V has all species: some not listed, some listed but without any data -- nonmissing and ind correspond to the original rows in the data frame, - including those with some missing data, so: - * nonmissing has length >= length of Y - * sum(nonmissing) = length of Y -- V[:Tips][ind,ind][nonmissing,nonmissing] correspond to the data rows - -extra problems: -- a species may be listed 1+ times in ind, but not in ind[nonmissing] -- ind and nonmissing need to be converted to the species level, alongside Y -=# -function phylolm_wsp(X::Matrix, Y::Vector, V::MatrixTopologicalOrder, - reml::Bool, nonmissing::BitArray{1}, ind::Vector{Int}, - counts::Union{Nothing, Vector}, - ySD::Union{Nothing, Vector}) - n_coef = size(X, 2) # no. of predictors - individualdata = isnothing(counts) - xor(individualdata, isnothing(ySD)) && - error("counts and ySD must be both nothing, or both vectors") - if individualdata - # get species means for Y and X, the within-species residual ss - ind_nm = ind[nonmissing] # same length as Y - ind_sp = unique(ind_nm) - n_sp = length(ind_sp) # number of species with data - n_tot = length(Y) # total number of individuals with data - d_inv = zeros(n_sp) - Ysp = Vector{Float64}(undef,n_sp) # species-level mean Y response - Xsp = Matrix{Float64}(undef,n_sp,n_coef) - RSS = 0.0 # residual sum-of-squares within-species - for (i0,iV) in enumerate(ind_sp) - iii = findall(isequal(iV), ind_nm) - n_i = length(iii) # number of obs for species of index iV in V - d_inv[i0] = 1/n_i - Xsp[i0, :] = mean(X[iii, :], dims=1) # ideally, all have same Xs - ymean = mean(Y[iii]) - Ysp[i0] = ymean - RSS += sum((Y[iii] .- ymean).^2) - end - Vsp = V[:Tips][ind_sp,ind_sp] - # redefine "ind" and "nonmissing" at species level. ind = index of species - # in tipLabels(net), in same order in which species come in means Ysp. - # nonmissing: no need to list species with no data - ind = ind_sp - nonmissing = trues(n_sp) - else # group means and sds for response variable were passed in - n_sp = length(Y) - n_tot = sum(counts) - d_inv = 1.0 ./ counts - Ysp = Y - Xsp = X - RSS = sum((ySD .^ 2) .* (counts .- 1.0)) - ind_nm = ind[nonmissing] - Vsp = V[:Tips][ind_nm,ind_nm] - end - - model_within, RL = withinsp_varianceratio(Xsp,Ysp,Vsp, reml, d_inv,RSS, - n_tot,n_coef,n_sp) - η = model_within.optsum.final[1] - Vm = Vsp + η * Diagonal(d_inv) - m = PhyloNetworkLinearModel(lm(RL\Xsp, RL\Ysp), V, Vm, RL, Ysp, Xsp, - 2*logdet(RL), reml, ind, nonmissing, BM(), model_within) - return m -end - -# the method below takes in "clean" X,Y,V: species-level means, no missing data, -# matching order of species in X,Y and V, no extra species in V. -# given V & η: analytical formula for σ² estimate -# numerical optimization of η = σ²within / σ² -function withinsp_varianceratio(X::Matrix, Y::Vector, V::Matrix, reml::Bool, - d_inv::Vector, RSS::Float64, ntot::Real, ncoef::Int64, nsp::Int64, - model_within::Union{Nothing, WithinSpeciesCTM}=nothing) - - RL = cholesky(V).L - lm_sp = lm(RL\X, RL\Y) - if model_within === nothing - # create model_within with good starting values - s2start = GLM.dispersion(lm_sp, false) # sqr=false: deviance/dof_residual - # this is the REML, not ML estimate, which would be deviance/nobs - s2withinstart = RSS/(ntot-nsp) - ηstart = s2withinstart / s2start - optsum = OptSummary([ηstart], [1e-100], :LN_BOBYQA; initial_step=[0.01], - ftol_rel=fRelTr, ftol_abs=fAbsTr, xtol_rel=xRelTr, xtol_abs=[xAbsTr]) - optsum.maxfeval = 1000 - model_within = WithinSpeciesCTM([s2withinstart], [s2start], d_inv, RSS, optsum) - else - optsum = model_within.optsum - # fixit: I find this option dangerous (and not used). what if the - # current optsum has 2 parameters instead of 1, or innapropriate bounds, etc.? - # We could remove the option to provide a pre-built model_within - end - opt = Opt(optsum) - Ndof = (reml ? ntot - ncoef : ntot ) - wdof = ntot - nsp - Vm = similar(V) # scratch space for repeated usage - function logliksigma(η) # returns: -2loglik, estimated sigma2, and more - Vm .= V + η * Diagonal(d_inv) - Vmchol = cholesky(Vm) # LL' = Vm - RL = Vmchol.L - lm_sp = lm(RL\X, RL\Y) - σ² = (RSS/η + deviance(lm_sp))/Ndof - # n2ll = -2 loglik except for Ndof*log(2pi) + sum log(di) + Ndof - n2ll = Ndof * log(σ²) + wdof * log(η) + logdet(Vmchol) - if reml - n2ll += logdet(lm_sp.pp.chol) # log|X'Vm^{-1}X| - end - #= manual calculations without cholesky - Q = X'*(Vm\X); β = Q\(X'*(Vm\Ysp)); r = Y-X*β - val = Ndof*log(σ²) + ((RSS/η) + r'*(Vm\r))/σ² + - (ntot-ncoef)*log(η) + logabsdet(Vm)[1] + logabsdet(Q)[1] - =# - return (n2ll, σ², Vmchol) - end - obj(x, g) = logliksigma(x[1])[1] # x = [η] - NLopt.min_objective!(opt, obj) - fmin, xmin, ret = NLopt.optimize(opt, optsum.initial) - optsum.feval = opt.numevals - optsum.final = xmin - optsum.fmin = fmin - optsum.returnvalue = ret - # save the results - η = xmin[1] - (n2ll, σ², Vmchol) = logliksigma(η) - model_within.wsp_var[1] = η*σ² - model_within.bsp_var[1] = σ² - return model_within, Vmchol.L -end - -############################################################################### -#= Model comparisons - -isnested: borrowed from GLM.issubmodel (as of commit 504e5186c87) -https://github.com/JuliaStats/GLM.jl/blob/master/src/ftest.jl#L11 -To avoid comparing the coefnames and to be less restrictive, we compare the -design matrices. For example: Xsmall = [x1-x2 x1-x3] is nested in Xbig = [x1 x2 x3]. -We check that there exists B such that Xsmall = Xbig * B, or rather, that -min_B norm(Xbig*B - Xsmall) ≈ 0 . For the math of this minimization problem, -see https://github.com/JuliaStats/GLM.jl/pull/197#issuecomment-331136617 - -When isnested() exists in GLM, check to see if we should improve further. -=# -""" - isnested(m1::PhyloNetworkLinearModel, m2::PhyloNetworkLinearModel) - isnested(m1::ContinuousTraitEM, m2::ContinuousTraitEM) - -True if `m1` is nested in `m2`, false otherwise. -Models fitted with different criteria (ML and REML) are not nested. -Models with different predictors (fixed effects) must be fitted with ML to be -considered nested. -""" -function StatsModels.isnested(m1m::PhyloNetworkLinearModel, m2m::PhyloNetworkLinearModel; atol::Real=0.0) - if !(nobs(m1m) ≈ nobs(m2m)) - @error "Models must have the same number of observations" - return false - end - # exact same response? (before phylogenetic transformation) - if m1m.Y != m2m.Y - @error "Models must fit the same response" - return false - end - # same criterion? - if xor(m1m.reml, m2m.reml) - @error "Models must be fitted with same criterion (both ML or both REML)" - return false - end - # same within-species variation? e.g. same assumption of species means - # this check should be useless, because same Y so same # species, and same - # nobs so same # individuals. But 1 ind/species w/o within-species variation, - # and at least 1 species with 2+ inds/species w/ within-species variation. - xor(isnothing(m1m.model_within), isnothing(m2m.model_within)) && return false - # nesting of fixed effects: is X1 = X2*B for some B? - X1 = m1m.X - np1 = size(X1, 2) - X2 = m2m.X - np2 = size(X2, 2) - np1 > np2 && return false # if X1 has more predictors, can't be nested in X2 - # is mininum_B norm X2*B - X1 ≈ 0 ? - rtol = Base.rtoldefault(eltype(X1)) - norm(view(qr(X2).Q' * X1, np2 + 1:size(X2,1), :)) < max(atol, rtol*norm(X1)) || - return false - # ML (not REML) if different fixed effects - sameFE = (X1 == X2) # exact equality okay here - if !sameFE && (m1m.reml || m2m.reml) - @error "Models should be fitted with ML to do a likelihood ratio test with different predictors" - return false - end - # nesting of phylogenetic variance models - return isnested(m1m.evomodel, m2m.evomodel) -end - -isnested(::T,::T) where T <: ContinuousTraitEM = true -isnested(::BM,::Union{PagelLambda,ScalingHybrid}) = true -isnested(::Union{PagelLambda,ScalingHybrid}, ::BM) = false -isnested(::ScalingHybrid,::PagelLambda) = false -isnested(::PagelLambda,::ScalingHybrid) = false - -#= ANOVA using ftest from GLM - need version 0.8.1 - As of GLM v1.8, ftest throws a warning on typical BM models, one per model: - "Starting from GLM.jl 1.8, null model is defined as having no predictor at all when a model without an intercept is passed." - This is because after transforming the data to de-correlate the residuals, - the transformed intercept vector is not proportional to the constant vector 1. - The warning is from: ftest → r2(phylomodel.lm) → nulldeviance(phylomodel.lm) → warning. - R² by GLM is wrong: assume *no* intercept, and are based on the transformed data. - R² corrected them below: r2(phylomodel) reimplemented here. - But nulldeviance(phylomodel) does *not* call nulldeviance(phylomodel.lm), - instead re-implemented here to use the intercept properly. - Keep the warnings: unless they can be suppressed with specificity - Ideally: modify `ftest` here or in GLM. -=# -function GLM.ftest(objs::PhyloNetworkLinearModel...) - if !all( isa(o.evomodel,BM) && isnothing(o.model_within) for o in objs) - throw(ArgumentError("""F test is only valid for the vanilla BM model. - Use a likelihood ratio test instead with function `lrtest`.""")) - end - objslm = [obj.lm for obj in objs] - resGLM = ftest(objslm...) - resGLM.r2 = r2.(objs) - return resGLM -end -## ANOVA: old version - kept for tests purposes - do not export -""" - anova(objs::PhyloNetworkLinearModel...) - -Takes several nested fits of the same data, and computes the F statistic for each -pair of models. - -The fits must be results of function [`phylolm`](@ref) called on the same -data, for models that have more and more effects. - -Returns a DataFrame object with the anova table. -""" -function anova(objs::PhyloNetworkLinearModel...) - anovaTable = Array{Any}(undef, length(objs)-1, 6) - ## Compute binary statistics - for i in 1:(length(objs) - 1) - anovaTable[i, :] = anovaBin(objs[i], objs[i+1]) - end - ## Transform into a DataFrame - anovaTable = DataFrame(anovaTable, - [:dof_res, :RSS, :dof, :SS, :F, Symbol("Pr(>F)")]) - return(anovaTable) -end - -function anovaBin(obj1::PhyloNetworkLinearModel, obj2::PhyloNetworkLinearModel) - length(coef(obj1)) < length(coef(obj2)) || error("Models must be nested, from the smallest to the largest.") - ## residuals - dof2 = dof_residual(obj2) - dev2 = deviance(obj2, Val(true)) - ## reducted residuals - dof1 = dof_residual(obj1) - dof2 - dev1 = deviance(obj1, Val(true)) - dev2 - ## Compute statistic - F = (dev1 / dof1) / (dev2 / dof2) - pval = GLM.ccdf.(GLM.FDist(dof1, dof2), F) # ccdf and FDist from Distributions, used by GLM - return([dof2, dev2, dof1, dev1, F, pval]) -end - -############################################################################### -## Ancestral State Reconstruction -############################################################################### -""" - ReconstructedStates - -Type containing the inferred information about the law of the ancestral states -given the observed tips values. The missing tips are considered as ancestral states. - -The following functions can be applied to it: -[`expectations`](@ref) (vector of expectations at all nodes), `stderror` (the standard error), -`predint` (the prediction interval). - -The `ReconstructedStates` object has fields: `traits_nodes`, `variances_nodes`, `NodeNumbers`, `traits_tips`, `tipNumbers`, `model`. -Type in "?ReconstructedStates.field" to get help on a specific field. -""" -struct ReconstructedStates - "traits_nodes: the infered expectation of 'missing' values (ancestral nodes and missing tips)" - traits_nodes::Vector # Nodes are actually "missing" data (including tips) - "variances_nodes: the variance covariance matrix between all the 'missing' nodes" - variances_nodes::Matrix - "NodeNumbers: vector of the nodes numbers, in the same order as `traits_nodes`" - NodeNumbers::Vector{Int} - "traits_tips: the observed traits values at the tips" - traits_tips::Vector # Observed values at tips - "TipNumbers: vector of tips numbers, in the same order as `traits_tips`" - TipNumbers::Vector # Observed tips only - "model: if not missing, the `PhyloNetworkLinearModel` used for the computations." - model::Union{PhyloNetworkLinearModel, Missing} # if empirical, corresponding fitted object -end - -""" - expectations(obj::ReconstructedStates) - -Estimated reconstructed states at the nodes and tips. -""" -function expectations(obj::ReconstructedStates) - return DataFrame(nodeNumber = [obj.NodeNumbers; obj.TipNumbers], condExpectation = [obj.traits_nodes; obj.traits_tips]) -end - -""" - expectationsPlot(obj::ReconstructedStates) - -Compute and format the expected reconstructed states for the plotting function. -The resulting dataframe can be readily used as a `nodelabel` argument to -`plot` from package [`PhyloPlots`](https://github.com/juliaphylo/PhyloPlots.jl). -Keyword argument `markMissing` is a string that is appended to predicted -tip values, so that they can be distinguished from the actual datapoints. Default to -"*". Set to "" to remove any visual cue. -""" -function expectationsPlot(obj::ReconstructedStates; markMissing="*"::AbstractString) - # Retrieve values - expe = expectations(obj) - # Format values for plot - expetxt = Array{AbstractString}(undef, size(expe, 1)) - for i=1:size(expe, 1) - expetxt[i] = string(round(expe[i, 2], digits=2)) - end - # find tips absent from dataframe or with missing data: add a mark - if !ismissing(obj.model) - nonmissing = obj.model.nonmissing - ind = obj.model.ind - tipnumbers = obj.model.V.tipNumbers # all tips, even those absent from dataframe - tipnumbers_data = tipnumbers[ind][nonmissing] # listed and data non-missing - tipnumbers_imputed = setdiff(tipnumbers, tipnumbers_data) - indexMissing = indexin(tipnumbers_imputed, expe[!,:nodeNumber]) - expetxt[indexMissing] .*= markMissing - end - return DataFrame(nodeNumber = [obj.NodeNumbers; obj.TipNumbers], PredInt = expetxt) -end - -StatsBase.stderror(obj::ReconstructedStates) = sqrt.(diag(obj.variances_nodes)) - -""" - predint(obj::ReconstructedStates; level=0.95::Real) - -Prediction intervals with level `level` for internal nodes and missing tips. -""" -function predint(obj::ReconstructedStates; level=0.95::Real) - if ismissing(obj.model) - qq = quantile(Normal(), (1. - level)/2.) - else - qq = quantile(GLM.TDist(dof_residual(obj.model)), (1. - level)/2.) # TDist from Distributions - # @warn "As the variance is estimated, the predictions intervals are not exact, and should probably be larger." - end - tmpnode = hcat(obj.traits_nodes, obj.traits_nodes) .+ (stderror(obj) * qq) .* [1. -1.] - return vcat(tmpnode, hcat(obj.traits_tips, obj.traits_tips)) -end - -function Base.show(io::IO, obj::ReconstructedStates) - println(io, "$(typeof(obj)):\n", - CoefTable(hcat(vcat(obj.NodeNumbers, obj.TipNumbers), vcat(obj.traits_nodes, obj.traits_tips), predint(obj)), - ["Node index", "Pred.", "Min.", "Max. (95%)"], - fill("", length(obj.NodeNumbers)+length(obj.TipNumbers)))) -end - -""" - predintPlot(obj::ReconstructedStates; level=0.95::Real, withExp=false::Bool) - -Compute and format the prediction intervals for the plotting function. -The resulting dataframe can be readily used as a `nodelabel` argument to -`plot` from package [`PhyloPlots`](https://github.com/juliaphylo/PhyloPlots.jl). -Keyworks argument `level` control the confidence level of the -prediction interval. If `withExp` is set to true, then the best -predicted value is also shown along with the interval. -""" -function predintPlot(obj::ReconstructedStates; level=0.95::Real, withExp=false::Bool) - # predInt - pri = predint(obj; level=level) - pritxt = Array{AbstractString}(undef, size(pri, 1)) - # Exp - withExp ? exptxt = expectationsPlot(obj, markMissing="") : exptxt = "" - for i=1:length(obj.NodeNumbers) - !withExp ? sep = ", " : sep = "; " * exptxt[i, 2] * "; " - pritxt[i] = "[" * string(round(pri[i, 1], digits=2)) * sep * string(round(pri[i, 2], digits=2)) * "]" - end - for i=(length(obj.NodeNumbers)+1):size(pri, 1) - pritxt[i] = string(round(pri[i, 1], digits=2)) - end - return DataFrame(nodeNumber = [obj.NodeNumbers; obj.TipNumbers], PredInt = pritxt) -end - -#= ----- roadmap of ancestralStateReconstruction, continuous traits ------ - -all methods return a ReconstructedStates object. -core method called by every other method: - -1. ancestralStateReconstruction(Vzz, VzyVyinvchol, RL, Y, m_y, m_z, - NodeNumbers, TipNumbers, sigma2, add_var, model) - -higher-level methods, for real data: - -2. ancestralStateReconstruction(dataframe, net; tipnames=:tipNames, kwargs...) - - dataframe: 2 columns only, species names & tip response values - - fits an intercept-only model, then calls #3 - - by default without kwargs: model = BM w/o within-species variation - -3. ancestralStateReconstruction(PhyloNetworkLinearModel[, Matrix]) - - takes a model already fitted - - if no matrix given: the model must be intercept-only. An expanded intercept - column is created with length = # nodes with *no* data - - matrix: if given, must have same # of columns as the model matrix, and - must contain the predictor(s) at nodes with *no* data, with nodes listed in - the following order: - * internal nodes first, in the same order in which they appear in net.node, - i.e in V.internalNodeNumbers - * then leaves with no data, in the same order in which they appear in - tipLabels(net), i.e. in V.tipNumbers. - - extracts the predicted values for all network nodes, and the unscaled - 3 covariance matrices of interest (nodes with data, nodes w/o, crossed) - - computes "universal" kriging (as opposed to "simple" kriging, which would - simply plug-in estimates into the prediction variance formula): a term is - added to the prediction variance, to account for the estimation of β. - -methods based on simulations with a ParamsProcess "params": - -4. ancestralStateReconstruction(net, Y, params) which calls: - ancestralStateReconstruction(V::MatrixTopologicalOrder, Y, params) - - intercept-only: known β and known variance: "simple" kriging is correct - - BM only: params must be of type ParamsBM -=# - -""" - ancestralStateReconstruction(net::HybridNetwork, Y::Vector, params::ParamsBM) - -Compute the conditional expectations and variances of the ancestral (un-observed) -traits values at the internal nodes of the phylogenetic network (`net`), -given the values of the traits at the tips of the network (`Y`) and some -known parameters of the process used for trait evolution (`params`, only BM with fixed root -works for now). - -This function assumes that the parameters of the process are known. For a more general -function, see `ancestralStateReconstruction(obj::PhyloNetworkLinearModel[, X_n::Matrix])`. - -""" -function ancestralStateReconstruction(net::HybridNetwork, - Y::Vector, - params::ParamsBM) - V = sharedPathMatrix(net) - ancestralStateReconstruction(V, Y, params) -end - -function ancestralStateReconstruction(V::MatrixTopologicalOrder, - Y::Vector, - params::ParamsBM) - # Variances matrices - Vy = V[:Tips] - Vz = V[:InternalNodes] - Vyz = V[:TipsNodes] - R = cholesky(Vy) - RL = R.L - VzyVyinvchol = (RL \ Vyz)' - # Vectors of means - m_y = ones(size(Vy)[1]) .* params.mu # !! correct only if no predictor. - m_z = ones(size(Vz)[1]) .* params.mu # !! works if BM no shift. - # Actual computation - ancestralStateReconstruction(Vz, VzyVyinvchol, RL, - Y, m_y, m_z, - V.internalNodeNumbers, - V.tipNumbers, - params.sigma2) -end - -# Reconstruction from all the needed quantities -function ancestralStateReconstruction(Vz::Matrix, - VzyVyinvchol::AbstractMatrix, - RL::LowerTriangular, - Y::Vector, m_y::Vector, m_z::Vector, - NodeNumbers::Vector, TipNumbers::Vector, - sigma2::Real, - add_var=zeros(size(Vz))::Matrix, # Additional variance for BLUP - model=missing::Union{PhyloNetworkLinearModel,Missing}) - # E[z∣y] = E[z∣X] + Cov(z,y)⋅Var(y)⁻¹⋅(y-E[y∣X]) - m_z_cond_y = m_z + VzyVyinvchol * (RL \ (Y - m_y)) - V_z_cond_y = sigma2 .* (Vz - VzyVyinvchol * VzyVyinvchol') - if !ismissing(model) && !isnothing(model.model_within) # y = last part of z - Y = similar(Y, 0) # empty vector of similar type as Y - end - ReconstructedStates(m_z_cond_y, V_z_cond_y + add_var, NodeNumbers, Y, TipNumbers, model) -end - -#= from a fitted object: see high-level docstring below -X_n: matrix with as many columns as the number of predictors used, - and as many rows as the number of unknown nodes or tips. - -TO DO: Handle the order of internal nodes and no-data tips for matrix X_n -=# -function ancestralStateReconstruction(obj::PhyloNetworkLinearModel, X_n::Matrix) - if (size(X_n)[2] != length(coef(obj))) - error("""The number of predictors for the ancestral states (number of columns of X_n) - does not match the number of predictors at the tips.""") - end - if size(X_n)[1] != length(obj.V.internalNodeNumbers) + length(obj.V.tipNumbers)-length(obj.ind) + sum(.!obj.nonmissing) - error("""The number of lines of the predictors does not match - the number of nodes plus the number of missing tips.""") - end - #= y: observed species means at some tips - z: trait (true species mean) at nodes to be predicted: - - at nodes without data, i.e. internal nodes & no-data tips - - at tips with data if within-species variation: y=ytrue+ϵ - Vy,y = Vy,ytrue = Vytrue,y and Vytrue,z = Vyz - =# - m_y = predict(obj) - m_z = X_n * coef(obj) - # If the tips were re-organized, do the same for Vyz - if obj.ind == [0] - @warn """There were no indication for the position of the tips on the network. - I am assuming that they are given in the same order. - Please check that this is what you intended.""" - ind = collect(1:length(obj.V.tipNumbers)) - else - ind = obj.ind - end - # Vyz: sharedpath. rows y: tips w/ data. cols z: internal nodes & tips w/o data - Vyz = obj.V[:TipsNodes, ind, obj.nonmissing] - Vzz = obj.V[:InternalNodes, ind, obj.nonmissing] - nmTipNumbers = obj.V.tipNumbers[ind][obj.nonmissing] # tips w/ data - # no-data node numbers: for nodes (internal or tips) with no data - ndNodeNumbers = [obj.V.internalNodeNumbers; setdiff(obj.V.tipNumbers, nmTipNumbers)] - if !isnothing(obj.model_within) # add tips with data to z - Vtips = obj.V[:Tips, ind, obj.nonmissing] - Vzz = [Vzz Vyz'; Vyz Vtips] - Vyz = [Vyz Vtips] - append!(m_z, m_y) - append!(ndNodeNumbers, nmTipNumbers) - empty!(nmTipNumbers) - X_n = vcat(X_n, obj.X) - end - VzyVyinvchol = (obj.RL \ Vyz)' - # add_var = zeros corresponds to "simple" kriging: E[Y∣X]=Xβ with known β & variance components - # below: "universal" kriging: β estimated, variance components known - U = X_n - VzyVyinvchol * (obj.RL \ obj.X) - add_var = U * vcov(obj) * U' - @warn """These prediction intervals show uncertainty in ancestral values, - assuming that the estimated variance rate of evolution is correct. - Additional uncertainty in the estimation of this variance rate is - ignored, so prediction intervals should be larger.""" - # Actual reconstruction - ancestralStateReconstruction(Vzz, - VzyVyinvchol, - obj.RL, - obj.Y, - m_y, - m_z, - ndNodeNumbers, - nmTipNumbers, - sigma2_phylo(obj), - add_var, - obj) -end - -@doc raw""" - ancestralStateReconstruction(obj::PhyloNetworkLinearModel[, X_n::Matrix]) - -Function to find the ancestral traits reconstruction on a network, given an -object fitted by function [`phylolm`](@ref). By default, the function assumes -that the regressor is just an intercept. If the value of the regressor for -all the ancestral states is known, it can be entered in X_n, a matrix with as -many columns as the number of predictors used, and as many lines as the number -of unknown nodes or tips. - -Returns an object of type [`ReconstructedStates`](@ref). - -# Examples - -```jldoctest; filter = [r" PhyloNetworks .*:\d+", ] -julia> using DataFrames, CSV # to read data file - -julia> phy = readTopology(joinpath(dirname(pathof(PhyloNetworks)), "..", "examples", "carnivores_tree.txt")); - -julia> dat = CSV.File(joinpath(dirname(pathof(PhyloNetworks)), "..", "examples", "carnivores_trait.txt")) |> DataFrame; - -julia> using StatsModels # for statistical model formulas - -julia> fitBM = phylolm(@formula(trait ~ 1), dat, phy); - -julia> ancStates = ancestralStateReconstruction(fitBM) # Should produce a warning, as variance is unknown. -┌ Warning: These prediction intervals show uncertainty in ancestral values, -│ assuming that the estimated variance rate of evolution is correct. -│ Additional uncertainty in the estimation of this variance rate is -│ ignored, so prediction intervals should be larger. -└ @ PhyloNetworks ~/build/juliaphylo/PhyloNetworks.jl/src/traits.jl:3359 -ReconstructedStates: -─────────────────────────────────────────────── - Node index Pred. Min. Max. (95%) -─────────────────────────────────────────────── - -5.0 1.32139 -0.33824 2.98102 - -8.0 1.03258 -0.589695 2.65485 - -7.0 1.41575 -0.140705 2.97221 - -6.0 1.39417 -0.107433 2.89577 - -4.0 1.39961 -0.102501 2.90171 - -3.0 1.51341 -0.220523 3.24733 - -13.0 5.3192 3.92279 6.71561 - -12.0 4.51176 2.89222 6.13131 - -16.0 1.50947 -0.0186118 3.03755 - -15.0 1.67425 0.196069 3.15242 - -14.0 1.80309 0.309992 3.29618 - -11.0 2.7351 1.17608 4.29412 - -10.0 2.73217 1.12361 4.34073 - -9.0 2.41132 0.603932 4.21871 - -2.0 2.04138 -0.0340955 4.11686 - 14.0 1.64289 1.64289 1.64289 - 8.0 1.67724 1.67724 1.67724 - 5.0 0.331568 0.331568 0.331568 - 2.0 2.27395 2.27395 2.27395 - 4.0 0.275237 0.275237 0.275237 - 6.0 3.39094 3.39094 3.39094 - 13.0 0.355799 0.355799 0.355799 - 15.0 0.542565 0.542565 0.542565 - 7.0 0.773436 0.773436 0.773436 - 10.0 6.94985 6.94985 6.94985 - 11.0 4.78323 4.78323 4.78323 - 12.0 5.33016 5.33016 5.33016 - 1.0 -0.122604 -0.122604 -0.122604 - 16.0 0.73989 0.73989 0.73989 - 9.0 4.84236 4.84236 4.84236 - 3.0 1.0695 1.0695 1.0695 -─────────────────────────────────────────────── - -julia> expectations(ancStates) -31×2 DataFrame - Row │ nodeNumber condExpectation - │ Int64 Float64 -─────┼───────────────────────────── - 1 │ -5 1.32139 - 2 │ -8 1.03258 - 3 │ -7 1.41575 - 4 │ -6 1.39417 - 5 │ -4 1.39961 - 6 │ -3 1.51341 - 7 │ -13 5.3192 - 8 │ -12 4.51176 - ⋮ │ ⋮ ⋮ - 25 │ 10 6.94985 - 26 │ 11 4.78323 - 27 │ 12 5.33016 - 28 │ 1 -0.122604 - 29 │ 16 0.73989 - 30 │ 9 4.84236 - 31 │ 3 1.0695 - 16 rows omitted - -julia> predint(ancStates) -31×2 Matrix{Float64}: - -0.33824 2.98102 - -0.589695 2.65485 - -0.140705 2.97221 - -0.107433 2.89577 - -0.102501 2.90171 - -0.220523 3.24733 - 3.92279 6.71561 - 2.89222 6.13131 - -0.0186118 3.03755 - 0.196069 3.15242 - ⋮ - 0.542565 0.542565 - 0.773436 0.773436 - 6.94985 6.94985 - 4.78323 4.78323 - 5.33016 5.33016 - -0.122604 -0.122604 - 0.73989 0.73989 - 4.84236 4.84236 - 1.0695 1.0695 - -julia> expectationsPlot(ancStates) # format the ancestral states -31×2 DataFrame - Row │ nodeNumber PredInt - │ Int64 Abstract… -─────┼─────────────────────── - 1 │ -5 1.32 - 2 │ -8 1.03 - 3 │ -7 1.42 - 4 │ -6 1.39 - 5 │ -4 1.4 - 6 │ -3 1.51 - 7 │ -13 5.32 - 8 │ -12 4.51 - ⋮ │ ⋮ ⋮ - 25 │ 10 6.95 - 26 │ 11 4.78 - 27 │ 12 5.33 - 28 │ 1 -0.12 - 29 │ 16 0.74 - 30 │ 9 4.84 - 31 │ 3 1.07 - 16 rows omitted - -julia> using PhyloPlots # next: plot ancestral states on the tree - -julia> plot(phy, nodelabel = expectationsPlot(ancStates)); - -julia> predintPlot(ancStates) # prediction intervals, in data frame, useful to plot -31×2 DataFrame - Row │ nodeNumber PredInt - │ Int64 Abstract… -─────┼─────────────────────────── - 1 │ -5 [-0.34, 2.98] - 2 │ -8 [-0.59, 2.65] - 3 │ -7 [-0.14, 2.97] - 4 │ -6 [-0.11, 2.9] - 5 │ -4 [-0.1, 2.9] - 6 │ -3 [-0.22, 3.25] - 7 │ -13 [3.92, 6.72] - 8 │ -12 [2.89, 6.13] - ⋮ │ ⋮ ⋮ - 25 │ 10 6.95 - 26 │ 11 4.78 - 27 │ 12 5.33 - 28 │ 1 -0.12 - 29 │ 16 0.74 - 30 │ 9 4.84 - 31 │ 3 1.07 - 16 rows omitted - -julia> plot(phy, nodelabel = predintPlot(ancStates)); - -julia> allowmissing!(dat, :trait); - -julia> dat[[2, 5], :trait] .= missing; # missing values allowed to fit model - -julia> fitBM = phylolm(@formula(trait ~ 1), dat, phy); - -julia> ancStates = ancestralStateReconstruction(fitBM); -┌ Warning: These prediction intervals show uncertainty in ancestral values, -│ assuming that the estimated variance rate of evolution is correct. -│ Additional uncertainty in the estimation of this variance rate is -│ ignored, so prediction intervals should be larger. -└ @ PhyloNetworks ~/build/juliaphylo/PhyloNetworks.jl/src/traits.jl:3166 - -julia> first(expectations(ancStates), 3) # looking at first 3 nodes only -3×2 DataFrame - Row │ nodeNumber condExpectation - │ Int64 Float64 -─────┼───────────────────────────── - 1 │ -5 1.42724 - 2 │ -8 1.35185 - 3 │ -7 1.61993 - -julia> predint(ancStates)[1:3,:] # just first 3 nodes again -3×2 Matrix{Float64}: - -0.373749 3.22824 - -0.698432 3.40214 - -0.17179 3.41165 - - -julia> first(expectationsPlot(ancStates),3) # format node <-> ancestral state -3×2 DataFrame - Row │ nodeNumber PredInt - │ Int64 Abstract… -─────┼─────────────────────── - 1 │ -5 1.43 - 2 │ -8 1.35 - 3 │ -7 1.62 - -julia> plot(phy, nodelabel = expectationsPlot(ancStates)); - -julia> first(predintPlot(ancStates),3) # prediction intervals, useful to plot -3×2 DataFrame - Row │ nodeNumber PredInt - │ Int64 Abstract… -─────┼─────────────────────────── - 1 │ -5 [-0.37, 3.23] - 2 │ -8 [-0.7, 3.4] - 3 │ -7 [-0.17, 3.41] - -julia> plot(phy, nodelabel = predintPlot(ancStates)); -``` -""" -function ancestralStateReconstruction(obj::PhyloNetworkLinearModel) - # default reconstruction for known predictors - if ((size(obj.X)[2] != 1) || !any(obj.X .== 1)) # Test if the regressor is just an intercept. - error("""Predictor(s) other than a plain intercept are used in this `PhyloNetworkLinearModel` object. - These predictors are unobserved at ancestral nodes, so they cannot be used - for the ancestral state reconstruction. If these ancestral predictor values - are known, please provide them as a matrix argument to the function. - Otherwise, you might consider doing a multivariate linear regression (not implemented yet).""") - end - X_n = ones((length(obj.V.nodeNumbersTopOrder) - sum(obj.nonmissing), 1)) - ancestralStateReconstruction(obj, X_n) -end - -""" - ancestralStateReconstruction(fr::AbstractDataFrame, net::HybridNetwork; kwargs...) - -Estimate the ancestral traits on a network, given some data at the tips. -Uses function [`phylolm`](@ref) to perform a phylogenetic regression of the data against an -intercept (amounts to fitting an evolutionary model on the network). - -See documentation on [`phylolm`](@ref) and `ancestralStateReconstruction(obj::PhyloNetworkLinearModel[, X_n::Matrix])` -for further details. - -Returns an object of type [`ReconstructedStates`](@ref). -""" -function ancestralStateReconstruction(fr::AbstractDataFrame, - net::HybridNetwork; - tipnames::Symbol=:tipNames, - kwargs...) - nn = DataFrames.propertynames(fr) - datpos = nn .!= tipnames - if sum(datpos) > 1 - error("""Besides one column labelled '$tipnames', the dataframe fr should have - only one column, corresponding to the data at the tips of the network.""") - end - f = @eval(@formula($(nn[datpos][1]) ~ 1)) - reg = phylolm(f, fr, net; tipnames=tipnames, kwargs...) - return ancestralStateReconstruction(reg) -end - - - - - - -################################################# -## Old version of phylolm (naive) -################################################# - -# function phylolmNaive(X::Matrix, Y::Vector, net::HybridNetwork, model="BM"::AbstractString) -# # Geting variance covariance -# V = sharedPathMatrix(net) -# Vy = extractVarianceTips(V, net) -# # Needed quantities (naive) -# ntaxa = length(Y) -# Vyinv = inv(Vy) -# XtVyinv = X' * Vyinv -# logdetVy = logdet(Vy) -# # beta hat -# betahat = inv(XtVyinv * X) * XtVyinv * Y -# # sigma2 hat -# fittedValues = X * betahat -# residuals = Y - fittedValues -# sigma2hat = 1/ntaxa * (residuals' * Vyinv * residuals) -# # log likelihood -# loglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(sigma2hat) + logdetVy) -# # Result -# # res = phyloNetworkRegression(betahat, sigma2hat[1], loglik[1], V, Vy, fittedValues, residuals) -# return((betahat, sigma2hat[1], loglik[1], V, Vy, logdetVy, fittedValues, residuals)) -# end diff --git a/src/traitsLikDiscrete.jl b/src/traitsLikDiscrete.jl deleted file mode 100644 index f69fd982f..000000000 --- a/src/traitsLikDiscrete.jl +++ /dev/null @@ -1,1254 +0,0 @@ -""" - StatisticalSubstitutionModel - -Subtype of `StatsBase.StatisticalModel`, to fit discrete data to a model -of trait substitution along a network. -See [`fitdiscrete`](@ref) to fit a trait substitution model to discrete data. -It returns an object of type `StatisticalSubstitutionModel`, to which standard -functions can be applied, like `loglikelihood(object)`, `aic(object)` etc. -""" -mutable struct StatisticalSubstitutionModel <: StatsBase.StatisticalModel - model::SubstitutionModel - ratemodel::RateVariationAcrossSites - """stationary for NASM models (log(1/4)), uniform in all other cases""" - prioratroot::Vector{Float64} - net::HybridNetwork - """ data: trait[i] for leaf with n.number = i - type Int: for indices of trait labels in getlabels(model) - allows missing, but not half-ambiguous and not multi-state""" - trait::Vector{Vector{Union{Missing, Int}}} - "number of columns in the data: should be equal to `length(trait[i])` for all i" - nsites::Int - "vector of weights, one for each column, taken as 1s if not provided" - siteweight::Union{Nothing, Vector{Float64}} - "total sum of site weights" - totalsiteweight::Float64 - """ - log of transition probabilities: where e goes from X to Y - logtrans[i,j,e,r] = P{Y=j|X=i} where i=start_state, j=end_state, e=edge.number, r = rate (if using RateVariationAcrossSites) - all displayed trees use same edge numbers and same logtrans as in full network - """ - loglik::Union{Missings.Missing, Float64} - """ - log of transition probabilities. - size: k,k, net.numEdges, r where k=nstates(model) - """ - logtrans::Array{Float64,4} - # type based on extracting displayed trees - displayedtree::Vector{HybridNetwork} - """ - prior log tree weight: log product of γ's. - In fit!: priorltw = `inheritanceWeight.(trees)` - (which returns missing for any negative γ and would cause an error here) - """ - priorltw::Vector{Float64} - """ - partial log-likelihoods for active trait(s) given a particular displayed tree - and a particular rate category, at indices [i, n.number or e.number]: - - forward likelihood: log P{data below node n (in tree t) given state i at n} - - direct likelihood: log P{data below edge e (in tree t) given i at parent of e} - - backward likelihood:log P{data at all non-descendants of n (in t) and state i at n} - sizes: k, net.numNodes or net.numEdges. - """ - # reset for each trait and rate - forwardlik::Array{Float64,2} # size: k, net.numNodes - directlik::Array{Float64,2} # size: k, net.numEdges - backwardlik::Array{Float64,2}# size: k, net.numNodes - "log-likelihood of site k" - _sitecache::Array{Float64,1} # size: nsites - "log-likelihood of ith displayed tree t & rate category j, of site k" - _loglikcache::Array{Float64, 3} # size: nsites, nrates, ntrees - - "inner (default) constructor: from model, rate model, network, trait and site weights" - function StatisticalSubstitutionModel(model::SubstitutionModel, - ratemodel::RateVariationAcrossSites, - net::HybridNetwork, trait::AbstractVector, - siteweight=nothing::Union{Nothing, Vector{Float64}}, - maxhybrid=length(net.hybrid)::Int) - length(trait) > 0 || error("no trait data!") - nsites = length(trait[1]) - siteweight === nothing || length(siteweight) == nsites || - error("siteweight must be of same length as the number of traits") - totalsiteweight = (siteweight === nothing ? float(nsites) : sum(siteweight)) - k = nstates(model) - if typeof(model) <: NASM - prioratroot = log.(stationary(model)) #refactor to save in obj - else # other trait models - prioratroot = [-log(k) for i in 1:k] # uniform prior at root - end - # T = eltype(getlabels(model)) - # extract displayed trees - trees = displayedTrees(net, 0.0; nofuse=true, keeporiginalroot=true) - for tree in trees - preorder!(tree) # no need to call directEdges! before: already done on net - end - ntrees = 2^maxhybrid - ntrees >= length(trees) || - error("""maxhybrid is too low. - Call using maxhybrid >= current number of hybrids""") - # log tree weights: sum log(γ) over edges, for each displayed tree - priorltw = inheritanceWeight.(trees) - all(!ismissing, priorltw) || - error("one or more inheritance γ's are missing or negative. fix using setGamma!(network, edge)") - maxedges = length(net.edge) + 3*(maxhybrid-length(net.hybrid)) - maxnodes = length(net.node) + 2*(maxhybrid-length(net.hybrid)) - logtrans = zeros(Float64, k,k, maxedges, length(ratemodel.ratemultiplier)) - forwardlik = zeros(Float64, k, maxnodes) - directlik = zeros(Float64, k, maxedges) - backwardlik= zeros(Float64, k, maxnodes) - _sitecache = Vector{Float64}(undef, nsites) - _loglikcache = zeros(Float64, nsites, length(ratemodel.ratemultiplier), ntrees) - new(deepcopy(model), deepcopy(ratemodel), prioratroot, - net, trait, nsites, siteweight, totalsiteweight, missing, # missing log likelihood - logtrans, trees, - priorltw, forwardlik, directlik, backwardlik,_sitecache,_loglikcache) - end -end -const SSM = StatisticalSubstitutionModel - -# fasta constructor: from net, fasta filename, modsymbol, and maxhybrid -# Works for DNA in fasta format. Probably need different versions for -# different kinds of data (snp, amino acids). Similar to fitdiscrete() -""" - StatisticalSubstitutionModel(model::SubstitutionModel, - ratemodel::RateVariationAcrossSites, - net::HybridNetwork, trait::AbstractVector, - siteweight=nothing::Union{Nothing, Vector{Float64}}, - maxhybrid=length(net.hybrid)::Int) - -Inner constructor. Makes a deep copy of the input model, rate model. -Warning: does *not* make a deep copy of the network: -modification of the `object.net` would modify the input `net`. -Assumes that the network has valid gamma values (to extract displayed trees). - - StatisticalSubstitutionModel(net::HybridNetwork, fastafile::String, - modsymbol::Symbol, rvsymbol=:noRV::Symbol, - ratecategories=4::Int; - maxhybrid=length(net.hybrid)::Int) - -Constructor from a network and a fasta file. -The model symbol should be one of `:JC69`, `:HKY85`, `:ERSM` or `:BTSM`. -The `rvsymbol` should be as required by [`RateVariationAcrossSites`](@ref). - -The network's gamma values are modified if they are missing. After that, -a deep copy of the network is passed to the inner constructor. -""" -function StatisticalSubstitutionModel(net::HybridNetwork, fastafile::AbstractString, - modsymbol::Symbol, rvsymbol=:noRV::Symbol, ratecategories=4::Int; - maxhybrid=length(net.hybrid)::Int) - for e in net.edge # check for missing or inappropriate γ values - if e.hybrid - e.gamma > 0.0 && continue - setGamma!(e, (e.isMajor ? 0.6 : 0.4)) # to maintain isMajor as is - else - e.gamma == 1.0 || error("tree edge number $(e.number) has γ not 1.0") - end - end - data, siteweights = readfastatodna(fastafile, true) - model = defaultsubstitutionmodel(net, modsymbol, data, siteweights) - ratemodel = RateVariationAcrossSites(rvsymbol, ratecategories) - dat2 = traitlabels2indices(view(data, :, 2:size(data,2)), model) - # check_matchtaxonnames makes a deep copy of the network - o, net = check_matchtaxonnames!(data[:,1], dat2, net) # calls resetNodeNumbers, which calls preorder! - trait = dat2[o] - obj = StatisticalSubstitutionModel(model, ratemodel, net, trait, siteweights, - maxhybrid) -end - -StatsBase.loglikelihood(obj::SSM) = obj.loglik -StatsBase.islinear(SSM) = false -StatsBase.dof(obj::SSM) = nparams(obj.model) + nparams(obj.ratemodel) -function Base.show(io::IO, obj::SSM) - disp = "$(typeof(obj)):\n" - disp *= replace(string(obj.model), r"\n" => "\n ") * "\n" - if nparams(obj.ratemodel) > 0 - disp *= replace(string(obj.ratemodel), r"\n" => "\n ") * "\n" - end - disp *= "on a network with $(obj.net.numHybrids) reticulations\n" - print(io, disp) - showdata(io, obj) - if !ismissing(obj.loglik) - print(io, "\nlog-likelihood: $(round(obj.loglik, digits=5))") - end -end -""" - showdata(io::IO, obj::SSM, fullsiteinfo=false::Bool) - -Return information about the data in an SSM object: -number of species, number or traits or sites, number of distinct patterns, -and more information if `fullsiteinfo` is true: -number sites with missing data only, -number of invariant sites, number of sites with 2 distinct states, -number of parsimony-informative sites (with 2+ states being observed in 2+ tips), -number of sites with some missing data, and -overall proportion of entries with missing data. - -Note: Missing is not considered an additional state. For example, -if a site contains some missing data, but all non-missing values take the same -state, then this site is counted in the category "invariant". -""" -function showdata(io::IO, obj::SSM, fullsiteinfo=false::Bool) - disp = "data:\n $(length(obj.trait)) species" - ns = obj.totalsiteweight - ns = (isapprox(ns, round(ns), atol=1e-5) ? Int(round(ns)) : ns) - disp *= (ns ≈ 1 ? "\n $ns trait" : "\n $ns sites") - if !isapprox(obj.nsites, ns, atol=1e-5) - disp *= "\n $(obj.nsites) distinct patterns" - end - print(io, disp) - (fullsiteinfo && obj.nsites != 1) || return nothing - # if more than 1 trait and if the user wants full information: - nsv = MVector{6,Float64}(undef) # vector to count number of - # sites with: 0, 1, 2 states, parsimony informative, with 1+ missing value, - # missing values across all sites. - fill!(nsv, 0.0) - text = ["sites with no data", "invariant sites", - "sites with 2 distinct states", "parsimony-informative sites", - "sites with 1 or more missing values", "missing values overall"] - trackstates = zeros(Int, nstates(obj.model)) # states seen at a given site - ntaxa = length(obj.trait) - for i in 1:(obj.nsites) # over sites - sweight = (isnothing(obj.siteweight) ? 1.0 : obj.siteweight[i]) - missone = false - fill!(trackstates, 0) - for j in 1:ntaxa # over taxa - data = obj.trait[j][i] - if ismissing(data) - nsv[6] += sweight # total number of missing values - missone && continue - nsv[5] += sweight # sites with 1+ missing values - missone = true - else # mark state seen - trackstates[data] += 1 # 1 more taxon - end - end - # add site's weight to appropriate nstates - nstates = sum(trackstates .> 0) - if nstates < 3 - nsv[nstates+1] += sweight - end - if nstates>1 # are there 2 states observed at 2+ taxa each? - nstates_2taxa = sum(trackstates .> 1) - if nstates_2taxa>1 - nsv[4] += sweight - end - end - end - nsv_r = map(x -> begin y=round(x); (isapprox(y,x,atol=1e-5) ? Int(y) : x); end, nsv) - for i in 1:5 - print(io, "\n $(nsv_r[i]) $(text[i]) ($(round(100*nsv[i]/ns, digits=2))%)") - end - print(io, "\n $(round(100*nsv[6]/(ns*ntaxa), digits=2))% $(text[6])") -end -# nobs: nsites * nspecies, minus any missing, but ignores correlation between species -# fixit: extend the StatsBase methods -# coef, coefnames, coeftable, confint, -# deviance (not from loglik in StatsBase), nulldeviance (from intercept only. here?) -# nullloglikelihood (from intercept only. here?) -# score (gradient of loglik) -# informationmatrix: Fisher by default, observed info matrix if expected=false -# stderror, vcov, params -# weights - -""" - fitdiscrete(net, model, tipdata) - fitdiscrete(net, model, RateVariationAcrossSites, tipdata) - fitdiscrete(net, model, species, traits) - fitdiscrete(net, model, RateVariationAcrossSites, species, traits) - fitdiscrete(net, model, dnadata, dnapatternweights) - fitdiscrete(net, model, RateVariationAcrossSites, dnadata, dnapatternweights) - fitdiscrete(net, modSymbol, species, traits) - fitdiscrete(net, modSymbol, dnadata, dnapatternweights) - -Calculate the maximum likelihood (ML) score of a network or tree given -one or more discrete characters at the tips. Along each edge, transitions -are modelled with a continous time Markov `model`, whose parameters are -estimated (by maximizing the likelihood). At each hybrid node, -the trait is assumed to be inherited from either of the two immediate -parents according to the parents' average genetic contributions -(inheritance γ). The model ignores incomplete lineage sorting. -The algorithm extracts all trees displayed in the network. - -Data can given in one of the following: -- `tipdata`: dictionary taxon => state label, for a single trait. -- `tipdata`: data frame for a single trait, in which case the taxon names - are to appear in column 1 or in a column named "taxon" or "species", and - trait *labels* are to appear in column 2 or in a column named "trait". - Here, trait labels should be as they appear in `getlabels(model)`. -- `species`: vector of strings, and `traits`: DataFrame of traits, - with rows in the order corresponding to the order of species names. - Again, trait labels should be as they appear in `getlabels(model)`. - All traits are assumed to follow the same model, with same parameters. -- `dnadata`: the first part of the output of readfastatodna, - a dataframe of BioSequence DNA sequences, with taxon in column 1 and - a column for each site. -- `dnapatternweights`: the second part of the output of readfastatodna, - an array of weights, one weights for each of the site columns. - The length of the weight is equal to nsites. - If using dnapatternweights, must provide dnadata. -- RateVariationAcrossSites: model for rate variation (optional) - -Optional arguments (default): -- `optimizeQ` (true): should model rate parameters be fixed, - or should they be optimized? -- `optimizeRVAS` (true): should the model optimize the parameters - for the variability of rates across sites (α and/or p_invariable)? -- `NLoptMethod` (`:LN_COBYLA`, derivative-free) for the optimization algorithm. - For other options, see the - [NLopt](https://nlopt.readthedocs.io/en/latest/NLopt_Algorithms/). -- tolerance values to control when the optimization is stopped: - `ftolRel` (1e-12), `ftolAbs` (1e-10) on the likelihood, and - `xtolRel` (1e-10), `xtolAbs` (1e-10) on the model parameters. -- bounds for the alpha parameter of the Gamma distribution of - rates across sites: `alphamin=0.05`, `alphamax=50`. -- `verbose` (false): if true, more information is output. - -# examples: - -```jldoctest fitDiscrete_block -julia> net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); - -julia> m1 = BinaryTraitSubstitutionModel([0.1, 0.1], ["lo", "hi"]); - -julia> using DataFrames - -julia> dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]); - -julia> fit1 = fitdiscrete(net, m1, dat) -PhyloNetworks.StatisticalSubstitutionModel: -Binary Trait Substitution Model: - rate lo→hi α=0.27222 - rate hi→lo β=0.34981 -on a network with 1 reticulations -data: - 4 species - 1 trait -log-likelihood: -2.7277 - -julia> tips = Dict("A" => "lo", "B" => "lo", "C" => "hi", "D" => "hi"); - -julia> fit2 = fitdiscrete(net, m1, tips; xtolRel=1e-16, xtolAbs=1e-16, ftolRel=1e-16) -PhyloNetworks.StatisticalSubstitutionModel: -Binary Trait Substitution Model: - rate lo→hi α=0.27222 - rate hi→lo β=0.34981 -on a network with 1 reticulations -data: - 4 species - 1 trait -log-likelihood: -2.7277 -``` - -Note that a copy of the network is stored in the fitted object, -but the internal representation of the network may be different in -`fit1.net` and in the original network `net`: - -```jldoctest fitDiscrete_block -julia> net = readTopology("(sp1:3.0,(sp2:2.0,(sp3:1.0,sp4:1.0):1.0):1.0);"); - -julia> using BioSymbols - -julia> tips = Dict("sp1" => BioSymbols.DNA_A, "sp2" => BioSymbols.DNA_A, "sp3" => BioSymbols.DNA_G, "sp4" => BioSymbols.DNA_G); - -julia> mJC69 = JC69([0.25], false); - -julia> fitJC69 = fitdiscrete(net, mJC69, tips) -PhyloNetworks.StatisticalSubstitutionModel: -Jukes and Cantor 69 Substitution Model, - absolute rate version - off-diagonal rates equal to 0.29233/3. - rate matrix Q: - A C G T - A * 0.0974 0.0974 0.0974 - C 0.0974 * 0.0974 0.0974 - G 0.0974 0.0974 * 0.0974 - T 0.0974 0.0974 0.0974 * -on a network with 0 reticulations -data: - 4 species - 1 trait -log-likelihood: -4.99274 - -julia> rv = RateVariationAcrossSites(alpha=1.0, ncat=4) -Rate variation across sites: discretized Gamma -alpha: 1.0 -categories for Gamma discretization: 4 -rates: [0.146, 0.513, 1.071, 2.27] - -julia> fitdiscrete(net, mJC69, rv, tips; optimizeQ=false, optimizeRVAS=false) -PhyloNetworks.StatisticalSubstitutionModel: -Jukes and Cantor 69 Substitution Model, - absolute rate version - off-diagonal rates equal to 0.25/3. - rate matrix Q: - A C G T - A * 0.0833 0.0833 0.0833 - C 0.0833 * 0.0833 0.0833 - G 0.0833 0.0833 * 0.0833 - T 0.0833 0.0833 0.0833 * -Rate variation across sites: discretized Gamma - alpha: 1.0 - categories for Gamma discretization: 4 - rates: [0.146, 0.513, 1.071, 2.27] -on a network with 0 reticulations -data: - 4 species - 1 trait -log-likelihood: -5.2568 - -``` -fixit: add option to allow users to specify root prior, -using either equal frequencies or stationary frequencies for trait models. -""" -function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, - tips::Dict; kwargs...) #tips::Dict no ratemodel version - ratemodel = RateVariationAcrossSites(ncat=1) - fitdiscrete(net, model, ratemodel, tips; kwargs...) -end - -#tips::Dict version with ratemodel -function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, ratemodel::RateVariationAcrossSites, - tips::Dict; kwargs...) - species = String[] - dat = Vector{Int}[] # indices of trait labels - for (k,v) in tips - !ismissing(v) || continue - push!(species, k) - vi = findfirst(isequal(v), getlabels(model)) - vi !== nothing || error("trait $v not found in model") - push!(dat, [vi]) - end - o, net = check_matchtaxonnames!(species, dat, net) # dat[o] would make a shallow copy only - StatsBase.fit(StatisticalSubstitutionModel, net, model, ratemodel, view(dat, o); kwargs...) -end - -#dat::DataFrame, no rate model version -function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, - dat::DataFrame; kwargs...) - ratemodel = RateVariationAcrossSites(ncat=1) - fitdiscrete(net, model, ratemodel, dat; kwargs...) -end - -#dat::DataFrame with rate model version -function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, - ratemodel::RateVariationAcrossSites, dat::DataFrame; kwargs...) - i = findfirst(isequal(:taxon), DataFrames.propertynames(dat)) - if i===nothing i = findfirst(isequal(:species), DataFrames.propertynames(dat)); end - if i===nothing i=1; end # first column if no column "taxon" or "species" - j = findfirst(isequal(:trait), DataFrames.propertynames(dat)) - if j===nothing j=2; end - if i==j - error("""expecting taxon names in column 'taxon', or 'species' or - column 1, and trait values in column 'trait' or column 2.""") - end - species = dat[:,i] # modified in place later - dat = traitlabels2indices(dat[!,j], model) # vec of vec, indices - o, net = check_matchtaxonnames!(species, dat, net) - StatsBase.fit(StatisticalSubstitutionModel, net, model, ratemodel, view(dat, o); kwargs...) -end - -#species, dat version, no ratemodel -function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, - species::Array{<:AbstractString}, dat::DataFrame; kwargs...) - ratemodel = RateVariationAcrossSites(ncat=1) - fitdiscrete(net, model, ratemodel, species, dat; kwargs...) -end - -#species, dat version with ratemodel -function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, - ratemodel::RateVariationAcrossSites, species::Array{<:AbstractString}, - dat::DataFrame; kwargs...) - dat2 = traitlabels2indices(dat, model) # vec of vec, indices - o, net = check_matchtaxonnames!(copy(species), dat2, net) - StatsBase.fit(StatisticalSubstitutionModel, net, model, ratemodel, view(dat2, o); kwargs...) -end - -#wrapper: species, dat version with model symbol -function fitdiscrete(net::HybridNetwork, modSymbol::Symbol, - species::Array{<:AbstractString}, dat::DataFrame, rvSymbol=:noRV::Symbol; kwargs...) - rate = startingrate(net) - labels = learnlabels(modSymbol, dat) - if modSymbol == :JC69 - model = JC69([1.0], true) # 1.0 instead of rate because relative version - elseif modSymbol == :HKY85 - model = HKY85([1.0], # transition/transversion rate ratio - empiricalDNAfrequencies(dat, repeat([1.], inner=size(dat, 2))), - true) - elseif modSymbol == :ERSM - model = EqualRatesSubstitutionModel(length(labels), rate, labels); - elseif modSymbol == :BTSM - model = BinaryTraitSubstitutionModel([rate, rate], labels) - elseif modSymbol == :TBTSM - model = TwoBinaryTraitSubstitutionModel([rate, rate, rate, rate, rate, rate, rate, rate], labels) - else - error("model $modSymbol is unknown or not implemented yet") - end - - rvas = RateVariationAcrossSites(rvSymbol) - fitdiscrete(net, model, rvas, species, dat; kwargs...) -end - -#dnadata with dnapatternweights version, no ratemodel -function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, - dnadata::DataFrame, dnapatternweights::Array{Float64}; kwargs...) - ratemodel = RateVariationAcrossSites(ncat=1) - fitdiscrete(net, model, ratemodel, dnadata, dnapatternweights; kwargs...) -end - -#dnadata with dnapatternweights version with ratemodel -function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, - ratemodel::RateVariationAcrossSites,dnadata::DataFrame, - dnapatternweights::Array{<:AbstractFloat}; kwargs...) - dat2 = traitlabels2indices(dnadata[!,2:end], model) - o, net = check_matchtaxonnames!(dnadata[:,1], dat2, net) - kwargs = (:siteweights => dnapatternweights, kwargs...) - StatsBase.fit(StatisticalSubstitutionModel, net, model, ratemodel, view(dat2, o); - kwargs...) -end - -#wrapper for dna data -function fitdiscrete(net::HybridNetwork, modSymbol::Symbol, dnadata::DataFrame, - dnapatternweights::Array{<:AbstractFloat}, rvSymbol=:noRV::Symbol; kwargs...) - rate = startingrate(net) - if modSymbol == :JC69 - model = JC69([1.0], true) # 1.0 instead of rate because relative version - elseif modSymbol == :HKY85 - model = HKY85([1.0], # transition/transversion rate ratio - empiricalDNAfrequencies(view(dnadata, :, 2:size(dnadata,2)), dnapatternweights), - true) - elseif modSymbol == :ERSM - model = EqualRatesSubstitutionModel(4, rate, [BioSymbols.DNA_A, BioSymbols.DNA_C, BioSymbols.DNA_G, BioSymbols.DNA_T]); - elseif modSymbol == :BTSM - error("Binary Trait Substitution Model supports only two trait states, but dna data has four states.") - elseif modSymbol == :TBTSM - error("Two Binary Trait Substitution Model does not support dna data: it supports two sets of potentially correlated two trait states.") - else - error("model $modSymbol is unknown or not implemented yet") - end - - rvas = RateVariationAcrossSites(rvSymbol) - fitdiscrete(net, model, rvas, dnadata, dnapatternweights; kwargs...) -end - -""" - fit(StatisticalSubstitutionModel, net, model, traits; kwargs...) - fit!(StatisticalSubstitutionModel; kwargs...) - -Internal function called by [`fitdiscrete`](@ref): with same key word arguments `kwargs`. -But dangerous: `traits` should be a vector of vectors as for [`fitdiscrete`](@ref) -**but** here `traits` need to contain the *indices* of trait values corresponding -to the indices in `getlabels(model)`, and species should appear in `traits` in the -order corresponding to the node numbers in `net`. -See [`traitlabels2indices`](@ref) to convert trait labels to trait indices. - -**Warning**: does *not* perform checks. [`fitdiscrete`](@ref) calls this function -after doing checks, preordering nodes in the network, making sure nodes have -consecutive numbers, species are matched between data and network etc. -""" -function StatsBase.fit(::Type{SSM}, net::HybridNetwork, model::SubstitutionModel, - ratemodel::RateVariationAcrossSites, trait::AbstractVector; kwargs...) - - sw = nothing - if haskey(kwargs, :siteweights) - sw = kwargs[:siteweights] - kwargs = filter(p -> p.first != :siteweights, kwargs) - end - obj = StatisticalSubstitutionModel(model, ratemodel, net, trait, sw) - fit!(obj; kwargs...) -end - -function fit!(obj::SSM; optimizeQ=true::Bool, optimizeRVAS=true::Bool, - closeoptim=false::Bool, verbose=false::Bool, maxeval=1000::Int, - ftolRel=fRelBL::Float64, ftolAbs=fAbsBL::Float64, - xtolRel=xRelBL::Float64, xtolAbs=xAbsBL::Float64, - alphamin=alphaRASmin, alphamax=alphaRASmax, - pinvmin=pinvRASmin, pinvmax=pinvRASmax) - - all(x -> x >= 0.0, [e.length for e in obj.net.edge]) || error("branch lengths should be >= 0") - all(x -> x >= 0.0, [e.gamma for e in obj.net.edge]) || error("gammas should be >= 0") - if optimizeQ && nparams(obj.model) <1 - @debug "The Q matrix for this model is fixed, so there are no rate parameters to optimize. optimizeQ will be set to false." - optimizeQ = false - end - if optimizeRVAS && (nparams(obj.ratemodel) == 0) - @debug "Rate model has one rate category, so there are no parameters to optimize. optimizeRVAS will be set to false." - optimizeRVAS = false - end - if !optimizeQ && !optimizeRVAS - discrete_corelikelihood!(obj) - verbose && println("loglik = $(loglikelihood(obj)) under fixed parameters, no optimization") - return obj - end - if optimizeQ - function loglikfun(x::Vector{<:AbstractFloat}, grad::Vector{<:AbstractFloat}) # modifies obj - setrates!(obj.model, x) - res = discrete_corelikelihood!(obj) - verbose && println("loglik: $res, model rates: $x") - length(grad) == 0 || error("gradient not implemented") - return res - end - # optimize Q under fixed RVAS parameters - # set-up optimization object for Q - NLoptMethod=:LN_COBYLA # no gradient # :LN_COBYLA for (non)linear constraits, :LN_BOBYQA for bound constraints - nparQ = nparams(obj.model) - optQ = NLopt.Opt(NLoptMethod, nparQ) - NLopt.ftol_rel!(optQ,ftolRel) # relative criterion - NLopt.ftol_abs!(optQ,ftolAbs) # absolute criterion - NLopt.xtol_rel!(optQ,xtolRel) - NLopt.xtol_abs!(optQ,xtolAbs) - NLopt.maxeval!(optQ, maxeval) # max number of iterations - # NLopt.maxtime!(optQ, t::Real) - NLopt.lower_bounds!(optQ, zeros(Float64, nparQ)) - if typeof(obj.model) == HKY85 # set an upper bound on kappa values - NLopt.upper_bounds!(optQ, fill(kappamax,nparQ)) - end - NLopt.max_objective!(optQ, loglikfun) - fmax, xmax, ret = NLopt.optimize(optQ, obj.model.rate) - setrates!(obj.model, xmax) - obj.loglik = fmax - verbose && println("got $(round(fmax, digits=5)) at $(round.(xmax, digits=5)) after $(optQ.numevals) iterations (return code $(ret))") - end - if optimizeRVAS - function loglikfunRVAS(alpha::Vector{<:AbstractFloat}, grad::Vector{<:AbstractFloat}) - setparameters!(obj.ratemodel, alpha) - res = discrete_corelikelihood!(obj) - verbose && println("loglik: $res, rate variation model shape parameter alpha: $(alpha[1])") - length(grad) == 0 || error("gradient not implemented") - return res - end - # set-up optimization object for RVAS parameter - NLoptMethod=:LN_COBYLA # no gradient - # :LN_COBYLA for (non)linear constraits, :LN_BOBYQA for bound constraints - nparRVAS = nparams(obj.ratemodel) - optRVAS = NLopt.Opt(NLoptMethod, nparRVAS) - NLopt.ftol_rel!(optRVAS,ftolRel) # relative criterion - NLopt.ftol_abs!(optRVAS,ftolAbs) # absolute criterion - NLopt.xtol_rel!(optRVAS,xtolRel) - NLopt.xtol_abs!(optRVAS,xtolAbs) - NLopt.maxeval!(optRVAS,1000) # max number of iterations - # NLopt.maxtime!(optRVAS, t::Real) - rvind = getparamindex(obj.ratemodel) - NLopt.lower_bounds!(optRVAS, [pinvmin,alphamin][rvind] ) - NLopt.upper_bounds!(optRVAS, [pinvmax,alphamax][rvind] ) - NLopt.max_objective!(optRVAS, loglikfunRVAS) - fmax, xmax, ret = NLopt.optimize(optRVAS, getparameters(obj.ratemodel)) # optimization here! - setparameters!(obj.ratemodel, xmax) - obj.loglik = fmax - verbose && println("RVAS: got $(round(fmax, digits=5)) at $(round.(xmax, digits=5)) after $(optRVAS.numevals) iterations (return code $(ret))") - end - if optimizeQ && optimizeRVAS && closeoptim - # optimize Q under fixed RVAS parameters: a second time - fmax, xmax, ret = NLopt.optimize(optQ, obj.model.rate) - setrates!(obj.model, xmax) - obj.loglik = fmax - verbose && println("got $(round(fmax, digits=5)) at $(round.(xmax, digits=5)) after $(optQ.numevals) iterations (return code $(ret))") - # optimize RVAS under fixed Q: a second time - fmax, xmax, ret = NLopt.optimize(optRVAS, getparameters(obj.ratemodel)) - setparameters!(obj.ratemodel, xmax) - obj.loglik = fmax - verbose && println("RVAS: got $(round(fmax, digits=5)) at $(round.(xmax, digits=5)) after $(optRVAS.numevals) iterations (return code $(ret))") - end - return obj -end - -""" - update_logtrans(obj::SSM) - -Initialize and update `obj.logtrans`, the log transition probabilities -along each edge in the full network. -They are re-used for each displayed tree, which is why edges are not fused -around degree-2 nodes when extracting displayed trees. -""" -function update_logtrans(obj::SSM) - rates = obj.ratemodel.ratemultiplier - k = nstates(obj.model) - Ptmp = MMatrix{k,k,Float64}(undef) # memory to be re-used - for edge in obj.net.edge # update logtrans: same for all displayed trees, all traits - enum = edge.number - len = edge.length - for i = 1:length(rates) - obj.logtrans[:,:,enum, i] .= log.(P!(Ptmp, obj.model, len * rates[i])) - end - end -end - -""" - update_logtrans(obj::SSM, edge::Edge) - -Update the log-transition probabilities associates to one particular `edge` -in the network. -""" -function update_logtrans(obj::SSM, edge::Edge) - rates = obj.ratemodel.ratemultiplier - enum = edge.number - len = edge.length - for i in 1:length(rates) - pmat = view(obj.logtrans, :,:,enum,i) - @inbounds pmat .= log.(P!(pmat, obj.model, len * rates[i])) - end -end - -""" - discrete_corelikelihood!(obj::StatisticalSubstitutionModel; - whichtrait::AbstractVector{Int} = 1:obj.nsites) - -Calculate the likelihood and update `obj.loglik` for discrete characters on a network, -calling [`discrete_corelikelihood_trait!`](@ref). -The algorithm extracts all displayed trees and weighs the likelihood under all these trees. -The object's partial likelihoods are updated: -- forward and direct partial likelihoods are re-used, one trait at a time, -- overall likelihoods on each displayed tree, given each rate category and for - each given site/trait: are cached in `_loglikcache`. -""" -function discrete_corelikelihood!(obj::SSM; whichtrait::AbstractVector{Int} = 1:obj.nsites) - # fill _loglikcache - nr = length(obj.ratemodel.ratemultiplier) - nt = length(obj.displayedtree) - update_logtrans(obj) - for t in 1:nt - for ri in 1:nr - for ci in whichtrait - obj._loglikcache[ci,ri,t] = discrete_corelikelihood_trait!(obj,t,ci,ri) - # conditional: log P(site | rate & tree) - # note: -Inf expected if 2 tips have different states, but separated by path of total length 0.0 - end - end - end - # aggregate over trees and rates - lrw = obj.ratemodel.lograteweight - for ti in 1:nt - ltprior = obj.priorltw[ti] - for ri in 1:nr - obj._loglikcache[:,ri,ti] .+= ltprior + lrw[ri] - # now unconditional: log P(site & rate & tree) - end - end - for ci in whichtrait - obj._sitecache[ci] = logsumexp(view(obj._loglikcache, ci,:,1:nt)) - end - if obj.siteweight !== nothing - obj._sitecache .*= obj.siteweight - end - loglik = sum(obj._sitecache) - obj.loglik = loglik - return loglik -end - -""" - discrete_corelikelihood_trait!(obj::SSM, t::Integer, ci::Integer, ri::Integer) - -Return the likelihood for tree `t`, trait (character/site) index `ci` and rate category `ri`. -Update & modify the forward & directional log-likelihoods `obj.forwardlik` -and `obj.directlik`, which are indexed by [state, node_number or edge_number]. -Used by [`discrete_corelikelihood!`](@ref). - -**Preconditions**: `obj.logtrans` updated, edges directed, nodes/edges preordered -""" -function discrete_corelikelihood_trait!(obj::SSM, t::Integer, ci::Integer, ri::Integer) - forwardlik = obj.forwardlik - directlik = obj.directlik - tree = obj.displayedtree[t] - k = nstates(obj.model) # also = size(logtrans,1) if not RateVariationAcrossSites - fill!(forwardlik, 0.0) # re-initialize for each trait, each iteration - fill!(directlik, 0.0) - loglik = 0. - for ni in reverse(1:length(tree.nodes_changed)) # post-order - n = tree.nodes_changed[ni] - nnum = n.number # same n.number across trees for a given node - if n.leaf # need forwardlik initialized at 0: keep at 0 = log(1) if no data - state = obj.trait[nnum][ci] # here: data assumed in a row n.number - if !ismissing(state) - for i in 1:k - forwardlik[i,nnum] = -Inf64 # log(0) = -Inf if i != observed state - end - forwardlik[state, nnum] = 0. - end - else # forward likelihood = product of direct likelihood over all children edges - for e in n.edge - n == getparent(e) || continue # to next edge if n is not parent of e - forwardlik[:,nnum] .+= view(directlik, :,e.number) - end - end - if ni==1 # root is first index in nodes changed - loglik = logsumexp(obj.prioratroot + view(forwardlik, :,nnum)) # log P{data for ci | tree t, rate ri} - break # out of loop over nodes - end - # if we keep going, n is not the root - # calculate direct likelihood on the parent edge of n - for e in n.edge - if n == getchild(e) - lt = view(obj.logtrans, :,:,e.number, ri) - for i in 1:k # state at parent node - directlik[i,e.number] = logsumexp(view(lt,i,:) + view(forwardlik,:,nnum)) - end - break # we visited the parent edge: break out of for loop - end - end #loop over edges - end # of loop over nodes - return loglik -end - -""" - posterior_logtreeweight(obj::SSM, trait = 1) - -Array A of log-posterior probabilities for each tree displayed in the network: -such that A[t] = log of P(tree `t` | trait `trait`) -if a single `trait` is requested, or A[t,i]= log of P(tree `t` | trait `i`) -if `trait` is a vector or range (e.g. `trait = 1:obj.nsites`). -These probabilities are conditional on the model parameters in `obj`. - -Displayed trees are listed in the order in which they are stored in the fitted -model object `obj`. - -**Precondition**: `_loglikcache` updated by [`discrete_corelikelihood!`](@ref) - -# examples - -```jldoctest -julia> net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); - -julia> m1 = BinaryTraitSubstitutionModel([0.1, 0.1], ["lo", "hi"]); # arbitrary rates - -julia> using DataFrames - -julia> dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]); - -julia> fit = fitdiscrete(net, m1, dat); # optimized rates: α=0.27 and β=0.35 - -julia> pltw = PhyloNetworks.posterior_logtreeweight(fit); - -julia> round.(exp.(pltw), digits=5) # posterior trees probabilities (sum up to 1) -2-element Vector{Float64}: - 0.91983 - 0.08017 - -julia> round.(exp.(fit.priorltw), digits=4) # the prior tree probabilities are similar here (tiny data set!) -2-element Vector{Float64}: - 0.9 - 0.1 -``` -""" -function posterior_logtreeweight(obj::SSM, trait = 1) - # ts[site,tree] = log P(data and tree) at site, integrated over rates - d = length(size(trait)) # 0 if single trait, 1 if vector of several traits - ts = dropdims(mapslices(logsumexp, view(obj._loglikcache, trait,:,:), - dims=d+1); dims=1) - if d>0 ts = permutedims(ts); end # now: ts[tree] or ts[tree,site] - siteliks = mapslices(logsumexp, ts, dims=1) # 1 x ntraits array (or 1-element vector) - ts .-= siteliks - return ts -end - -""" - posterior_loghybridweight(obj::SSM, hybrid_name, trait = 1) - posterior_loghybridweight(obj::SSM, edge_number, trait = 1) - -Log-posterior probability for all trees displaying the minor parent edge -of hybrid node named `hybrid_name`, or displaying the edge number `edge_number`. -That is: log of P(hybrid minor parent | trait) if a single `trait` is requested, -or A[i]= log of P(hybrid minor parent | trait `i`) -if `trait` is a vector or range (e.g. `trait = 1:obj.nsites`). -These probabilities are conditional on the model parameters in `obj`. - -**Precondition**: `_loglikcache` updated by [`discrete_corelikelihood!`](@ref) - -# examples - -```jldoctest -julia> net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); - -julia> m1 = BinaryTraitSubstitutionModel([0.1, 0.1], ["lo", "hi"]); # arbitrary rates - -julia> using DataFrames - -julia> dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]); - -julia> fit = fitdiscrete(net, m1, dat); # optimized rates: α=0.27 and β=0.35 - -julia> plhw = PhyloNetworks.posterior_loghybridweight(fit, "H1"); - -julia> round(exp(plhw), digits=5) # posterior probability of going through minor hybrid edge -0.08017 - -julia> hn = net.node[3]; getparentedgeminor(hn).gamma # prior probability -0.1 -``` -""" -function posterior_loghybridweight(obj::SSM, hybridname::String, trait = 1) - hn_index = findfirst(n -> n.name == hybridname, obj.net.node) - isnothing(hn_index) && error("node named $hybridname not found") - hn = obj.net.node[hn_index] - hn.hybrid || error("node named $hybridname is not a hybrid node") - me = getparentedgeminor(hn) - posterior_loghybridweight(obj, me.number, trait) -end -function posterior_loghybridweight(obj::SSM, edgenum::Integer, trait = 1) - tpp = posterior_logtreeweight(obj, trait) # size: (ntree,) or (ntree,ntraits) - hasedge = tree -> any(e.number == edgenum for e in tree.edge) - tokeep = map(hasedge, obj.displayedtree) - tppe = view(tpp, tokeep, :) # makes it a matrix - epp = dropdims(mapslices(logsumexp, tppe, dims=1); dims=2) - return (size(epp)==(1,) ? epp[1] : epp) # scalar or vector -end - -""" - traitlabels2indices(data, model::SubstitutionModel) - -Check that the character states in `data` are compatible with (i.e. subset of) -the trait labels in `model`. All columns are used. -`data` can be a DataFrame or a Matrix (multiple traits), or a Vector (one trait). -Return a vector of vectors (one per species) with integer entries, -where each state (label) is replaced by its index in `model`. -For DNA data, any ambiguous site is treated as missing. -""" -function traitlabels2indices(data::AbstractVector, model::SubstitutionModel) - A = Vector{Vector{Union{Missings.Missing,Int}}}(undef, 0) # indices of trait labels - labs = getlabels(model) - for l in data - vi = missing - if !ismissing(l) - vi = findfirst(isequal(l), getlabels(model)) # value index in model labels - vi !== nothing || error("trait $l not found in model") - end - push!(A, [vi]) - end - return A -end - -function traitlabels2indices(data::Union{AbstractMatrix,AbstractDataFrame}, - model::SubstitutionModel) - A = Vector{Vector{Union{Missings.Missing,Int}}}(undef, 0) # indices of trait labels - labs = getlabels(model) - isDNA = typeof(labs) == Array{DNA,1} - ntraits = size(data,2) #starting with spcies column - for i in 1:size(data,1) # go row by row (which is species by species) - V = Vector{Union{Missings.Missing,Int}}(undef, ntraits) - for j in 1:ntraits - vi = missing # value index - @inbounds l = data[i,j] # value label - if !isDNA && ismissing(l) - vi = missing - elseif isDNA #else if DNA - if typeof(l) == String #takes string and converts to a Char so that we can convert to DNA - l = Vector{Char}(l)[1] - end - l = convert(DNA, l) - end - if !ismissing(l) - vi = findfirst(isequal(l), labs) - if vi === nothing - # ideally, handle ambiguous DNA types optimally - if isDNA #&& BioSymbols.isambiguous(l) - vi = missing - else - error("trait $l not found in model") - end - end - end - V[j] = vi - end - push!(A, V) - end - return A -end - -""" - check_matchtaxonnames!(species, data, net) - -Modify `species` and `dat` by removing the species (rows) absent from the network. -Return a new network (`net` is *not* modified) with tips matching those in species: -if some species in `net` have no data, these species are pruned from the network. -The network also has its node names reset, such that leaves have nodes have -consecutive numbers starting at 1, with leaves first. -Used by [`fitdiscrete`](@ref) to build a new [`StatisticalSubstitutionModel`](@ref). -""" -function check_matchtaxonnames!(species::AbstractVector, dat::AbstractVector, net::HybridNetwork) - # 1. basic checks for dimensions and types - eltt = eltype(dat) - @assert eltt <: AbstractVector "traits should be a vector of vectors" - @assert nonmissingtype(eltype(eltt)) <: Integer "traits should be integers (label indices)" - @assert !isempty(dat) "empty data vector!" - ntraits = length(dat[1]) - for d in dat - @assert length(d)==ntraits "all species should have the same number of traits" - end - @assert length(dat) == length(species) "need as many species as rows in trait data" - # 2. match taxon labels between data and network - netlab = tipLabels(net) - ind2notinnet = findall(x -> x ∉ netlab, species) # species not in network - deleteat!(species, ind2notinnet) - deleteat!(dat, ind2notinnet) - nvalues = [sum(.!ismissing.(d)) for d in dat] # species with completely missing data - indmissing = findall(x -> x==0, nvalues) - deleteat!(species, indmissing) - deleteat!(dat, indmissing) - indnotindat = findall(x -> x ∉ species, netlab) # species not in data - net = deepcopy(net) - if !isempty(indnotindat) - @warn "the network contains taxa with no data: those will be pruned" - for i in indnotindat - deleteleaf!(net, netlab[i]) - end - end - # 3. calculate order of rows to have species with node.number i on ith row - resetNodeNumbers!(net; checkPreorder=true, type=:ape) # tip species: now with numbers 1:n - resetEdgeNumbers!(net, false) # to use edge as indices: 1:numEdges - netlab = [n.name for n in sort(net.leaf, by = x -> x.number)] - nspecies = length(netlab) - o = Vector{Int}(undef, nspecies) - for i in 1:nspecies - @inbounds o[i] = something(findfirst(isequal(netlab[i]), species),0) - end - count(!iszero, o) == nspecies || # number of non-zeros should be total size - error("weird: even after pruning, species in network have no data") - return (o,net) -end - -""" - ancestralStateReconstruction(obj::SSM, trait::Integer = 1) - -Estimate the marginal probability of ancestral states for discrete character -number `trait` (first trait by default). -The parameters of the [`StatisticalSubstitutionModel`](@ref) object `obj` -must first be fitted using [`fitdiscrete`](@ref), and ancestral state reconstruction -is conditional on the estimated parameters. If these parameters were estimated -using all traits, they are used as is, to do ancestral state reconstruction of the -particular `trait` of interest. - -**output**: data frame with a first column for the node numbers, a second column for -the node labels, and a column for each possible state: the entries in these columns -give the marginal probability that a given node has a given state. - -warnings: -- node numbers and node labels refer to those in `obj.net`, which might - have a different internal representation of nodes than the original network - used to build `obj`. -- `obj` is modified: its likelihood fields (forward, directional & backward) - are updated to make sure that they correspond to the current parameter values - in `obj.model`, and to the `trait` of interest. - -limitations: the following are not checked. -- Assumes that every node in the large network is also present - (with descendant leaves) in each displayed tree. - This is not true if the network is not tree-child... -- Assumes that the root is also in each displayed tree, which - may not be the case if the root had a hybrid child edge. - -See also [`posterior_logtreeweight`](@ref) and -[`discrete_backwardlikelihood_trait!`](@ref) to update `obj.backwardlik`. - -# examples - -```jldoctest -julia> net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); - -julia> m1 = BinaryTraitSubstitutionModel([0.1, 0.1], ["lo", "hi"]); - -julia> using DataFrames - -julia> dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]); - -julia> fit1 = fitdiscrete(net, m1, dat); - -julia> asr = ancestralStateReconstruction(fit1) -9×4 DataFrame - Row │ nodenumber nodelabel lo hi - │ Int64 String Float64 Float64 -─────┼─────────────────────────────────────────── - 1 │ 1 A 1.0 0.0 - 2 │ 2 B 1.0 0.0 - 3 │ 3 C 0.0 1.0 - 4 │ 4 D 0.0 1.0 - 5 │ 5 5 0.286021 0.713979 - 6 │ 6 6 0.319456 0.680544 - 7 │ 7 7 0.16855 0.83145 - 8 │ 8 8 0.767359 0.232641 - 9 │ 9 H1 0.782776 0.217224 - -julia> using PhyloPlots - -julia> plot(fit1.net, nodelabel = asr[!,[:nodenumber, :lo]], tipoffset=0.2); # pp for "lo" state -``` -""" -function ancestralStateReconstruction(obj::SSM, trait::Integer = 1) - # posterior probability of state i at node n: proportional to - # sum_{tree t, rate r} exp( ltw[t] + backwardll[i,n] given t,r + forwardll[i,n] given t,r ) / nr - trait <= obj.nsites || error("trait $trait is larger than the number of traits in the data") - nnodes = length(obj.net.node) # may be smaller than 2nd size of bkd or frd - update_logtrans(obj) - bkd = view(obj.backwardlik, :, 1:nnodes) - frd = view(obj.forwardlik, :, 1:nnodes) - ltw = obj.priorltw - res = similar(bkd) # first: hold the cumulative logsumexp of bkd + frd + ltw - fill!(res, -Inf64) - nr = length(obj.ratemodel.ratemultiplier) - lrw = obj.ratemodel.lograteweight - for t in 1:length(obj.displayedtree) - ltprior = ltw[t] - for ri in 1:nr - # update forward & directional likelihoods - discrete_corelikelihood_trait!(obj,t,trait,ri) - # update backward likelihoods - discrete_backwardlikelihood_trait!(obj,t,ri) - # P{state i at node n} ∝ bkd[i,n] * frd[i,n] given tree & rate: - # res = logaddexp(res, ltw[t] + lrw[ri] + bkd + frd) - broadcast!(logaddexp, res, res, (ltprior + lrw[ri]) .+ bkd .+ frd) - end - end - # normalize the results at each node: p_i / sum(p_j over all states j) - traitloglik = logsumexp(res[:,1]) # sum p_j at node 1 or at any node = loglikelihood - res .= exp.(res .- traitloglik) - nodestringlabels = Vector{String}(undef, nnodes) - for n in obj.net.node - nodestringlabels[n.number] = (n.name == "" ? string(n.number) : n.name) - end - dat = DataFrame(transpose(res), Symbol.(getlabels(obj.model))) - insertcols!(dat, 1, :nodenumber => collect(1:nnodes), makeunique=true) - insertcols!(dat, 2, :nodelabel => nodestringlabels, makeunique=true) - return dat -end - -""" - discrete_backwardlikelihood_trait!(obj::SSM, tree::Integer, ri::Integer) - -Update and return the backward likelihood (last argument `backwardlik`) -assuming rate category `ri` and tree index `tree`, -using current forward and backwards likelihoods in `obj`: -these depend on the trait (or site) given to the last call to -`discrete_corelikelihood_trait!`. -Used by `ancestralStateReconstruction`. - -**warning**: assume correct transition probabilities. -""" -function discrete_backwardlikelihood_trait!(obj::SSM, t::Integer, ri::Integer) - backwardlik = obj.backwardlik - directlik = obj.directlik - tree = obj.displayedtree[t] - k = nstates(obj.model) - fill!(backwardlik, 0.0) # re-initialize for each trait, each iteration - bkwtmp = Vector{Float64}(undef, k) # to hold bkw lik without parent edge transition - if typeof(obj.model) <: NASM - logprior = log.(stationary(obj.model)) - else #trait models - logprior = [-log(k) for i in 1:k] # uniform prior at root - end - for ni in 1:length(tree.nodes_changed) # pre-order traversal to calculate backwardlik - n = tree.nodes_changed[ni] - nnum = n.number - if ni == 1 # n is the root - backwardlik[:,nnum] = logprior - else - pe = getparentedge(n) - pn = getparent(pe) - bkwtmp[:] = backwardlik[:,pn.number] # use bktmp's original memory - for se in pn.edge - if se != pe && pn == getparent(se) # then se is sister edge to pe - bkwtmp .+= view(directlik, :,se.number) - end - end - lt = view(obj.logtrans, :,:,pe.number,ri) - for j in 1:k # state at node n - backwardlik[j,nnum] = logsumexp(bkwtmp + view(lt,:,j)) - end - end - end - return backwardlik -end - -""" - learnlabels(model::Symbol, dat::DataFrame) - -Return unique non-missing values in `dat`, and check that these labels -can be used to construct of substitution model of type `model`. - -# examples: - -```jldoctest -julia> using DataFrames - -julia> dat = DataFrame(trait1 = ["A", "C", "A", missing]); # 4×1 DataFrame - -julia> PhyloNetworks.learnlabels(:BTSM, dat) -2-element Vector{String}: - "A" - "C" - -julia> PhyloNetworks.learnlabels(:JC69, dat) -2-element Vector{String}: - "A" - "C" -``` -""" -function learnlabels(modSymbol::Symbol, dat::AbstractDataFrame) - labels = mapreduce(x -> unique(skipmissing(x)), union, eachcol(dat)) - if modSymbol == :BTSM - length(labels) == 2 || error("Binary Trait Substitution Model supports traits with two states. These data have do not have two states.") - elseif modSymbol == :TBTSM - unique(skipmissing(dat[!,1])) == 2 && unique(skipmissing(dat[!,2]) == 2) || - error("Two Binary Trait Substitution Model supports two traits with two states each.") - elseif modSymbol in [:HKY85, :JC69] - typeof(labels) == Array{DNA,1} || - (typeof(labels) == Array{Char,1} && all(in.(uppercase.(labels), "-ABCDGHKMNRSTVWY"))) || - (typeof(labels) == Array{String,1} && all(occursin.(uppercase.(labels), "-ABCDGHKMNRSTVWY"))) || - # "ACGT" would dissallow ambiguous sites - error("$modSymbol requires that trait data are dna bases A, C, G, and T") - end - return labels -end - -""" - startingrate(net) - -Estimate an evolutionary rate appropriate for the branch lengths in the network, -which should be a good starting value before optimization in `fitdiscrete`, -assuming approximately 1 change across the entire tree. -If all edge lengths are missing, set starting rate to 1/(number of taxa). -""" -function startingrate(net::HybridNetwork) - totaledgelength = 0.0 - for e in net.edge - if e.length > 0.0 - totaledgelength += e.length - end - end - if totaledgelength == 0.0 # as when all edge lengths are missing - totaledgelength = net.numTaxa - end - return 1.0/totaledgelength -end - -""" - defaultsubstitutionmodel(network, modsymbol::Symbol, data::DataFrame, - siteweights::Vector) - -Return a statistical substitution model (SSM) with appropriate state labels -and a rate appropriate for the branch lengths in `net` -(see [`startingrate`](@ref)). -The `data` frame must have the actual trait/site data in columns 2 and up, -as when the species names are in column 1. -For DNA data, the relative rate model is returned, with a -stationary distribution equal to the empirical frequencies. -""" -function defaultsubstitutionmodel(net::HybridNetwork, modsymbol::Symbol, data::DataFrame, - siteweights=repeat([1.], inner=size(data,2))::AbstractVector) - rate = startingrate(net) - actualdat = view(data, :, 2:size(data,2)) - labels = learnlabels(modsymbol, actualdat) - if modsymbol == :JC69 - return JC69([1.0], true) # 1.0 instead of rate because relative version - elseif modsymbol == :HKY85 # transition/transversion rate ratio - return HKY85([1.0], empiricalDNAfrequencies(actualdat, siteweights), true) - elseif modsymbol == :ERSM - return EqualRatesSubstitutionModel(length(labels), rate, labels); - elseif modsymbol == :BTSM - return BinaryTraitSubstitutionModel([rate, rate], labels) - elseif modsymbol == :TBTSM - return TwoBinaryTraitSubstitutionModel([rate, rate, rate, rate, rate, - rate, rate, rate], labels) - else - error("model $modsymbol is unknown or not implemented yet") - end -end - -# fixit: new type for two (dependent) binary traits -# need new algorithm for model at hybrid nodes: displayed trees aren't enough diff --git a/src/types.jl b/src/types.jl index bff62c6cc..1a2b8f0d9 100644 --- a/src/types.jl +++ b/src/types.jl @@ -21,63 +21,85 @@ Data structure for an edge and its various attributes. Most notably: remains unchanged when the network is modified, with a nearest neighbor interchange for example - `node`: vector of [`Node`](@ref)s, normally just 2 of them -- `isChild1` (boolean): `true` if `node[1]` is the child node of the edge, +- `ischild1` (boolean): `true` if `node[1]` is the child node of the edge, false if `node[1]` is the parent node of the edge - `length`: branch length - `hybrid` (boolean): whether the edge is a tree edge or a hybrid edge - (in which case `isChild1` is important, even if the network is semi-directed) + (in which case `ischild1` is important, even if the network is semi-directed) - `gamma`: proportion of genetic material inherited by the child node via the edge; 1.0 for a tree edge -- `isMajor` (boolean): whether the edge is the major path to the child node; +- `ismajor` (boolean): whether the edge is the major path to the child node; `true` for tree edges, since a tree edge is the only path to its child node; normally true if `gamma>0.5`. +- `containroot` (boolean): is the interior of this edge a valid rooting position? + That is, if we added a node on the edge, could we direct all edges away from + this new node to root the semidirected network and get a valid rooted network? and other fields, used very internally """ mutable struct EdgeT{T<:ANode} number::Int - length::Float64 #default 1.0 - hybrid::Bool - y::Float64 # exp(-t), cannot set in constructor for congruence - z::Float64 # 1-y , cannot set in constructor for congruence - gamma::Float64 # set to 1.0 for tree edges, hybrid?gamma:1.0 + length::Float64 # default 1.0 + hybrid::Bool # default: false + y::Float64 # exp(-length), cannot set in constructor for congruence + z::Float64 # 1-y, cannot set in constructor for congruence + gamma::Float64 # default: 1.0 for tree edges, gamma for hybrid edges node::Vector{T} - isChild1::Bool # used for hybrid edges to set the direction (default true) - isMajor::Bool # major edge treated as tree edge for network traversal + ischild1::Bool # default: true. used to fix the direction of hybrid edges. + ismajor::Bool # major edge treated as tree edge for network traversal # true if gamma>.5, or if it is the original tree edge - inCycle::Int # = Hybrid node number if this edge is part of a cycle created by such hybrid node - # -1 if not part of cycle. used to add new hybrid edge. updated after edge is part of a network - containRoot::Bool # true if this edge can contain a root given the direction of hybrid edges - # used to add new hybrid edge. updated after edge is part of a network - istIdentifiable::Bool # true if the parameter t (length) for this edge is identifiable as part of a network - # updated after part of a network - fromBadDiamondI::Bool # true if the edge came from deleting a bad diamond I hybridization + inte1::Int # default: -1. used in SNaQ for cycle number if level-1 + containroot::Bool # default: true + boole1::Bool # default: true + boole2::Bool # default: false end -# outer constructors: ensure congruence among (length, y, z) and (gamma, hybrid, isMajor), and size(node)=2 +# outer constructors: ensure congruence among (length, y, z) and (gamma, hybrid, ismajor), and size(node)=2 function EdgeT{T}(number::Int, length::Float64=1.0) where {T<:ANode} y = exp(-length) EdgeT{T}(number,length,false,y,1.0-y,1.,T[],true,true,-1,true,true,false) end -function EdgeT{T}(number::Int, length::Float64,hybrid::Bool,gamma::Float64,isMajor::Bool=(!hybrid || gamma>0.5)) where {T<:ANode} +function EdgeT{T}( + number::Int, + length::Float64, + hybrid::Bool, + gamma::Float64, + ismajor::Bool=(!hybrid || gamma>0.5) +) where {T<:ANode} y = exp(-length) - EdgeT{T}(number,length,hybrid,y,1.0-y, hybrid ? gamma : 1.,T[],true,isMajor,-1,!hybrid,true,false) -end -function EdgeT{T}(number::Int, length::Float64,hybrid::Bool,gamma::Float64,node::Vector{T}) where {T<:ANode} + EdgeT{T}(number,length,hybrid,y,1.0-y, hybrid ? gamma : 1.,T[],true,ismajor,-1,!hybrid,true,false) +end +function EdgeT{T}( + number::Int, + length::Float64, + hybrid::Bool, + gamma::Float64, + node::Vector{T} +) where {T<:ANode} size(node,1) == 2 || error("vector of nodes must have exactly 2 values") y = exp(-length) Edge{T}(number,length,hybrid,y,1.0-y, hybrid ? gamma : 1., node,true, !hybrid || gamma>0.5, -1,!hybrid,true,false) end -function EdgeT{T}(number::Int, length::Float64,hybrid::Bool,gamma::Float64,node::Vector{T},isChild1::Bool, inCycle::Int, containRoot::Bool, istIdentifiable::Bool) where {T<:ANode} +function EdgeT{T}( + number::Int, + length::Float64, + hybrid::Bool, + gamma::Float64, + node::Vector{T}, + ischild1::Bool, + inte1::Int, + containroot::Bool, + boole1::Bool +) where {T<:ANode} size(node,1) == 2 || error("vector of nodes must have exactly 2 values") y = exp(-length) Edge{T}(number,length,hybrid,y,1.0-y, - hybrid ? gamma : 1., node,isChild1, !hybrid || gamma>0.5, - inCycle,containRoot,istIdentifiable,false) + hybrid ? gamma : 1., node, ischild1, !hybrid || gamma>0.5, + inte1, containroot, boole1, false) end -# warning: gammaz, inCycle, isBadTriangle/Diamond updated until the node is part of a network +# warning: fvalue, intn1, booln6/booln2 updated until the node is part of a network """ Node(number, leaf) Node(number, leaf, hybrid) @@ -95,65 +117,50 @@ Data structure for a node and its various attributes. Most notably: potentially more if the node has a polytomy - `hybrid` (boolean): whether the node is a hybrid node (with 2 or more parents) or a tree node (with a single parent) - -Other more internal attributes include: - -- `isBadDiamondI` and `isBadDiamondII` (booleans): whether the node is a - hybrid node where the reticulation forms a cycle of 4 nodes (diamond), - and where both parents of the hybrid nodes are connected to a leaf. - In a bad diamond of type I, the hybrid node itself is also connected - to a leaf but the common neighbor of the 2 hybrid's parents is not connected - to a leaf. - In a bad diamond of type II, the hybrid node has an internal node as child, - and the common neighbor of the 2 hybrid's parents is connected to a leaf. -- `isBadTriangle`, `isVeryBadTriangle` and `isExtBadTriangle` (booleans): - true if the reticulation forms a cycle of 3 nodes (triangle) and - depending on the number of leaves attached these 3 nodes. The triangle means - that the 2 parents of the hybrid node are directly related: - one is the child of the other. `isBadTriangle` is true if the triangle is - "good", as per Solís-Lemus & Ané (2016), that is, if all 3 nodes in the cycle - are not connected to any leaves (the reticulation is detectable from quartet - concordance factors, even though all branch lengths are not identifiable). - `isVeryBadTriangle` is true if 2 (or all) of the 3 nodes are connected to a - leaf, in which case the reticulation is undetectable from unrooted gene tree - topologies (thus it's best to exclude these reticulations from a search). - `isBadTriangle` is true if exactly 1 of the 3 nodes is connected to a leaf. - -For details see Solís-Lemus & Ané (2016, doi:10.1371/journal.pgen.1005896) """ mutable struct Node <: ANode number::Int leaf::Bool hybrid::Bool - gammaz::Float64 # notes file for explanation. gammaz if tree node, gamma2z if hybrid node. - # updated after node is part of network with updateGammaz! + fvalue::Float64 # -1.0 by default. re-usable. used for gammaz or gamma2z in SNaQ edge::Vector{EdgeT{Node}} - hasHybEdge::Bool #is there a hybrid edge in edge? only needed when hybrid=false (tree node) - isBadDiamondI::Bool # for hybrid node, is it bad diamond case I, update in updateGammaz! - isBadDiamondII::Bool # for hybrid node, is it bad diamond case II, update in updateGammaz! - isExtBadTriangle::Bool # for hybrid node, is it extremely bad triangle, udpate in updateGammaz! - isVeryBadTriangle::Bool # for hybrid node, is it very bad triangle, udpate in updateGammaz! - isBadTriangle::Bool # for hybrid node, is it very bad triangle, udpate in updateGammaz! - inCycle::Int # = hybrid node if this node is part of a cycle created by such hybrid node, -1 if not part of cycle - prev::Union{Nothing,Node} # previous node in cycle, used in updateInCycle. set to "nothing" to begin with - k::Int # num nodes in cycle, only stored in hybrid node, updated after node becomes part of network - # default -1 - typeHyb::Int8 # type of hybridization (1,2,3,4, or 5), needed for quartet network only. default -1 - name::AbstractString + booln1::Bool # default: is incident to a hybrid edge? + booln2::Bool # reusable booleans, for nodes. false by default + booln3::Bool + booln4::Bool + booln5::Bool + booln6::Bool + intn1::Int # default -1. sometimes used for cycle number if level-1 + prev::Union{Nothing,Node} # for traversal algorithms that track previous node + intn2::Int # default -1 + int8n3::Int8 # default -1 + name::AbstractString # default "" end const Edge = EdgeT{Node} Node() = Node(-1,false,false,-1.,Edge[],false,false,false,false,false,false,-1,nothing,-1,-1,"") Node(number::Int, leaf::Bool, hybrid::Bool=false) = Node(number,leaf,hybrid,-1.,Edge[],hybrid,false,false,false,false,false,-1.,nothing,-1,-1,"") -# set hasHybEdge depending on edge: +# set booln1 depending on edge: Node(number::Int, leaf::Bool, hybrid::Bool, edge::Vector{Edge}) = Node(number,leaf,hybrid,-1.,edge,any(e->e.hybrid,edge),false,false,false,false,false,-1.,nothing,-1,-1,"") -Node(number::Int, leaf::Bool, hybrid::Bool,gammaz::Float64, edge::Vector{Edge}) = Node(number,leaf,hybrid,gammaz,edge,any(e->e.hybrid, edge),false,false,false,false,false,-1.,nothing,-1,-1,"") +Node(number::Int, leaf::Bool, hybrid::Bool,fvalue::Float64, edge::Vector{Edge}) = Node(number,leaf,hybrid,fvalue,edge,any(e->e.hybrid, edge),false,false,false,false,false,-1.,nothing,-1,-1,"") + +""" + Partition + +Data structure for a collection of edges. Used in SNaQ for groups of edges +in the same cycle. +Fields: + +- `cycle`: vector of `Int` +- `edges`: vector of `Edge` -# partition type +Todo: use this to store the output of the blob decomposition, because +biconnected components partition edges. +""" mutable struct Partition - cycle::Vector{Int} #hybrid node number for cycle (or cycles) - edges::Vector{Edge} #edges in partition + cycle::Vector{Int} # hybrid node number for cycle (or cycles) + edges::Vector{Edge} end abstract type Network end @@ -167,43 +174,47 @@ abstract type Network end Subtype of abstract `Network` type. Explicit network or tree with the following attributes: -- numTaxa (taxa are tips, i.e. nodes attached to a single edge) -- numNodes (total number of nodes: tips and internal nodes) -- numEdges -- numHybrids (number of hybrid nodes) -- edge (array of Edges) -- node (array of Nodes) -- root (index of root in vector 'node'. May be artificial, for printing and traversal purposes only.) -- hybrid (array of Nodes: those are are hybrid nodes) -- leaf (array of Nodes: those that are leaves) -- loglik (score after fitting network to data, i.e. negative log pseudolik for SNaQ) -- isRooted (true or false) +- `numtaxa`: number of taxa, that is, number of are leaves (or tips). + Leaves are required to be attached to a single edge. +- `numnodes`: total number of nodes: tips and internal nodes +- `numedges`: total number of edges +- `numhybrids`: total number of hybrid nodes +- `edge`: vector of Edges +- `node`: vector of Nodes +- `rooti`: index of the root in vector 'node'. May be artificial in a semidirected + network, but is necessary for printing and traversal purposes. +- `hybrid`: vector of Nodes: those are are hybrid nodes +- `leaf`: vector of Nodes: those that are leaves +- `fscore`: score after fitting network to data, i.e. parsimony score, or + multipe of the negative log pseudodeviance for SNaQ +- `isrooted`: true or false +- `partition`: vector of `Partition` """ mutable struct HybridNetwork <: Network - numTaxa::Int # cannot set in constructor for congruence - numNodes::Int - numEdges::Int + numtaxa::Int # cannot set in constructor for congruence + numnodes::Int + numedges::Int node::Array{Node,1} edge::Array{Edge,1} - root::Int # node[root] is the root node, default 1 + rooti::Int # node[rooti] is the root node, default 1 names::Array{String,1} # translate table for taxon names --but also includes hybrid names... hybrid::Array{Node,1} # array of hybrid nodes in network - numHybrids::Int # number of hybrid nodes - cladewiseorder_nodeIndex::Vector{Int} # index in 'node' for "cladewise" preorder in main tree - visited::Array{Bool,1} # reusable array of booleans - edges_changed::Array{Edge,1} # reusable array of edges - nodes_changed::Array{Node,1} # reusable array of nodes. used for preorder traversal + numhybrids::Int # number of hybrid nodes + vec_int1::Vector{Int} # vector of integers, e.g. to get "cladewise" preorder in main tree + vec_bool::Array{Bool,1} + vec_edge::Array{Edge,1} + vec_node::Array{Node,1} # reusable, but used for preorder traversal leaf::Array{Node,1} # array of leaves - ht::Vector{Float64} # vector of parameters to optimize - numht::Vector{Int} # vector of number of the hybrid nodes and edges in ht e.g. [3,6,8,...], 2 hybrid nodes 3,6, and edge 8 is the 1st identifiable - numBad::Int # number of bad diamond I hybrid nodes, set as 0 - hasVeryBadTriangle::Bool # true if the network has extremely/very bad triangles that should be ignored - index::Vector{Int} #index in net.edge, net.node of elements in net.ht to make updating easy - loglik::Float64 # value of the min -loglik after optBL - blacklist::Vector{Int} # reusable array of integers, used in afterOptBL + vec_float::Vector{Float64} + vec_int2::Vector{Int} + intg1::Int + boolg1::Bool + vec_int3::Vector{Int} + fscore::Float64 # in SNaQ: min -loglik that was found + vec_int4::Vector{Int} partition::Vector{Partition} # to choose edges from a partition only to avoid intersecting cycles - cleaned::Bool # attribute to know if the network has been cleaned after readm default false - isRooted::Bool # to know if network is rooted, e.g. after directEdges! (which updates isChild1 of each edge) + boolg2::Bool # default false + isrooted::Bool # is network rooted? otherwise: semidirected fixit: check how it's used # inner constructor function HybridNetwork(node::Array{Node,1},edge::Array{Edge,1}) hybrid=Node[]; @@ -212,333 +223,18 @@ mutable struct HybridNetwork <: Network if n.hybrid push!(hybrid,n); end if n.leaf push!(leaf, n); end end - new(size(leaf,1),size(node,1),size(edge,1),node,edge,1,[],hybrid,size(hybrid,1), #numTaxa,...,numHybrids - [],[],[],[],leaf,[],[], #cladewiseorder,...,numht - 0,false,[],0,[],[],false,false) #numBad... + new(size(leaf,1),size(node,1),size(edge,1),node,edge,1,[],hybrid,size(hybrid,1), #numtaxa,...,numhybrids + [],[],[],[],leaf,[],[], #cladewiseorder,...,vec_int2 + 0,false,[],0,[],[],false,false) #intg1... end - HybridNetwork() = new(0,0,0,[],[],0,[],[],0, # numTaxa ... numHybrid + HybridNetwork() = new(0,0,0,[],[],0,[],[],0, # numtaxa ... numHybrid [],[],[],[],[],[],[], # cladewiseorder... - 0,false,[],0,[],[],false,false); # numBad ... -end - -# type created from a HybridNetwork only to extract a given quartet -""" - QuartetNetwork(net::HybridNetwork) - -Subtype of `Network` abstract type. -A `QuartetNetwork` object is an internal type used to calculate the -expected CFs of quartets on a given network. -Attributes of the `QuartetNetwork` objects need not be updated at a given time (see below). - -The procedure to calculate expected CFs for a given network is as follows: -1. A `QuartetNetwork` object is created for each `Quartet` using - `extractQuartet!(net,d)` for `net::HybridNetwork` and `d::DataCF` -2. The vector `d.quartet` has all the `Quartet` objects, each with a `QuartetNetwork` - object (`q.qnet`). Attibutes in `QuartetNetwork` are not updated at this point -3. Attributes in `QuartetNetwork` are partially updated when calculating the - expected CF (`calculateExpCFAll!`). To calculate the expected CF for this quartet, - we need to update the attributes: `which`, `typeHyb`, `t1`, `split`, `formula`, `expCF`. - To do this, we need to modify the `QuartetNetwork` object (i.e. merge edges,...). - But we do not want to modify it directly because it is connected to the original - `net` via a map of the edges and nodes, so we use a deep copy: - `qnet=deepcopy(q.qnet)` and then `calculateExpCFAll!(qnet)`. - Attributes that are updated on the original `QuartetNetwork` object `q.qnet` are: - - `q.qnet.hasEdge`: array of booleans of length equal to `net.edge` that shows which identifiable edges and gammas of `net` (`net.ht`) are in `qnet` (and still identifiable). Note that the first elements of the vector correspond to the gammas. - - `q.qnet.index`: length should match the number of trues in `qnet.hasEdge`. It has the indexes in `qnet.edge` from the edges in `qnet.hasEdge`. Note that the first elements of the vector correspond to the gammas. - - `q.qnet.edge`: list of edges in `QuartetNetwork`. Note that external edges in `net` are collapsed when they appear in `QuartetNetwork`, so only internal edges map directly to edges in `net` - - `q.qnet.expCF`: expected CF for this `Quartet` - - -Why not modify the original `QuartetNetwork`? We wanted to keep the original -`QuartetNetwork` stored in `DataCF` with all the identifiable edges, to be able -to determine if this object had been changed or not after a certain optimization. - -The process is: - -1. Deep copy of full network to create `q.qnet` for `Quartet q`. - This `QuartetNetwork` object has only 4 leaves now, but does not have merged edges - (the identifiable ones) so that we can correspond to the edges in net. - This `QuartetNetwork` does not have other attributes updated. -2. For the current set of branch lengths and gammas, we can update the attributes - in `q.qnet` to compute the expected CF. The functions that do this will "destroy" - the `QuartetNetwork` object by merging edges, removing nodes, etc... So, we do - this process in `qnet=deepcopy(q.qnet)`, and at the end, only update `q.qnet.expCF`. -3. After we optimize branch lengths in the full network, we want to update the - branch lengths in `q.qnet`. The edges need to be there (which is why we do - not want to modify this `QuartetNetwork` object by merging edges), and - we do not do a deep-copy of the full network again. We only change the values - of branch lengths and gammas in `q.qnet`, and we can re-calculate the expCF - by creating a deep copy `qnet=deepcopy(q.qnet)` and run the other functions - (which merge edges, etc) to get the `expCF`. - -Future work: there are definitely more efficient ways to do this (without the deep copies). -In addition, currently edges that are no longer identifiable in `QuartetNetwork` -do not appear in `hasEdge` nor `index`. Need to study this. - -```jldoctest -julia> net0 = readTopology("(s17:13.76,(((s3:10.98,(s4:8.99,s5:8.99)I1:1.99)I2:0.47,(((s6:2.31,s7:2.31)I3:4.02,(s8:4.97,#H24:0.0::0.279)I4:1.36)I5:3.64,((s9:8.29,((s10:2.37,s11:2.37)I6:3.02,(s12:2.67,s13:2.67)I7:2.72)I8:2.89)I9:0.21,((s14:2.83,(s15:1.06,s16:1.06)I10:1.78)I11:2.14)#H24:3.52::0.72)I12:1.47)I13:1.48)I14:1.26,(((s18:5.46,s19:5.46)I15:0.59,(s20:4.72,(s21:2.40,s22:2.40)I16:2.32)I17:1.32)I18:2.68,(s23:8.56,(s1:4.64,s2:4.64)I19:3.92)I20:0.16)I21:3.98)I22:1.05);"); - -julia> net = readTopologyLevel1(writeTopology(net0)) ## need level1 attributes for functions below -HybridNetwork, Un-rooted Network -46 edges -46 nodes: 23 tips, 1 hybrid nodes, 22 internal tree nodes. -tip labels: s17, s3, s4, s5, ... -(s4:8.99,s5:8.99,(s3:10.0,((((s6:2.31,s7:2.31)I3:4.02,(s8:4.97,#H24:0.0::0.279)I4:1.36)I5:3.64,((s9:8.29,((s10:2.37,s11:2.37)I6:3.02,(s12:2.67,s13:2.67)I7:2.72)I8:2.89)I9:0.21,((s14:2.83,(s15:1.06,s16:1.06)I10:1.78)I11:2.14)#H24:3.52::0.721)I12:1.47)I13:1.48,((((s18:5.46,s19:5.46)I15:0.59,(s20:4.72,(s21:2.4,s22:2.4)I16:2.32)I17:1.32)I18:2.68,(s23:8.56,(s1:4.64,s2:4.64)I19:3.92)I20:0.16)I21:3.98,s17:10.0)I22:1.26)I14:0.47)I2:1.99)I1; - -julia> q1 = Quartet(1,["s1", "s16", "s18", "s23"],[0.296,0.306,0.398]) -number: 1 -taxon names: ["s1", "s16", "s18", "s23"] -observed CF: [0.296, 0.306, 0.398] -pseudo-deviance under last used network: 0.0 (meaningless before estimation) -expected CF under last used network: Float64[] (meaningless before estimation) - -julia> qnet = PhyloNetworks.extractQuartet!(net,q1) -taxa: ["s1", "s16", "s18", "s23"] -number of hybrid nodes: 1 - -julia> sum([e.istIdentifiable for e in net.edge]) ## 23 identifiable edges in net -23 - -julia> idedges = [ee.number for ee in net.edge[[e.istIdentifiable for e in net.edge]]]; - -julia> print(idedges) -[5, 6, 9, 11, 12, 13, 17, 20, 21, 22, 26, 27, 28, 29, 30, 31, 34, 38, 39, 40, 44, 45, 46] - -julia> length(qnet.hasEdge) ## 24 = 1 gamma + 23 identifiable edges -24 - -julia> sum(qnet.hasEdge) ## 8 = 1 gamma + 7 identifiable edges in qnet -8 - -julia> print(idedges[qnet.hasEdge[2:end]]) ## 7 id. edges: [12, 13, 29, 30, 31, 45, 46] -[12, 13, 29, 30, 31, 45, 46] - -julia> qnet.edge[qnet.index[1]].number ## 11 = minor hybrid edge -11 -``` -""" -mutable struct QuartetNetwork <: Network - numTaxa::Int - numNodes::Int - numEdges::Int - node::Array{Node,1} - edge::Array{Edge,1} - hybrid::Array{Node,1} # array of hybrid nodes in network - leaf::Array{Node,1} # array of leaves - numHybrids::Int # number of hybrid nodes - hasEdge::Array{Bool,1} # array of boolean with all the original identifiable edges of HybridNetwork and gammas (net.ht) - quartetTaxon::Array{String,1} # the quartet taxa in the order it represents. Points to same array as its Quartet.taxon - which::Int8 # 0 it tree quartet, 1 is equivalent to tree quartet and 2 if two minor CF different, default -1 - typeHyb::Array{Int8,1} #array with the type of hybridization of each hybrid node in the quartet - t1::Float64 # length of internal edge, used when qnet.which=1, default = -1 - names::Array{String,1} # taxon and node names, same order as in network.node - split::Array{Int8,1} # split that denotes to which side each leaf is from the split, i.e. [1,2,2,1] means that leaf1 and 4 are on the same side of the split, default -1,-1,-1,-1 - formula::Array{Int8,1} # array for qnet.which=1 that indicates if the expCf is major (1) or minor (2) at qnet.expCF[i] depending on qnet.formula[i], default -1,-1,-1 - expCF::Array{Float64,1} # three expected CF in order 12|34, 13|24, 14|23 (matching obsCF from qnet.quartet), default [0,0,0] - indexht::Vector{Int} # index in net.ht for each edge in qnet.ht - changed::Bool # true if the expCF would be changed with the current parameters in the optimization, to recalculate, default true - index::Vector{Int} # index in qnet.edge (qnet.node for gammaz) of the members in qnet.indexht to know how to find quickly in qnet - # inner constructor - function QuartetNetwork(net::HybridNetwork) - net2 = deepcopy(net); #fixit: maybe we dont need deepcopy of all, maybe only arrays - new(net2.numTaxa,net2.numNodes,net2.numEdges,net2.node,net2.edge,net2.hybrid,net2.leaf,net2.numHybrids, [true for e in net2.edge],[],-1,[], -1.,net2.names,Int8[-1,-1,-1,-1],Int8[-1,-1,-1],[0,0,0],[],true,[]) - end - QuartetNetwork() = new(0,0,0,[],[],[],[],0,[],[],-1,[],-1.0,[],[],[],[],[],true,[]) -end - -abstract type AQuartet end - -""" - Quartet - -type that saves the information on a given 4-taxon subset. It contains the following attributes: - -- number: integer -- taxon: vector of taxon names, like t1 t2 t3 t4 -- obsCF: vector of observed CF, in order 12|34, 13|24, 14|23 -- logPseudoLik -- ngenes: number of gene trees used to compute the observed CF; -1.0 if unknown -- qnet: [`QuartetNetwork`](@ref), which saves the expCF after snaq estimation to - emphasize that the expCF depend on a specific network, not the data - -see also: [`QuartetT`](@ref) for quartet with data of user-defined type `T`, -using a mapping between quartet indices and quartet taxa. -""" -mutable struct Quartet <: AQuartet - number::Int - taxon::Array{String,1} # taxa 1234. qnet.quartetTaxon points to the same array. - obsCF::Array{Float64,1} # three observed CF in order 12|34, 13|24, 14|23 - qnet::QuartetNetwork # quartet network for the current network (want to keep as if private attribute) - logPseudoLik::Float64 # log pseudolik value for the quartet. 0.0 by default - ngenes::Float64 # number of gene trees used to compute the obsCV, default -1.; Float in case ngenes is average - # inner constructor: to guarantee obsCF are only three and add up to 1 - function Quartet(number::Integer,t1::AbstractString,t2::AbstractString,t3::AbstractString,t4::AbstractString,obsCF::Array{Float64,1}) - size(obsCF,1) != 3 ? error("observed CF vector should have size 3, not $(size(obsCF,1))") : nothing - 0.99 < sum(obsCF) < 1.02 || @warn "observed CF should add up to 1, not $(sum(obsCF))" - new(number,[t1,t2,t3,t4],obsCF,QuartetNetwork(),0.0,-1.0); - end - function Quartet(number::Integer,t1::Array{String,1},obsCF::Array{Float64,1}) - size(obsCF,1) != 3 ? error("observed CF vector should have size 3, not $(size(obsCF,1))") : nothing - 0.99< sum(obsCF) < 1.02 || @warn "observed CF should add up to 1, not $(sum(obsCF))" - size(t1,1) != 4 ? error("array of taxa should have size 4, not $(size(t1,1))") : nothing - 0.0 <= obsCF[1] <= 1.0 || error("obsCF must be between (0,1), but it is $(obsCF[1]) for $(t1)") - 0.0 <= obsCF[2] <= 1.0 || error("obsCF must be between (0,1), but it is $(obsCF[2]) for $(t1)") - 0.0 <= obsCF[3] <= 1.0 || error("obsCF must be between (0,1), but it is $(obsCF[3]) for $(t1)") - new(number,t1,obsCF,QuartetNetwork(),0.0,-1.0); - end - Quartet() = new(0,[],[],QuartetNetwork(),0.0,-1.0) -end - -""" -QuartetT{T} - -Generic type for 4-taxon sets. Fields: -- `number`: rank of the 4-taxon set -- `taxonnumber`: static vector of 4 integers, assumed to be distinct and sorted -- `data`: object of type `T` - -For easier look-up, a unique mapping is used between the rank (`number`) of a -4-taxon set and its 4 taxa (see [`quartetrank`](@ref) and [`nchoose1234`](@ref)): - -rank-1 = (t1-1) choose 1 + (t2-1) choose 2 + (t3-1) choose 3 + (t4-1) choose 4 - -# examples - -```jldoctest -julia> nCk = PhyloNetworks.nchoose1234(5) -6×4 Matrix{Int64}: - 0 0 0 0 - 1 0 0 0 - 2 1 0 0 - 3 3 1 0 - 4 6 4 1 - 5 10 10 5 - -julia> PhyloNetworks.QuartetT(1,3,4,6, [.92,.04,.04, 100], nCk) -4-taxon set number 8; taxon numbers: 1,3,4,6 -data: [0.92, 0.04, 0.04, 100.0] -``` -""" -struct QuartetT{T} <: AQuartet where T - number::Int - taxonnumber::StaticArrays.SVector{4,Int} - data::T -end -function Base.show(io::IO, obj::QuartetT{T}) where T - disp = "4-taxon set number $(obj.number); taxon numbers: " - disp *= join(obj.taxonnumber,",") - disp *= "\ndata: " - print(io, disp) - print(io, obj.data) -end -function QuartetT(tn1::Int,tn2::Int,tn3::Int,tn4::Int, data::T, nCk::Matrix, checksorted=true::Bool) where T - if checksorted - (tn1 nCk = PhyloNetworks.nchoose1234(5) -6×4 Matrix{Int64}: - 0 0 0 0 - 1 0 0 0 - 2 1 0 0 - 3 3 1 0 - 4 6 4 1 - 5 10 10 5 - -julia> PhyloNetworks.quartetrank([1,2,3,4], nCk) -1 - -julia> PhyloNetworks.quartetrank([3,4,5,6], nCk) -15 -``` -""" -@inline function quartetrank(tnum::AbstractVector, nCk::Matrix) - quartetrank(tnum..., nCk) -end -@inline function quartetrank(t1::Int, t2::Int, t3::Int, t4::Int, nCk::Matrix) - # rank-1 = t1-1 choose 1 + t2-1 choose 2 + t3-1 choose 3 + t4-1 choose 4 - return nCk[t1,1] + nCk[t2,2] + nCk[t3,3] + nCk[t4,4] + 1 -end - -""" - nchoose1234(nmax) - -`nmax+1 x 4` matrix containing the binomial coefficient -"n choose k" in row `n+1` and column `k`. In other words, -`M[i,k]` gives "i-1 choose k". It is useful to store these -values and look them up to rank (a large number of) 4-taxon sets: -see [`quartetrank`](@ref). -""" -function nchoose1234(nmax::Int) - # compute nC1, nC2, nC3, nC4 for n in [0, nmax]: used for ranking quartets - M = Matrix{Int}(undef, nmax+1, 4) - for i in 1:(nmax+1) - M[i,1] = i-1 # n choose 1 = n. row i is for n=i-1 - end - M[1,2:4] .= 0 # 0 choose 2,3,4 = 0 - for i in 2:(nmax+1) - for k in 2:4 # to choose k items in 1..n: the largest could be n, else <= n-1 - M[i,k] = M[i-1,k-1] + M[i-1,k] - end - end - return M -end - -# Data on quartet concordance factors ------- - -""" - DataCF - -type that contains the following attributes: - -- quartet (vector of Quartets) -- numQuartets -- tree (vector of trees: empty if a table of CF was input instead of list of trees) -- numTrees (-1 if a table CF was input instead of list of trees) -- repSpecies (taxon names that were repeated in table of CF or input gene trees: used inside snaq for multiple alleles case) - -The list of Quartet may be accessed with the attribute .quartet. -If the input was a list of trees, the HybridNetwork's can be accessed with the attribute .tree. -For example, if the DataCF object is named d, d.quartet[1] will show the first quartet -and d.tree[1] will print the first input tree. -""" -mutable struct DataCF # fixit - quartet::Array{Quartet,1} # array of quartets read from CF output table or list of quartets in file - numQuartets::Integer # number of quartets - tree::Vector{HybridNetwork} #array of input gene trees - numTrees::Integer # number of gene trees - repSpecies::Vector{String} #repeated species in the case of multiple alleles - DataCF(quartet::Array{Quartet,1}) = new(quartet,length(quartet),[],-1,[]) - DataCF(quartet::Array{Quartet,1},trees::Vector{HybridNetwork}) = new(quartet,length(quartet),trees,length(trees),[]) - DataCF() = new([],0,[],-1,[]) -end - -# aux type for the updateBL function -mutable struct EdgeParts - edgenum::Int - part1::Vector{Node} - part2::Vector{Node} - part3::Vector{Node} - part4::Vector{Node} + 0,false,[],0,[],[],false,false); # intg1 ... end struct RootMismatch <: Exception - msg::String + msg::String end RootMismatch() = RootMismatch("") Base.showerror(io::IO, e::RootMismatch) = print(io, "RootMismatch: ", e.msg); + diff --git a/src/undo.jl b/src/undo.jl deleted file mode 100644 index a37c70053..000000000 --- a/src/undo.jl +++ /dev/null @@ -1,94 +0,0 @@ -# functions to undo incycle, containRoot, gammaz -# originally in functions.jl -# Claudia March 2015 - - -# ---------------------------------------- undo update of new hybridization -------------------------------- - - -# function to undo updateInCycle which returns an array -# of edges/nodes changed -function undoInCycle!(edges::Array{Edge,1},nodes::Array{Node,1}) - for e in edges - e.inCycle = -1; - end - for n in nodes - n.inCycle = -1; - end -end - -# function to undo updateContainRoot (which returns an array -# of edges changed) and gives value bool, by default true -function undoContainRoot!(edges::Array{Edge,1}, bool::Bool) - for e in edges - e.containRoot = bool - end -end - -undoContainRoot!(edges::Vector{Edge}) = undoContainRoot!(edges,true) - -# function to undo updateGammaz which returns an array -# of edges changed -# it only changes the status of istIdentifiable to true -function undoistIdentifiable!(edges::Array{Edge,1}) - for e in edges - !e.istIdentifiable ? e.istIdentifiable = true : e.istIdentifiable = false; - end -end - - -""" - undoGammaz!(node, network) - -Undo `updateGammaz!` for the 2 cases: bad diamond I,II. -`node` should be a hybrid node. -Set length to edges that were not identifiable and -change edges' `gammaz` attribute to -1.0. -Recalculate branch lengths in terms of `gammaz`. -*warning*: needs to know `incycle` attributes -""" -function undoGammaz!(node::Node, net::HybridNetwork) - node.hybrid || error("cannot undo gammaz if starting node is not hybrid") - if(node.isBadDiamondI) - edge_maj, edge_min, tree_edge2 = hybridEdges(node); - other_maj = getOtherNode(edge_maj,node); - other_min = getOtherNode(edge_min,node); - edgebla,tree_edge_incycle1,tree_edge = hybridEdges(other_min); - edgebla,tree_edge_incycle2,tree_edge = hybridEdges(other_maj); - other_min.gammaz != -1 || error("bad diamond I in node $(node.number) but no gammaz updated correctly") - setLength!(tree_edge_incycle1,-log(1-other_min.gammaz)) - other_maj.gammaz != -1 || error("bad diamond I in node $(node.number) but no gammaz updated correctly") - setLength!(tree_edge_incycle2,-log(1-other_maj.gammaz)) - if approxEq(other_maj.gammaz,0.0) && approxEq(other_min.gammaz,0.0) - setGamma!(edge_maj,0.0, true) # gamma could be anything if both gammaz are 0.0, but will set to 0.0 - setLength!(edge_maj,0.0) - setLength!(edge_min,0.0) - else - setGamma!(edge_maj,other_maj.gammaz / (other_maj.gammaz+other_min.gammaz), true) - end - other_min.gammaz = -1.0 - other_maj.gammaz = -1.0 - tree_edge_incycle1.istIdentifiable = true; - tree_edge_incycle2.istIdentifiable = true; - edge_maj.istIdentifiable = true; - edge_min.istIdentifiable = true; - node.isBadDiamondI = false - net.numBad -= 1 - elseif(node.isBadDiamondII) - edge_maj, edge_min, tree_edge2 = hybridEdges(node); - tree_edge2.istIdentifiable = true - node.isBadDiamondII = false - elseif(node.isBadTriangle) - edge_maj, edge_min, tree_edge2 = hybridEdges(node); - tree_edge2.istIdentifiable = true - node.isBadTriangle = false - elseif(node.isVeryBadTriangle || node.isExtBadTriangle) - node.isVeryBadTriangle = false - node.isExtBadTriangle = false - net.hasVeryBadTriangle = false - else - edge_maj, edge_min, tree_edge2 = hybridEdges(node); - edge_maj.istIdentifiable = isEdgeIdentifiable(edge_maj) - edge_min.istIdentifiable = isEdgeIdentifiable(edge_min) - end -end diff --git a/src/update.jl b/src/update.jl deleted file mode 100644 index 1127d78b4..000000000 --- a/src/update.jl +++ /dev/null @@ -1,378 +0,0 @@ -# functions to update incycle, containRoot, gammaz -# Claudia March 2015 -##################### - -# --------------------------------------- update incycle, root, gammaz ------------------------------------------- - -# function to update inCycle (with priority queue) after becoming part of a network -# based on program 3 CS367 with priority queue -# expected to be much faster than the other two udpateInCycle (queue and recursive) -# input: hybrid node around which we want to update inCycle -# returns tuple: flag, nocycle, array of edges changed, array of nodes changed -# flag: false if cycle intersects existing cycle or number of nodes in cycle < 3 -# (there is the possibility of returning edges in intersection: path) -# true if cycle does not intersect existing cycle -# nocycle: true if there is no cycle (instead of error). it is used in addHybridization -# calculates also the number of nodes in the cycle and put as hybrid node attribute "k" -# warning: it is not checking if hybrid node or minor hybrid edge -# were already part of a cycle (inCycle!= -1) -# But it is checking so for the other edges in cycle -# warning: it needs extra things: visited attribute, prev attribute -# unlike updateInCycle recursive, but it is expected -# to be much faster -function updateInCycle!(net::HybridNetwork,node::Node) - node.hybrid || error("node is not hybrid") - start = node - node.inCycle = node.number - node.k = 1 - hybedge = getparentedgeminor(node) - hybedge.inCycle = node.number - lastnode = getOtherNode(hybedge,node) - dist = 0 - queue = PriorityQueue() - path = Node[] - net.edges_changed = Edge[] - net.nodes_changed = Node[] - push!(net.edges_changed,hybedge) - push!(net.nodes_changed,node) - found = false - net.visited = falses(length(net.node)) - enqueue!(queue,node,dist) - while !found - if isempty(queue) - return false, true, net.edges_changed, net.nodes_changed - end - curr = dequeue!(queue) - if isEqual(curr,lastnode) - found = true - push!(path,curr) - elseif !net.visited[getIndex(curr,net)] - net.visited[getIndex(curr,net)] = true - atstart = isEqual(curr,start) - for e in curr.edge - e.isMajor || continue - other = getOtherNode(e,curr) - if atstart || (!other.leaf && !net.visited[getIndex(other,net)]) - other.prev = curr - dist = dist+1 - enqueue!(queue,other,dist) - end - end - end - end # end while - curr = pop!(path) - while !isEqual(curr, start) - if curr.inCycle!= -1 - push!(path,curr) - curr = curr.prev - else - curr.inCycle = start.number - push!(net.nodes_changed, curr) - node.k = node.k + 1 - edge = getConnectingEdge(curr,curr.prev) - edge.inCycle = start.number - push!(net.edges_changed, edge) - curr = curr.prev - end - end - flag = isempty(path) # || node.k<3 - !flag && @debug "warning: new cycle intersects existing cycle" - return flag, false, net.edges_changed, net.nodes_changed -end - -""" - updateContainRoot!(HybridNetwork, Node) - traverseContainRoot!(Node, Edge, edges_changed::Array{Edge,1}, rightDir::Vector{Bool}) - -The input `node` to `updateContainRoot!` must be a hybrid node -(can come from searchHybridNode). -`updateContainRoot!` starts at the input node and calls `traverseContainRoot!`, -which traverses the network recursively. -By default, containRoot attributes of edges are true. -Changes `containRoot` to false for all the visited edges: those -below the input node, but not beyond any other hybrid node. - -`updateContainRoot!` Returns a `flag` and an array of edges whose -containRoot has been changed from true to false. -`flag` is false if the set of edges to place the root is empty - -In `traverseContainRoot!`, `rightDir` turns false if hybridizations -have incompatible directions (vector of length 1, to be modified). - -Warning: - -- does *not* update `containRoot` of minor hybrid edges. -- assumes correct `isMajor` attributes: to stop the recursion at minor hybrid edges. -- assumes correct hybrid attributes of both nodes & edges: to check if various - hybridizations have compatible directions. - For each hybrid node that is encountered, checks if it was reached - via a hybrid edge (ok) or tree edge (not ok). - -`rightDir`: vector of length 1 boolean, to be mutable and modified by the function -""" -function traverseContainRoot!(node::Node, edge::Edge, edges_changed::Array{Edge,1}, rightDir::Vector{Bool}) - if node.hybrid - if edge.hybrid - edge.isMajor || error("hybrid edge $(edge.number) is minor and we should not traverse the graph through minor edges") - DEBUGC && @debug "traverseContainRoot reaches hybrid node $(node.number) through major hybrid edge $(edge.number)" - rightDir[1] &= true # This line has no effect: x && true = x - else #approach hybrid node through tree edge => wrong direction - rightDir[1] &= false # same as rightDir[1] = false: x && false = false - DEBUGC && @debug "traverseContainRoot reaches hybrid node $(node.number) through tree edge $(edge.number), so rightDir $(rightDir[1])" - end - elseif !node.leaf - for e in node.edge - if !isEqual(edge,e) && e.isMajor # minor edges avoided-> their containRoot not updated - other = getOtherNode(e,node); - if e.containRoot # only considered changed those that were true and not hybrid - DEBUGC && @debug "traverseContainRoot changing edge $(e.number) to false, at this moment, rightDir is $(rightDir[1])" - e.containRoot = false; - push!(edges_changed, e); - end - traverseContainRoot!(other,e, edges_changed, rightDir); - end - end - end -end - - -# node: must be hybrid node (can come from searchHybridNode) -# return flag, array of edges changed -# flag: false if the set of edges to place the root is empty -@doc (@doc traverseContainRoot!) updateContainRoot! -function updateContainRoot!(net::HybridNetwork, node::Node) - node.hybrid || error("node $(node.number )is not hybrid, cannot update containRoot") - net.edges_changed = Edge[]; - rightDir = [true] #assume good direction, only changed if found hybrid node through tree edge - for e in node.edge - if !e.hybrid - other = getOtherNode(e,node); - e.containRoot = false; - push!(net.edges_changed,e); - traverseContainRoot!(other,e, net.edges_changed,rightDir); - end - end - if !rightDir[1] || all((e->!e.containRoot), net.edge) - return false,net.edges_changed - else - return true,net.edges_changed - end -end - -# function to identify if the network is one of the pathological cases -# see ipad notes: k = 0 (nonidentifiable), k = 1 (nonidentifiable -# "extreme bad triangle", "very" bad triangle I,II) k = 2 (bad diamond -# I,II) also checks if hybrid node has leaf child, in which case, -# major edge is non identifiable -# input: hybrid node around which to check (can come from searchHybridNode) -# updates gammaz with whatever -# edge lengths are originally in the network -# allow = true, returns true always, used when reading topology -# returns net.hasVeryBadTriangle, array of edges changed (istIdentifiable, except hybrid edges) -# false if the network has extremely/very bad triangles -# warning: needs to have updateInCycle already done as it needs inCycle, and k -# check: assume any tree node that has hybrid Edge has only -# one tree edge in cycle (true?) -# updates net.numBad attribute when found a bad diamond I -function updateGammaz!(net::HybridNetwork, node::Node, allow::Bool) - node.hybrid || error("node $(node.number) is not hybrid, cannot updategammaz") - node.k != -1 || error("update in cycle should have been run before: node.k not -1") - node.isExtBadTriangle = false - node.isVeryBadTriangle = false - node.isBadTriangle = false - node.isBadDiamondI = false - node.isBadDiamondII = false - net.edges_changed = Edge[]; - edge_maj, edge_min, tree_edge2 = hybridEdges(node); - other_maj = getOtherNode(edge_maj,node); - other_min = getOtherNode(edge_min,node); - node.k > 2 || error("cycle with only $(node.k) nodes: parallel edges") # return false, [] - if(node.k == 4) # could be bad diamond I,II -# net.numTaxa >= 5 || return false, [] #checked inside optTopRuns now - edgebla,edge_min2,tree_edge3 = hybridEdges(other_min); - edgebla,edge_maj2,tree_edge1 = hybridEdges(other_maj); - other_min2 = getOtherNode(edge_min2,other_min); - isLeaf1 = getOtherNode(tree_edge1,other_maj); - isLeaf2 = getOtherNode(tree_edge2,node); - isLeaf3 = getOtherNode(tree_edge3,other_min); - tree_edge4 = nothing; - for e in other_min2.edge - if(isa(tree_edge4,Nothing) && e.inCycle == -1 && !e.hybrid) - tree_edge4 = e; - end - end - if(isEqual(other_min2,getOtherNode(edge_maj2,other_maj)) && isLeaf1.leaf && isLeaf2.leaf && isLeaf3.leaf) # bad diamond I - @debug "bad diamond I found" - net.numBad += 1 - node.isBadDiamondI = true; - other_min.gammaz = edge_min.gamma*edge_min2.z; - other_maj.gammaz = edge_maj.gamma*edge_maj2.z; - edge_min2.istIdentifiable = false; - edge_maj2.istIdentifiable = false; - edge_maj.istIdentifiable = false; - edge_min.istIdentifiable = false; - push!(net.edges_changed,edge_min2); - push!(net.edges_changed,edge_min); - push!(net.edges_changed,edge_maj2); - push!(net.edges_changed,edge_maj); - elseif(isEqual(other_min2,getOtherNode(edge_maj2,other_maj)) && isLeaf1.leaf && !isLeaf2.leaf && isLeaf3.leaf && getOtherNode(tree_edge4,other_min2).leaf) # bad diamond II - @debug "bad diamond II found" - node.isBadDiamondII = true; - setLength!(edge_maj,edge_maj.length+tree_edge2.length) - setLength!(tree_edge2,0.0) - push!(net.edges_changed,tree_edge2) - tree_edge2.istIdentifiable = false - edge_maj.istIdentifiable = true - edge_min.istIdentifiable = true - end - elseif(node.k == 3) # could be extreme/very bad triangle or just bad triangle - if(net.numTaxa <= 5) - @debug "extremely or very bad triangle found" - node.isVeryBadTriangle = true - net.hasVeryBadTriangle = true - elseif(net.numTaxa >= 6) - edgebla,tree_edge_incycle,tree_edge1 = hybridEdges(other_min); - edgebla,edgebla,tree_edge3 = hybridEdges(other_maj); - isLeaf1 = getOtherNode(tree_edge1,other_min); - isLeaf2 = getOtherNode(tree_edge2,node); - isLeaf3 = getOtherNode(tree_edge3,other_maj); - if isLeaf1.leaf || isLeaf2.leaf || isLeaf3.leaf - nl = count([l.leaf for l in [isLeaf1,isLeaf2,isLeaf3]]) - if nl >= 2 - @debug "warning: extremely bad triangle found" - node.isExtBadTriangle = true; - net.hasVeryBadTriangle = true - elseif nl == 1 - @debug "warning: bad triangle I or II found" - node.isVeryBadTriangle = true; - net.hasVeryBadTriangle = true - end - else - node.isBadTriangle = true - setLength!(edge_maj,edge_maj.length+tree_edge2.length) - setLength!(tree_edge2,0.0) - tree_edge2.istIdentifiable = false - push!(net.edges_changed, tree_edge2); - end - end - end #ends the search for bad things - if(node.k > 3 && !node.isBadDiamondI && !node.isBadDiamondII) - #println("si entra el ultimo if de k>3 y no bad diamondI,II") - edgebla,tree_edge_incycle,tree_edge1 = hybridEdges(other_min); - if(!tree_edge_incycle.istIdentifiable) - tree_edge_incycle.istIdentifiable = true; - push!(net.edges_changed,tree_edge_incycle); - end - edge_maj.istIdentifiable = isEdgeIdentifiable(edge_maj) - edge_min.istIdentifiable = isEdgeIdentifiable(edge_min) - end - isBadTriangle(node) == net.hasVeryBadTriangle || error("node $(node.number) is very bad triangle but net.hasVeryBadTriangle is $(net.hasVeryBadTriangle)") - if(allow) - return true, net.edges_changed - else - return !net.hasVeryBadTriangle, net.edges_changed - end -end - -updateGammaz!(net::HybridNetwork, node::Node) = updateGammaz!(net, node, false) - -#function to check if edge should be identifiable -#it is not only if followed by leaf, or if a newly converted tree edge -function isEdgeIdentifiable(edge::Edge) - if(edge.hybrid) - node = edge.node[edge.isChild1 ? 1 : 2] - #println("is edge $(edge.number) identifiable, node $(node.number)") - node.hybrid || error("hybrid edge $(edge.number) pointing at tree node $(node.number)") - major,minor,tree = hybridEdges(node) - #println("major $(major.number), minor $(minor.number), tree $(tree.number)") - if(getOtherNode(tree,node).leaf) - return false - else - return true - end - else - if(reduce(&,[!edge.node[1].leaf,!edge.node[2].leaf])) - if(!edge.node[1].hybrid && !edge.node[2].hybrid && !edge.fromBadDiamondI) - return true - elseif(edge.node[1].hybrid || edge.node[2].hybrid) - ind = edge.node[1].hybrid ? 1 : 2 - if(!edge.node[ind].isBadDiamondII && !edge.node[ind].isBadTriangle) - return true - else - return false - end - end - else - return false - end - end -end - - - -# function to update the net.partition attribute along a cycle formed -# by nodesChanged vector (obtained from updateInCycle) -# warning: needs updateInCycle for all hybrids before running this -function updatePartition!(net::HybridNetwork, nodesChanged::Vector{Node}) - if(net.numHybrids == 0) - net.partition = Partition[] - end - for n in nodesChanged - if(length(n.edge) == 3) #because we are allowing the root to have only two edges when read from parenthetical format - edge = nothing - for e in n.edge - if(e.inCycle == -1) - edge = e - end - end - !isa(edge,Nothing) || error("one edge in n.edge for node $(n.number) should not be in cycle") - descendants = [edge] - cycleNum = [nodesChanged[1].inCycle] - getDescendants!(getOtherNode(edge,n),edge,descendants,cycleNum) - !isempty(descendants) || error("descendants is empty for node $(n.number)") - @debug "for node $(n.number), descendants are $([e.number for e in descendants]), and cycleNum is $(cycleNum)" - partition = Partition(cycleNum,descendants) - if(!isPartitionInNet(net,partition)) #need to check not already added by other hybrid nodes - push!(net.partition, partition) - end - end - end -end - -function choosePartition(net::HybridNetwork) - all((n->(length(n.edges) == 1)), net.partition) && return 0 #cannot put any hyb - all((n->(length(n.edges) == 3)), net.partition) && return 0 #can only put very bad triangles - partition = Int[] #good partitions - for i in 1:length(net.partition) - if(length(net.partition[i].edges) > 3) - push!(partition,i) - end - end - isempty(partition) && return 0 - length(partition) == 1 && return partition[1] - index1 = round(Integer,rand()*size(partition,1)); - while(index1 == 0 || index1 > length(partition)) - index1 = round(Integer,rand()*size(partition,1)); - end - @debug "chosen partition $([n.number for n in net.partition[partition[index1]].edges])" - return partition[index1] -end - - -# based on getDescendants on readData.jl but with vector of edges, instead of nodes -# finds the partition corresponding to the node and edge in the cycle -# used in chooseEdgesGamma and to set net.partition -# cycleNum is a variable that will save another hybrid node number if found -function getDescendants!(node::Node, edge::Edge, descendants::Vector{Edge}, cycleNum::Vector{Int}) - @debug "getDescendants of node $(node.number) and edge $(edge.number)" - if(node.inCycle != -1) - push!(cycleNum,node.inCycle) - elseif(!node.leaf && node.inCycle == -1) - for e in node.edge - if(!isEqual(edge,e) && e.isMajor) - push!(descendants,e) - getDescendants!(getOtherNode(e,node),e,descendants,cycleNum) - end - end - end -end diff --git a/test/1.ms b/test/1.ms deleted file mode 100644 index 76acbe71c..000000000 --- a/test/1.ms +++ /dev/null @@ -1,32 +0,0 @@ -/u/c/l/claudia/software/ms/msdir/ms 6 10 -T -I 6 1 1 1 1 1 1 -ej 0.1 1 2 -ej 0.5 3 4 -es 0.55 4 0.7 -ej 0.55 7 5 -ej 0.6 2 4 -ej 1.6 4 5 -ej 2.1 5 6 -47325 27011 59243 - -// -(6:3.500,(1:2.236,(5:1.850,(4:0.660,(2:0.632,3:0.632):0.028):1.190):0.386):1.264); - -// -(6:2.569,((1:0.818,(2:0.677,4:0.677):0.141):1.268,(3:1.105,5:1.105):0.982):0.483); - -// -((3:0.676,(1:0.104,2:0.104):0.572):2.362,(6:2.790,(4:0.551,5:0.551):2.238):0.248); - -// -(6:2.728,((3:0.655,5:0.655):1.202,(1:0.881,(2:0.783,4:0.783):0.098):0.976):0.871); - -// -(6:4.714,(5:2.433,(3:1.318,(4:0.896,(1:0.506,2:0.506):0.391):0.422):1.114):2.281); - -// -(6:2.210,((3:0.694,5:0.694):1.302,(4:0.726,(1:0.351,2:0.351):0.376):1.270):0.214); - -// -(6:3.077,(5:2.349,((1:0.499,2:0.499):0.704,(3:0.730,4:0.730):0.473):1.146):0.728); - -// -(((1:0.211,2:0.211):1.629,(3:0.754,4:0.754):1.086):0.801,(5:2.280,6:2.280):0.361); - -// -(6:2.181,((4:0.875,5:0.875):1.131,(2:1.304,(1:0.821,3:0.821):0.484):0.701):0.176); - -// -(6:2.249,(1:2.092,((2:0.617,4:0.617):1.413,(3:0.749,5:0.749):1.281):0.062):0.157); diff --git a/test/allQuartets.txt b/test/allQuartets.txt deleted file mode 100644 index 1939bd707..000000000 --- a/test/allQuartets.txt +++ /dev/null @@ -1,15 +0,0 @@ -6,1,5,4 -6,1,5,2 -6,1,5,3 -6,1,4,2 -6,1,4,3 -6,1,2,3 -6,5,4,2 -6,5,4,3 -6,5,2,3 -6,4,2,3 -1,5,4,2 -1,5,4,3 -1,5,2,3 -1,4,2,3 -5,4,2,3 diff --git a/test/prueba_tree.txt b/test/prueba_tree.txt deleted file mode 100644 index 16777178f..000000000 --- a/test/prueba_tree.txt +++ /dev/null @@ -1 +0,0 @@ -(((6:0.1,(4)11#H1)1:0.2,(11#H1,7))5:0.1,8:0.1,10:0.1); \ No newline at end of file diff --git a/test/readme.md b/test/readme.md index 5ad92442d..f28708b3b 100644 --- a/test/readme.md +++ b/test/readme.md @@ -1,58 +1,11 @@ -# Tests functions - -- all in `runtests.jl`, which calls other test files -- to see deprecation warnings when running things locally, start julia with - ```shell - julia --depwarn=yes - ``` - and possibly other options (like --project). -- generally, code in file `src/x.jl` is tested by `test/test_x.jl`, - but see below for what older test files do (related to SNaQ). - checkout PhyloNetworks v0.9.1 or older to see those older files. - -#### add hybridization - -test_add2hyb.jl add a first hybrid, then a second hybrid that -makes a bad triangle, and the -functions should identify it - -#### delete hybridization - -test_deleteHybridizationUpdate.jl checks that all attributes are correctly updated after deleting a hybridization (1 and 2 hybrids) - -#### read topology - -test_5taxon_readTopology.jl runs all the tests for the eight 5taxon -networks by reading from parenthetical format and then updating - -aux functions: test_functions_5taxon_read.jl - -#### calculate exp CF - -test_calculateExpCF.jl runs all the tests for Case G, bad diamond and -bad triangle for calculation of expCF - -test_calculateExpCF2.jl computes the expCF for the n6 network - -#### has Edge - -test_hasEdge.jl tests if the attribute qnet.hasEdge is correctly -updated after extracting quartets for case G. It also checks if -net.ht, net.numht, qnet.indexht are correctly set for Case G. - -#### parts of optBL - -test_optBLparts.jl tests the parts of optBL separately to see if they -work. - -#### parameters - -test_parameters.jl get net.ht and net.numht for all the 5 taxon networks - -#### Likelihood - -test_correctLik.jl computes the pseudolik for a tree and a network with 1 hybrid and checks that it is correctly computed - -#### partition - -test_partition.jl (1 hybrid) and test_partition2.jl (2 hybrids) check if the attribute of partition is correctly set +# Tests functions + +- all in `runtests.jl`, which calls other test files +- to see deprecation warnings when running things locally, start julia with + ```shell + julia --depwarn=yes + ``` + and possibly other options (like --project). +- generally, code in file `src/x.jl` is tested by `test/test_x.jl`, + but see below for what older test files do (related to SNaQ). + checkout PhyloNetworks v0.9.1 or older to see those older files. diff --git a/test/runtests.jl b/test/runtests.jl index 17da0917f..a2f99c624 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,106 +1,30 @@ -# see readme file in tests/ for description of tests -# Claudia July 2015 -# modified to using PhyloNetworks always, all test files have commented out -# the include(...) or the using PhyloNetworks part -# Claudia May 2016 - using Test using PhyloNetworks using CSV # for reading files using DataFrames -using Distributed # parallel in test_correctLik.jl and test_bootstrap.jl -using GLM # for coef, nobs, residuals etc. -using LinearAlgebra: norm, diag, logdet, PosDefException # LinearAlgebra.rotate! not brought into scope +using Distributed # for parsimony search, currently broken +using LinearAlgebra: diag # LinearAlgebra.rotate! not brought into scope using Random -using StaticArrays # for rate substitution matrices -using Statistics -using StatsBase # for aic etc., stderr -using BioSymbols - - -PhyloNetworks.setCHECKNET(true) - - ## readTopology - getIndexEdge = PhyloNetworks.getIndexEdge - getIndexNode = PhyloNetworks.getIndexNode - Edge = PhyloNetworks.Edge - Node = PhyloNetworks.Node - setNode! = PhyloNetworks.setNode! - ## calculateExpCF - approxEq = PhyloNetworks.approxEq - Quartet = PhyloNetworks.Quartet - extractQuartet! = PhyloNetworks.extractQuartet! - identifyQuartet! = PhyloNetworks.identifyQuartet! - eliminateHybridization! = PhyloNetworks.eliminateHybridization! - updateSplit! = PhyloNetworks.updateSplit! - updateFormula! = PhyloNetworks.updateFormula! - calculateExpCF! = PhyloNetworks.calculateExpCF! - parameters! = PhyloNetworks.parameters! - searchHybridNode = PhyloNetworks.searchHybridNode - updateInCycle! = PhyloNetworks.updateInCycle! - updateContainRoot! = PhyloNetworks.updateContainRoot! - updateGammaz! = PhyloNetworks.updateGammaz! - ## correctLik - calculateExpCFAll! = PhyloNetworks.calculateExpCFAll! - logPseudoLik = PhyloNetworks.logPseudoLik - optTopRun1! = PhyloNetworks.optTopRun1! - ## partition - addHybridizationUpdate! = PhyloNetworks.addHybridizationUpdate! - deleteHybridizationUpdate! = PhyloNetworks.deleteHybridizationUpdate! - ## partition2 - writeTopologyLevel1 = PhyloNetworks.writeTopologyLevel1 - printPartitions = PhyloNetworks.printPartitions - cleanBL! = PhyloNetworks.cleanBL! - cleanAfterRead! = PhyloNetworks.cleanAfterRead! - identifyInCycle = PhyloNetworks.identifyInCycle - updatePartition! = PhyloNetworks.updatePartition! - ## deleteHybridizationUpdate - checkNet = PhyloNetworks.checkNet - ## add2hyb - hybridEdges = PhyloNetworks.hybridEdges - ## optBLparts - update! = PhyloNetworks.update! - ## orderings_plot - RootMismatch = PhyloNetworks.RootMismatch - fuseedgesat! = PhyloNetworks.fuseedgesat! - ## compareNetworks - deletehybridedge! = PhyloNetworks.deletehybridedge! - displayedNetworks! = PhyloNetworks.displayedNetworks! - ## perfect data - writeExpCF = PhyloNetworks.writeExpCF - optBL! = PhyloNetworks.optBL! - ## traitLikDiscrete - P = PhyloNetworks.P - P! = PhyloNetworks.P! +using StableRNGs tests = [ - "test_auxillary.jl", + "test_auxiliary.jl", "test_generatetopology.jl", "test_addHybrid.jl", - "test_5taxon_readTopology.jl", - "test_calculateExpCF.jl", "test_calculateExpCF2.jl", - "test_hasEdge.jl", "test_parameters.jl", "test_correctLik.jl", - "test_partition.jl", "test_partition2.jl", "test_deleteHybridizationUpdate.jl", "test_add2hyb.jl", "test_optBLparts.jl", "test_undirectedOtherNetworks.jl", "test_graph_components.jl", - "test_manipulateNet.jl", "test_compareNetworks.jl", - "test_badDiamII.jl", - "test_multipleAlleles.jl", + "test_manipulateNet.jl", + "test_compareNetworks.jl", "test_bootstrap.jl", - "test_perfectData.jl", "test_moves_semidirected.jl", - "test_lm.jl", "test_lm_tree.jl", "test_traits.jl", "test_simulate.jl", "test_simulate_mbd.jl", - "test_lm_withinspecies.jl", - "test_parsimony.jl", - "test_calibratePairwise.jl", "test_relaxed_reading.jl", - "test_isMajor.jl", "test_interop.jl", - "test_traitLikDiscrete.jl", - "test_phyLiNCoptimization.jl", - "test_readInputData.jl", - "test_nj.jl", + "test_parsimony.jl", # has broken tests: parsimony search broken + "test_recursion_matrices.jl", + "test_calibratePairwise.jl", + "test_relaxed_reading.jl", + "test_isMajor.jl", + "test_interop.jl", + "test_nj.jl" ] -@show PhyloNetworks.CHECKNET - anyerrors = false for t in tests diff --git a/test/tableCF.txt b/test/tableCF.txt deleted file mode 100644 index 507727fb0..000000000 --- a/test/tableCF.txt +++ /dev/null @@ -1,16 +0,0 @@ -"t1","t2","t3","t4","CF12_34","CF13_24","CF14_23","ngenes" -"1","2","3","4",0.5,0.4,0.1,10 -"1","2","3","5",0.8,0.1,0.1,10 -"1","2","3","6",0.7,0.1,0.2,10 -"1","2","4","5",0.6,0.0,0.4,10 -"1","2","4","6",0.6,0.0,0.4,10 -"1","2","5","6",0.8,0.0,0.2,10 -"1","3","4","5",0.2,0.5,0.3,10 -"1","3","4","6",0.2,0.4,0.4,10 -"1","3","5","6",0.5,0.0,0.5,10 -"1","4","5","6",0.6,0.0,0.4,10 -"2","3","4","5",0.3,0.5,0.2,10 -"2","3","4","6",0.3,0.5,0.2,10 -"2","3","5","6",0.6,0.0,0.4,10 -"2","4","5","6",0.8,0.0,0.2,10 -"3","4","5","6",0.4,0.4,0.2,10 diff --git a/test/tableCFbad.txt b/test/tableCFbad.txt deleted file mode 100644 index 9ae649dd7..000000000 --- a/test/tableCFbad.txt +++ /dev/null @@ -1,16 +0,0 @@ -"t1","t2","t3","t4","CF1234","CF1324","CF1423" -"6","1","5","4",0.4,0.6,0.0 -"6","1","5","2",0.2,0.8,0.0 -0,0,0 -"6","1","4","2",0.4,0.6,0.0 -"6","1","4","3",0.4,0.2,0.4 -"6","1","2","3",0.2,0.1,0.7 -"6","5","4","2",0.8,0.0,0.2 -"6","5","4","3",0.4,0.4,0.2 -"6","5","2","3",0.6,0.4,0.0 -"6","4","2","3",0.3,0.2,0.5 -"1","5","4","2",0.4,0.0,0.6 -"1","5","4","3",0.3,0.5,0.2 -"1","5","2","3",0.1,0.8,0.1 -"1","4","2","3",0.1,0.5,0.4 -"5","4","2","3",0.3,0.2,0.5 diff --git a/test/test_5taxon_readTopology.jl b/test/test_5taxon_readTopology.jl deleted file mode 100644 index 33c0d8770..000000000 --- a/test/test_5taxon_readTopology.jl +++ /dev/null @@ -1,140 +0,0 @@ -include("test_functions_5taxon_read.jl") - -tests = ["F","G","H","J","I"]; -wrong = AbstractString[]; - -function whichtree(t::String) - if(t == "tree") - tree = "(((6:0.1,4:1.5)1:0.2,7:0.2)5:0.1,8:0.1,10:0.1);" # normal tree - elseif(t == "C") - tree = "((((6:0.1,4:1.5),(7:0.2)11#H1),11#H1),8:0.1,10:0.1);" # Case C: bad triangle II - elseif(t == "F") - tree = "(((6:0.1,(4)11#H1)1:0.2,(11#H1,7))5:0.1,8:0.1,10:0.1);" # Case F: bad diamond I - elseif(t == "G") - tree = "((((6:0.1,4:1.5)1:0.2,(7)11#H1)5:0.1,(11#H1,8)),10:0.1);" # Case G - elseif(t == "H") - tree = "((((6,4),#H1),7),(8)#H1,10);" # Case H - elseif(t == "J") - tree = "((((6)#H1,4),7),8,(#H1,10));" # Case J - elseif(t == "D") - tree = "((((6,4))#H1,(#H1,7)),8,10);" # Case D Bad triangle I - elseif(t == "E") - tree = "(((((8,10))#H1,7),#H1),6,4);" # Case E Bad triangle I - elseif(t == "I") - tree = "((((8,10))#H1,7),6,(4,#H1));" # Case I Bad diamond II - else - error("not a known 5 taxon network case") - end - return tree -end - - -for t in tests - #println("running $(t)") - net = nothing; - tree = whichtree(t) - net = readTopologyLevel1(tree); - if(t == "tree") - try - testTree(net) - catch - println("error in $(t)") - push!(wrong,t); - end - elseif(t == "C") - try - testCaseC(net) - catch - println("error in $(t)") - push!(wrong,t); - end - elseif(t == "F") - try - testCaseF(net) - catch - println("error in $(t)") - push!(wrong,t); - end - elseif(t == "G") - try - testCaseG(net) - catch - println("error in $(t)") - push!(wrong,t); - end - elseif(t == "H") - try - testCaseH(net) - catch - println("error in $(t)") - push!(wrong,t); - end - elseif(t == "J") - try - testCaseJ(net) - catch - println("error in $(t)") - push!(wrong,t); - end - elseif(t == "D") - try - testCaseD(net) - catch - println("error in $(t)") - push!(wrong,t); - end - elseif(t == "E") - try - testCaseE(net) - catch - println("error in $(t)") - push!(wrong,t); - end - elseif(t == "I") - try - testCaseI(net) - catch - println("error in $(t)") - push!(wrong,t); - end - else - error("not a known 5 taxon network case") - end -end - -## if(!isempty(wrong)) -## for t in wrong -## println("running $(t)") -## net = nothing; -## tree = whichtree(t) -## f = open("prueba_tree.txt","w") -## write(f,tree) -## close(f) -## net = readTopologyUpdate("prueba_tree.txt"); -## if(t == "tree") -## testTree(net) -## elseif(t == "C") -## testCaseC(net) -## elseif(t == "F") -## testCaseF(net) -## elseif(t == "G") -## testCaseG(net) -## elseif(t == "H") -## testCaseH(net) -## elseif(t == "J") -## testCaseJ(net) -## elseif(t == "D") -## testCaseD(net) -## elseif(t == "E") -## testCaseE(net) -## elseif(t == "I") -## testCaseI(net) -## else -## error("not a known 5 taxon network case") -## end -## end -## else -## println("----------NO ERRORS!----------"); -## end - -@test isempty(wrong) diff --git a/test/test_add2hyb.jl b/test/test_add2hyb.jl deleted file mode 100644 index ab1d1f11f..000000000 --- a/test/test_add2hyb.jl +++ /dev/null @@ -1,31 +0,0 @@ -# adding more than one hybrid -# claudia may 2015 - -tree = "(((((((1,2),3),4),5),(6,7)),(8,9)),10);" -currT0 = readTopologyLevel1(tree); -#printEdges(currT0) -besttree = deepcopy(currT0); - -Random.seed!(16); -successful,hybrid,flag,nocycle,flag2,flag3 = PhyloNetworks.addHybridizationUpdate!(besttree); -@test all([successful, flag, flag2, flag3, !nocycle, hybrid.hybrid]) -@test hybrid.number == 11 -@test sum(e.inCycle==11 for e in besttree.edge) == 4 -@test hybrid.k == 4 -@test !hybrid.isBadDiamondI -@test !hybrid.isBadDiamondII - -successful,hybrid,flag,nocycle,flag2,flag3 = PhyloNetworks.addHybridizationUpdate!(besttree); #will add a bad triangle -# seed was chosen such that we tried to add a bad triangle. We should notice. -@test all([!successful, flag, !flag2, flag3, !nocycle]) -@test hybrid.k == 3 -@test hybrid.isVeryBadTriangle -ed = hybridEdges(hybrid) -@test ed[1].isMajor -@test ed[1].gamma > 0.5 -@test ed[1].hybrid - -# did not recognize as bad diamond II -tree = "(6,(5,#H7:0.0):9.970714072991349,(3,(((2,1):0.2950382234364404,4):0.036924483697671304)#H7:0.00926495670648208):1.1071489442240392);" -net = readTopologyLevel1(tree); -net.node[10].isBadDiamondII || error("does not recognize as bad diamond II") diff --git a/test/test_addHybrid.jl b/test/test_addHybrid.jl index c213d8fcf..50a64540a 100644 --- a/test/test_addHybrid.jl +++ b/test/test_addHybrid.jl @@ -7,59 +7,59 @@ using Random @testset "addhybridedge! top function" begin # caution: this test has randomness in its choice of edges; may error sometimes and not others str_tree = "(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);"; -tree = readTopology(str_tree) +tree = readnewick(str_tree) Random.seed!(5432); @test !isnothing(PhyloNetworks.addhybridedge!(tree, true, true)) -@test tree.numHybrids == 1 +@test tree.numhybrids == 1 @test !isnothing(PhyloNetworks.addhybridedge!(tree, true, true)) # should be able to add a hybrid -@test tree.numHybrids == 2 +@test tree.numhybrids == 2 @test !any([n.hybrid for n in PhyloNetworks.getparents(tree.hybrid[2])]) # tests if network is treechild str_level1 = "(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" -netl1 = readTopology(str_level1) +netl1 = readnewick(str_level1) @test !isnothing(PhyloNetworks.addhybridedge!(netl1, true, true)) -@test netl1.numHybrids == 3 +@test netl1.numhybrids == 3 @test !any([n.hybrid for n in PhyloNetworks.getparents(netl1.hybrid[3])]) # tests if network has no hybrid ladder -netl1 = readTopology(str_level1) +netl1 = readnewick(str_level1) newhybridnode, newhybridedge = PhyloNetworks.addhybridedge!(netl1, false, true) @test !isnothing(newhybridnode) -@test netl1.numHybrids == 3 +@test netl1.numhybrids == 3 PhyloNetworks.deletehybridedge!(netl1, PhyloNetworks.getparentedgeminor(newhybridnode)) -@test hardwiredClusterDistance(netl1, readTopology(str_level1), true) == 0 +@test hardwiredclusterdistance(netl1, readnewick(str_level1), true) == 0 end # of addhybridedge! top function @testset "addhybridedge! helper function" begin str_level1 = "(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" # allowed moves -netl1 = readTopology(str_level1) +netl1 = readnewick(str_level1) newhybridnode, newhybridedge = PhyloNetworks.addhybridedge!(netl1, netl1.edge[3], netl1.edge[9], true, 0.0, 0.2) @test newhybridnode.hybrid @test PhyloNetworks.getparentedge(newhybridnode).gamma == 0.8 @test PhyloNetworks.getparentedgeminor(newhybridnode).gamma == 0.2 -netl1 = readTopology(str_level1); +netl1 = readnewick(str_level1); @test !isnothing(PhyloNetworks.addhybridedge!(netl1, netl1.edge[15], netl1.edge[3], true)) -@test writeTopology(netl1) == "(((((((S1,S4),(S5)#H1),(#H1,(S6,S7))),#H3))#H2,((S8,S9))#H3),(#H2,S10));" -netl1 = readTopology(str_level1); +@test writenewick(netl1) == "(((((((S1,S4),(S5)#H1),(#H1,(S6,S7))),#H3))#H2,((S8,S9))#H3),(#H2,S10));" +netl1 = readnewick(str_level1); @test !isnothing(PhyloNetworks.addhybridedge!(netl1, netl1.edge[2], netl1.edge[17], true)) -@test writeTopology(netl1) == "((#H2,S10),(((S8,(S9,#H3)),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2))#H3);" -netl1 = readTopology(str_level1); +@test writenewick(netl1) == "((#H2,S10),(((S8,(S9,#H3)),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2))#H3);" +netl1 = readnewick(str_level1); @test !isnothing(PhyloNetworks.addhybridedge!(netl1, netl1.edge[20], netl1.edge[16], true)) -@test writeTopology(netl1) == "(((S8,S9),(((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2)#H3),((#H2,S10),#H3));" -netl1 = readTopology(str_level1); # good hybrid edge choice leads to a DAG when reverting the direction of edge2 +@test writenewick(netl1) == "(((S8,S9),(((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2)#H3),((#H2,S10),#H3));" +netl1 = readnewick(str_level1); # good hybrid edge choice leads to a DAG when reverting the direction of edge2 @test !isnothing(PhyloNetworks.addhybridedge!(netl1, netl1.edge[6], netl1.edge[20], false)) -@test netl1.root < 19 # the root must have been changed due to changing some edges' directions -@test writeTopology(netl1) == "(#H2,S10,((((S8,S9),((((S5)#H1,((S1,S4),#H3)),(#H1,(S6,S7))))#H2)))#H3);" +@test netl1.rooti < 19 # the root must have been changed due to changing some edges' directions +@test writenewick(netl1) == "(#H2,S10,((((S8,S9),((((S5)#H1,((S1,S4),#H3)),(#H1,(S6,S7))))#H2)))#H3);" # new hybrid into an existing hybrid edge -netl1 = readTopology(str_level1); +netl1 = readnewick(str_level1); @test !isnothing(PhyloNetworks.addhybridedge!(netl1, netl1.edge[9], netl1.edge[10], true)) -@test writeTopology(netl1) == "(((S8,S9),((((S6,S7),(#H1)#H3),(((S1,S4),(S5)#H1),#H3)))#H2),(#H2,S10));" +@test writenewick(netl1) == "(((S8,S9),((((S6,S7),(#H1)#H3),(((S1,S4),(S5)#H1),#H3)))#H2),(#H2,S10));" end # of addhybridedge! helper function @testset "edge checking functions" begin str_level1 = "(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" # 3-cycles: throws error if adding a hybrid edge would create a 3-cycle -netl1 = readTopology(str_level1); +netl1 = readnewick(str_level1); @test PhyloNetworks.hybrid3cycle(netl1.edge[6], netl1.edge[9]) @test PhyloNetworks.hybrid3cycle(netl1.edge[3], netl1.edge[17]) @test PhyloNetworks.hybrid3cycle(netl1.edge[16], netl1.edge[17]) diff --git a/test/test_auxiliary.jl b/test/test_auxiliary.jl new file mode 100644 index 000000000..68175be9f --- /dev/null +++ b/test/test_auxiliary.jl @@ -0,0 +1,151 @@ +#= # for local testing, need this: +using Test +using PhyloNetworks +using PhyloPlots +using CSV +=# + +@testset "auxiliary" begin + +@testset "show, setlengths, setgammas" begin +originalstdout = stdout +redirect_stdout(devnull) # requires julia v1.6 +@test_nowarn PhyloNetworks.citation() +redirect_stdout(originalstdout) + +str_level1_s = "(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" # indviduals S1A S1B S1C go on leaf 1 +net = readnewick(str_level1_s) +net0 = readnewick(str_level1_s) + +s = IOBuffer() +show(s, net0) +@test String(take!(s)) == """ +HybridNetwork, Rooted Network +20 edges +19 nodes: 8 tips, 2 hybrid nodes, 9 internal tree nodes. +tip labels: S8, S9, S1, S4, ... +(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10)); +""" +show(s,net0.node[8]) +@test String(take!(s)) == """ +PhyloNetworks.Node: + number:6 + name:H1 + hybrid node + attached to 3 edges, numbered: 7 8 10 +""" +show(s,net0.edge[10]) +@test String(take!(s)) == """ +PhyloNetworks.EdgeT{PhyloNetworks.Node}: + number:10 + length:-1.0 + minor hybrid edge with gamma=-1.0 + attached to 2 node(s) (parent first): -10 6 +""" + +@test PhyloNetworks.isEqual(net, net0) +@test getchild(net0.hybrid[1]).name == "S5" +@test_throws "0 children instead of 1" getchild(net0.leaf[1]) +@test_throws "did not find a partner" getpartneredge(net0.edge[1]) +@test PhyloNetworks.getIndex(net0.edge[10], net) == 10 # note: edge in net0, searched in net +@test PhyloNetworks.getIndexNode(net0.edge[10], net0.node[8]) == 1 +@test PhyloNetworks.getIndexHybrid(net0.node[8], net) == 1 +@test PhyloNetworks.getconnectingedge(net0.node[8], net0.node[13]) === net0.edge[10] +PhyloNetworks.deleteIntNode!(net0, getroot(net0)) +@test net0.numedges == 19 +@test net0.numnodes == 18 +e1,e2,e3 = PhyloNetworks.hybridEdges(net0.node[13]) +# broken: bc utilities to update `intn1` (cycle number for level-1 nets) are in SNaQ. +# fix later with blob decomposition for general networks +# @test (e1.number, e2.number, e3.number) == (10,14,13) +# edge 14 is part of the cycle from hybrid 6 (H1), yet net.edge[14].inte1 is -1 +net0.hybrid[1].name = "" +PhyloNetworks.assignhybridnames!(net0) +@test net0.hybrid[1].name == "H6" +ee = PhyloNetworks.adjacentedges(net0.edge[10]) +@test [e.number for e in ee] == [7,8,10,13,14] + +setlengths!([net.edge[1]], [1.1]) +@test net.edge[1].length == 1.1 +setlengths!([net.edge[3], net.edge[1]], [3.3, missing]) +@test net.edge[3].length == 3.3 +@test net.edge[1].length == -1 +setlength!(net.edge[3], -1) +@test net.edge[3].length == -1 +@test_throws "non negative" setlength!(net.edge[3], -0.5) + +PhyloNetworks.setmultiplegammas!([net.edge[18]], [0.25]) +@test net.edge[18].gamma == 0.25 +@test net.edge[16].gamma == 0.75 + +@test PhyloNetworks.getlengths([net.edge[1]]) == [net.edge[1].length] +@test PhyloNetworks.getlengths([net.edge[1], net.edge[5]]) == [net.edge[1].length, net.edge[5].length] +end + +@testset "hashybridladder" begin +tree = readnewick("(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);"); +@test !PhyloNetworks.hashybridladder(tree) +PhyloNetworks.addhybridedge!(tree, tree.edge[5], tree.edge[1], true) +PhyloNetworks.addhybridedge!(tree, tree.edge[2], tree.edge[1], true) +@test PhyloNetworks.hashybridladder(tree) +end # of testing hashybridladder + +@testset "shrink edges and cycles" begin +# shrink 1 edge, and hassinglechild +net = readnewick("((A:2.0,(((B1,B2):1.0)0.01)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5);") +@test !PhyloNetworks.shrinkedge!(net, net.edge[10]) +@test_throws Exception PhyloNetworks.shrinkedge!(net, net.edge[6]) # hybrid edge +@test_throws Exception PhyloNetworks.shrinkedge!(net, net.edge[3]) # external edge +@test hassinglechild(net.hybrid[1]) +@test hassinglechild(net.node[5]) && !net.node[5].hybrid # degree-2 tree node +@test !PhyloNetworks.shrinkedge!(net, net.edge[5]) +@test PhyloNetworks.shrinkedge!(net, net.edge[4]) +@test !hassinglechild(net.hybrid[1]) +# shrink cycles +net = readnewick("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);") +@test !shrink2cycles!(net) +@test !shrink3cycles!(net) +PhyloNetworks.addhybridedge!(net, net.edge[7], net.edge[4], true, 0.1, 0.2) +@test !shrink2cycles!(net) +@test shrink3cycles!(net) # tree case +@test writenewick(net) == "(((A:2.0,(B:1.0)#H1:0.1::0.9):1.37,(C:0.6,#H1:1.0::0.1):0.9):0.6,D:2.0);" +PhyloNetworks.addhybridedge!(net, net.edge[3], net.edge[6], true, 0.3, 0.4) +@test shrink3cycles!(net) # hybrid case +@test writenewick(net, round=true, digits=5) == "(((A:2.0,(B:1.0)#H1:0.13191::0.94):1.37,(C:0.6,#H1:1.0::0.06):0.9):0.6,D:2.0);" +net0 = readnewick("((((((a:1)#H1:1::.9)#H2:1::.8)#H3:1::.7,#H3:0.5):1,#H2:1):1,(#H1:1,b:1):1,c:1);") +net = deepcopy(net0) # new 2/3 cycles appear when some are shrunk +@test shrink2cycles!(net) +@test writenewick(net, round=true) == "((#H1:1.0::0.1,b:1.0):1.0,c:1.0,(a:1.0)#H1:4.48::0.9);" +@test shrink3cycles!(net0) +writenewick(net0, round=true) == "(c:1.1,a:5.132,b:1.9);" +# non-tree-child network: w shape +net0 = readnewick("((a:1,#H1:.1::.1):1,(((b:.5)#H3:1)#H1:1,(#H3:0.8::.4)#H2:1):1,(#H2:.2::.0,c:1):1);") +PhyloNetworks.deletehybridedge!(net0, net0.edge[2], false,true,false,false) +net = deepcopy(net0) # delete edge 10 (with γ=0) then shrink 2-cycle +PhyloNetworks.deletehybridedge!(net, net.edge[7], false,true,false,false) +@test shrink3cycles!(net) +@test writenewick(net) == "(a:2.0,c:2.0,b:3.42);" +# shrink 3-cycle, which deletes edge 10 (with γ=0) : same result in the end +@test shrink3cycles!(net0) +@test writenewick(net) == "(a:2.0,c:2.0,b:3.42);" +end + +@testset "readwrite.jl" begin +exdir = joinpath(@__DIR__,"..","examples") +# exdir = joinpath(dirname(pathof(PhyloNetworks)), "..","examples") +ns = readmultinewick(joinpath(exdir,"net1.networks"), false) # not fast +@test length(ns) == 5 +ns = (@test_logs (:warn, r"won't erase with") (:warn, r"^skipped phylogeny on line 15") readnexus_treeblock( + joinpath(exdir,"test_reticulatetreeblock.nex"))) +@test length(ns) == 3 +@test tiplabels(ns[2]) == ["tax4","tax3","tax2","tax1"] +# net with a hybrid leaf +net = readnewick("((#H1:::0.1,b),c,#H1:::0.9);") +PhyloNetworks.addChild!(net, net.node[1]) +PhyloNetworks.addChild!(net, net.node[1]) +@test writenewick(net) == "((#H1:::0.1,b),c,(H1_4:0.0,H1_5:0.0)#H1:::0.9);" +PhyloNetworks.expandChild!(net, net.node[1]) +@test writenewick(net) == "((#H1:::0.1,b),c,((H1_5:0.0,H1_4:0.0)H1_6:0.0)#H1:::0.9);" +end + +end # of set of auxiliary test sets diff --git a/test/test_auxillary.jl b/test/test_auxillary.jl deleted file mode 100644 index 906b05a43..000000000 --- a/test/test_auxillary.jl +++ /dev/null @@ -1,85 +0,0 @@ -#= # for local testing, need this: -using Test -using PhyloNetworks -using PhyloPlots -using CSV -=# - -@testset "auxiliary" begin - -@testset "read level 1: hyb edge at root then 2-cycle" begin -@test_throws "cycle with only 2 nodes" readTopologyLevel1("((t9,((t3,t2))#H12:::0.52),#H12:::0.48);") -end - -@testset "setlengths and setgammas" begin -originalstdout = stdout -redirect_stdout(devnull) # requires julia v1.6 -@test_nowarn PhyloNetworks.citation() -redirect_stdout(originalstdout) - -str_level1_s = "(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" # indviduals S1A S1B S1C go on leaf 1 -net = readTopology(str_level1_s) - -PhyloNetworks.setlengths!([net.edge[1]], [1.1]) -@test net.edge[1].length == 1.1 -PhyloNetworks.setlengths!([net.edge[3], net.edge[4]], [3.3, 4.4]) -@test net.edge[3].length == 3.3 -@test net.edge[4].length == 4.4 - -PhyloNetworks.setmultiplegammas!([net.edge[18]], [0.25]) -@test net.edge[18].gamma == 0.25 -@test net.edge[16].gamma == 0.75 - -@test PhyloNetworks.getlengths([net.edge[1]]) == [net.edge[1].length] -@test PhyloNetworks.getlengths([net.edge[1], net.edge[5]]) == [net.edge[1].length, net.edge[5].length] -end - -@testset "hashybridladder" begin -tree = readTopology("(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);"); -@test !PhyloNetworks.hashybridladder(tree) -PhyloNetworks.addhybridedge!(tree, tree.edge[5], tree.edge[1], true) -PhyloNetworks.addhybridedge!(tree, tree.edge[2], tree.edge[1], true) -@test PhyloNetworks.hashybridladder(tree) -end # of testing hashybridladder - -@testset "shrink edges and cycles" begin -# shrink 1 edge, and hassinglechild -net = readTopology("((A:2.0,(((B1,B2):1.0)0.01)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5);") -@test !PhyloNetworks.shrinkedge!(net, net.edge[10]) -@test_throws Exception PhyloNetworks.shrinkedge!(net, net.edge[6]) # hybrid edge -@test_throws Exception PhyloNetworks.shrinkedge!(net, net.edge[3]) # external edge -@test hassinglechild(net.hybrid[1]) -@test hassinglechild(net.node[5]) && !net.node[5].hybrid # degree-2 tree node -@test !PhyloNetworks.shrinkedge!(net, net.edge[5]) -@test PhyloNetworks.shrinkedge!(net, net.edge[4]) -@test !hassinglechild(net.hybrid[1]) -# shrink cycles -net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);") -@test !shrink2cycles!(net) -@test !shrink3cycles!(net) -PhyloNetworks.addhybridedge!(net, net.edge[7], net.edge[4], true, 0.1, 0.2) -@test !shrink2cycles!(net) -@test shrink3cycles!(net) # tree case -@test writeTopology(net) == "(((A:2.0,(B:1.0)#H1:0.1::0.9):1.37,(C:0.6,#H1:1.0::0.1):0.9):0.6,D:2.0);" -PhyloNetworks.addhybridedge!(net, net.edge[3], net.edge[6], true, 0.3, 0.4) -@test shrink3cycles!(net) # hybrid case -@test writeTopology(net, round=true, digits=5) == "(((A:2.0,(B:1.0)#H1:0.13191::0.94):1.37,(C:0.6,#H1:1.0::0.06):0.9):0.6,D:2.0);" -net0 = readTopology("((((((a:1)#H1:1::.9)#H2:1::.8)#H3:1::.7,#H3:0.5):1,#H2:1):1,(#H1:1,b:1):1,c:1);") -net = deepcopy(net0) # new 2/3 cycles appear when some are shrunk -@test shrink2cycles!(net) -@test writeTopology(net, round=true) == "((#H1:1.0::0.1,b:1.0):1.0,c:1.0,(a:1.0)#H1:4.48::0.9);" -@test shrink3cycles!(net0) -writeTopology(net0, round=true) == "(c:1.1,a:5.132,b:1.9);" -# non-tree-child network: w shape -net0 = readTopology("((a:1,#H1:.1::.1):1,(((b:.5)#H3:1)#H1:1,(#H3:0.8::.4)#H2:1):1,(#H2:.2::.0,c:1):1);") -PhyloNetworks.deletehybridedge!(net0, net0.edge[2], false,true,false,false) -net = deepcopy(net0) # delete edge 10 (with γ=0) then shrink 2-cycle -PhyloNetworks.deletehybridedge!(net, net.edge[7], false,true,false,false) -@test shrink3cycles!(net) -@test writeTopology(net) == "(a:2.0,c:2.0,b:3.42);" -# shrink 3-cycle, which deletes edge 10 (with γ=0) : same result in the end -@test shrink3cycles!(net0) -@test writeTopology(net) == "(a:2.0,c:2.0,b:3.42);" -end - -end # of set of auxiliary test sets diff --git a/test/test_badDiamII.jl b/test/test_badDiamII.jl deleted file mode 100644 index a543b3b5f..000000000 --- a/test/test_badDiamII.jl +++ /dev/null @@ -1,88 +0,0 @@ -# updateGammaz does not recognize this as bad diamond II -# Claudia April 2015 - -PhyloNetworks.CHECKNET || error("need CHECKNET==true in PhyloNetworks to test snaq in test_correctLik.jl") - -@testset "test: bad diamond, max pseudo lik" begin -global tree, net, df, d - -tree = "(6,(5,#H7:0.0):9.970714072991349,(3,(((2,1):0.2950382234364404,4):0.036924483697671304)#H7:0.00926495670648208):1.1071489442240392);" -net = readTopologyLevel1(tree); -checkNet(net) -#printNodes(net) -#printEdges(net) -@test net.node[10].number == 3 # or: wrong hybrid -@test net.node[10].hybrid # or: does not know it is hybrid -@test net.node[10].isBadDiamondII # or: does not know it is bad diamond II -##plot(net,showedgenumber=true) -@test [e.inCycle for e in net.edge] == [-1,-1,3,3,-1,-1,-1,-1,-1,-1,3,3] # or: error in incycle -@test [e.containRoot for e in net.edge] == [true,true,false,true,true,false,false,false,false,false,false,true] # or: error in contain root -@test [e.istIdentifiable for e in net.edge] == [false,false,true,true,false,false,false,true,false,false,true,true] # or: istIdentifiable not correct -@test (net.edge[3].hybrid && net.edge[11].hybrid) # or: hybrid edges wrong") - -df=DataFrame(t1=["1","1","2","2","1","2","2","2","2","2","1","2","2","3","2"], - t2=["3","3","3","3","3","1","5","1","1","1","5","1","1","5","3"], - t3=["5","5","5","5","6","5","6","3","6","5","6","3","3","6","6"], - t4=["6","4","4","6","4","6","4","5","4","4","4","6","4","4","4"], - CF1234=[0.565,0.0005,0.0005,0.565,0.00003,0.99986,0.0410167,1,0.99987,1,0.040167,0.998667,1,0.073167,0.00003], - CF1324=[0.0903,0.8599,0.8599,0.0903,0.8885,0.00006,0.263,0,0.00006,0,0.2630,0.00006,0,0.0424667,0.8885]) -df[!,:CF1423] = 1.0 .- df[!,:CF1234] .- df[!,:CF1324] -d = readTableCF(df) - -Random.seed!(345); -net2 = topologyMaxQPseudolik!(net,d, ftolRel=1e-5,ftolAbs=1e-6,xtolRel=1e-3,xtolAbs=1e-4) -@test net2.loglik < 340.5 # loglik ~ 339.95 -@test net2.edge[3].istIdentifiable # or: wrong hybrid is t identifiable -# @test 9.95 < net2.edge[3].length < 9.99 -# why it's not a good idea to test the branch length estimate: -# BL~4.92 when loglik~339.95 -# BL>9.95 when loglik>340 -# BL~0.0 when loglik~339.88 (using tolerances of 1e-8) -@test net2.edge[11].istIdentifiable # or: wrong hybrid is t identifiable -@test net2.edge[11].length < 0.01 # or: wrong bl estimated -@test net2.edge[10].length == 0.0 # or: tree edge in bad diamond II not 0 -#printEdges(net2) - -@test_logs show(devnull, net2) -@test_logs [show(devnull, net2.node[i]) for i in [1,3,10]]; -@test_logs [show(devnull, net2.edge[i]) for i in [1,3,11]]; -@test_logs show(devnull, d) -@test_logs show(devnull, d.quartet[1]) -@test_logs show(devnull, d.quartet[1].qnet) -@test tipLabels(d.quartet) == ["1","2","3","4","5","6"] -a = (@test_logs fittedQuartetCF(d, :wide)); -@test size(a) == (15,10) -a = (@test_logs fittedQuartetCF(d, :long)); -@test size(a) == (45,7) - -end - -## testing readTopology---------------------------------------------------------------- -## will remove this from the test because readTopology should not have to worry about istIdentifiable -## we move into updateGammaz -## tree = "(6,(5,#H7:0.0):9.970714072991349,(3,(((2,1):0.2950382234364404,4):0.036924483697671304)#H7:0.00926495670648208):1.1071489442240392);" -## net2 = readTopology(tree) -## printEdges(net2) - -## for e in net2.edge -## if(e.node[1].leaf || e.node[2].leaf) -## !e.istIdentifiable || error("ext edge should not identifiable") -## else -## e.istIdentifiable || error("int edge should not identifiable") -## end -## end - -## ## this case works fine -## tree = "((((8,10))#H1,7),6,(4,#H1));" # Case I Bad diamond I -## net = readTopologyLevel1(tree) -## checkNet(net) -## net2 = readTopology(tree) -## printEdges(net2) - -## for e in net2.edge -## if(e.node[1].leaf || e.node[2].leaf) -## !e.istIdentifiable || error("ext edge should not identifiable") -## else -## e.istIdentifiable || error("int edge should not identifiable") -## end -## end diff --git a/test/test_bootstrap.jl b/test/test_bootstrap.jl index 938edd07e..a342f5134 100644 --- a/test/test_bootstrap.jl +++ b/test/test_bootstrap.jl @@ -3,13 +3,18 @@ exdir = joinpath(@__DIR__,"..","examples") # exdir = joinpath(dirname(pathof(PhyloNetworks)), "..","examples") -@testset "testing hybridBootstrapSupport" begin -bestnet = readTopology(joinpath(exdir,"fish2hyb.net")); -bootnet = readMultiTopology(joinpath(exdir,"fish3hyb_20boostrap.net")); +@testset "testing hybridclades_support" begin +bestnet = readnewick(joinpath(exdir,"fish2hyb.net")); +bootnet = readmultinewick(joinpath(exdir,"fish3hyb_20boostrap.net")); # issues with bootstrap networks 12, 21, 42, 96 # plot(bootnet[20], showedgenumber=true) # include(string(home, "bootstrap.jl")) -resn, rese, resc, gam, edgenum = hybridBootstrapSupport(bootnet,bestnet); + +bt = PhyloNetworks.samplebootstrap_multiloci([bootnet, bootnet]) +@test isa(bt, Vector{HybridNetwork}) +@test length(bt) == 2 + +resn, rese, resc, gam, edgenum = hybridclades_support(bootnet,bestnet); #@show resn; @show rese; showall(gam); @show edgenum; resc # plot(bestnet, shownodenumber=true); @@ -40,43 +45,5 @@ PhyloNetworks.addAlternativeHybridizations!(bestnet, rese, cutoff=4) @test rese[[5,10,11],:edge] == [54,57,60] @test ismissing(rese[6,:edge]) @test length(bestnet.hybrid) == 5 -end # of testset, hybridBootstrapSupport - -@testset "bootsnaq from quartet CF intervals" begin -T=readTopology(joinpath(exdir,"startTree.txt")) -datf=DataFrame(CSV.File(joinpath(exdir,"tableCFCI.csv")); copycols=false) -originalstdout = stdout -redirect_stdout(devnull) # requires julia v1.6 -bootnet = bootsnaq(T,datf,nrep=2,runs=1,seed=1234,filename="",Nfail=2, - ftolAbs=1e-3,ftolRel=1e-3,xtolAbs=1e-4,xtolRel=1e-3,liktolAbs=0.01) -redirect_stdout(originalstdout) -@test size(bootnet)==(2,) -@test writeTopology(bootnet[1], round=true) != writeTopology(bootnet[2], round=true) -# "(2,((5,#H9:0.0::0.298):3.927,3):1.331,(((1,6):0.019,4):0.0)#H9:0.0::0.702);" -# above: bad diamond 2, and both edges above the hybrid have estimated length of 0.0... -end +end # of testset, hybridclades_support -@testset "bootsnaq from bootstrap gene trees, multiple procs" begin -treefile = joinpath(exdir,"treefile.txt") # pretending these are bootstrap trees, for all genes -boottrees = Vector{HybridNetwork}[] -T=readTopology(joinpath(exdir,"startTree.txt")) -net1 = readTopology("(5,(((2,(1)#H7:::0.7143969494428192):1.5121337017411736,4):0.4894187322508883,3):0.519160762355313,(6,#H7:::0.2856030505571808):10.0);") -for i=1:13 push!(boottrees, readMultiTopology(treefile)) end -for i=1:13 @test size(boottrees[i])==(10,) end # 10 bootstrap trees for each of 13 "genes" -addprocs(1) -@everywhere using PhyloNetworks -# using Distributed; @everywhere begin; using Pkg; Pkg.activate("."); using PhyloNetworks; end -originalstdout = stdout -redirect_stdout(devnull) -bootnet = bootsnaq(T,boottrees,nrep=2,runs=2,otherNet=net1,seed=1234, - prcnet=0.5,filename="",Nfail=2,ftolAbs=1e-3,ftolRel=1e-3) -redirect_stdout(originalstdout) -rmprocs(workers()) -@test size(bootnet)==(2,) -@test all(n -> n.numHybrids==1, bootnet) -@test writeTopology(bootnet[1], round=true, digits=1) != writeTopology(bootnet[2], round=true, digits=1) -filelist = joinpath(exdir, "treefilelist.txt") -boottrees = readBootstrapTrees(filelist) -@test length(boottrees) == 2 -@test [length(b) for b in boottrees] == [10, 10] -end diff --git a/test/test_calculateExpCF.jl b/test/test_calculateExpCF.jl deleted file mode 100644 index ff11121c8..000000000 --- a/test/test_calculateExpCF.jl +++ /dev/null @@ -1,446 +0,0 @@ -# test of calculateExpCF function -# Claudia December 2014 - -# Case G ----------------- - -#println("------ Case G ----------") -include("../examples/case_g_example.jl") -# include(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","case_g_example.jl")) -error1 = false -ind = 0 - -q1 = Quartet(1,["6","7","4","8"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q1); -try - identifyQuartet!(qnet) - qnet.which != 1 ? error("qnet which not correctly assigned") : nothing - qnet.hybrid[1].k != 3 ? error("qnet.hybrid[1].k not correctly assigned") : nothing - qnet.hybrid[1].typeHyb != 2 ? error("qnet.hybrid[1].typeHyb not correctly assigned") : nothing - qnet.hybrid[1].prev.number != -7 ? error("qnet.hybrid[1].prev not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 0 || qnet.numHybrids != 0 ? error("qnet should not have hybrid nodes anymore") : nothing - qnet.t1 != 0.2-log(1-0.1*(1-exp(-1.1))) ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [1,1,2,2] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [2,1,2] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [1/3*exp(-qnet.t1),1-2/3*exp(-qnet.t1),1/3*exp(-qnet.t1)] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 1") - global error1 |= true - global ind = 1 -end - - -q2 = Quartet(2,["6","7","10","8"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q2); -try - identifyQuartet!(qnet) - qnet.which != 2 ? error("qnet which not correctly assigned") : nothing - qnet.hybrid[1].k != 4 ? error("qnet.hybrid[1].k not correctly assigned") : nothing - qnet.hybrid[1].typeHyb != 5 ? error("qnet.hybrid[1].typeHyb not correctly assigned") : nothing - !isa(qnet.hybrid[1].prev,Nothing) ? error("qnet.hybrid[1].prev not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 1 || qnet.numHybrids != 1 ? error("qnet should have 1 hybrid nodes") : nothing - qnet.t1 != -1 ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [-1,-1,-1,-1] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [-1,-1,-1] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [0.9*(1-2/3*exp(-0.1))+0.1*1/3*exp(-1.0), 0.9*(1/3*exp(-0.1))+0.1*(1-2/3*exp(-1.0)), 0.9*(1/3*exp(-0.1))+0.1*(1/3*exp(-1.0))] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 2") - global error1 |= true - global ind = 2 -end - -q3 = Quartet(3,["10","7","4","8"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q3); -try - identifyQuartet!(qnet) - qnet.which != 2 ? error("qnet which not correctly assigned") : nothing - qnet.hybrid[1].k != 4 ? error("qnet.hybrid[1].k not correctly assigned") : nothing - qnet.hybrid[1].typeHyb != 5 ? error("qnet.hybrid[1].typeHyb not correctly assigned") : nothing - !isa(qnet.hybrid[1].prev,Nothing) ? error("qnet.hybrid[1].prev not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 1 || qnet.numHybrids != 1 ? error("qnet should have 1 hybrid nodes") : nothing - qnet.t1 != -1 ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [-1,-1,-1,-1] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [-1,-1,-1] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [0.9*(1/3*exp(-0.1))+0.1*1/3*exp(-1.0), 0.9*(1/3*exp(-0.1))+0.1*(1-2/3*exp(-1.0)), 0.9*(1-2/3*exp(-0.1))+0.1*(1/3*exp(-1.0))] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 3") - global error1 |= true - global ind = 3 -end - -q4 = Quartet(4,["6","10","4","8"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q4); -try - identifyQuartet!(qnet) - qnet.which != 1 ? error("qnet which not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 0 || qnet.numHybrids != 0 ? error("qnet should not have hybrid nodes anymore") : nothing - qnet.t1 > 0.30001 || qnet.t1 < 0.2999999999 ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [1,1,2,2] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [2,1,2] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [1/3*exp(-qnet.t1),1-2/3*exp(-qnet.t1),1/3*exp(-qnet.t1)] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 4") - global error1 |= true - global ind = 4 -end - - -q5 = Quartet(5,["6","7","4","10"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q5); -try - identifyQuartet!(qnet) - qnet.which != 1 ? error("qnet which not correctly assigned") : nothing - qnet.hybrid[1].k != 3 ? error("qnet.hybrid[1].k not correctly assigned") : nothing - qnet.hybrid[1].typeHyb != 2 ? error("qnet.hybrid[1].typeHyb not correctly assigned") : nothing - qnet.hybrid[1].prev.number != -3 ? error("qnet.hybrid[1].prev not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 0 || qnet.numHybrids != 0 ? error("qnet should not have hybrid nodes anymore") : nothing - qnet.t1 != 0.2-log(1-0.1*(1-exp(-0.1))) ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [1,1,2,2] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [2,1,2] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [1/3*exp(-qnet.t1),1-2/3*exp(-qnet.t1),1/3*exp(-qnet.t1)] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 5") - global error1 |= true - global ind = 5 -end - -if error1 - throw("error Case G in quartet $(ind)") -end - - - -# Case F Bad Diamond I ----------------- - -#println("------ Case F Bad diamond I ----------") -include("../examples/case_f_example.jl"); -# include(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","case_f_example.jl")) -error1 = false -ind = 0 -parameters!(net) - -q1 = Quartet(1,["6","7","4","8"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q1); -try - identifyQuartet!(qnet) - qnet.which != 2 ? error("qnet which not correctly assigned") : nothing - qnet.hybrid[1].k != 4 ? error("qnet.hybrid[1].k not correctly assigned") : nothing - qnet.hybrid[1].typeHyb != 5 ? error("qnet.hybrid[1].typeHyb not correctly assigned") : nothing - !isa(qnet.hybrid[1].prev,Nothing) ? error("qnet.hybrid[1].prev not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 1 || qnet.numHybrids != 1 ? error("qnet should not have hybrid nodes anymore") : nothing - qnet.t1 != -1 ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [-1,-1,-1,-1] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [-1,-1,-1] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [(1-(0.7*(1-exp(-0.2)))-(0.3*(1-exp(-0.1))))/3, (1+2*(0.7*(1-exp(-0.2)))-(0.3*(1-exp(-0.1))))/3,(1-(0.7*(1-exp(-0.2)))+2*(0.3*(1-exp(-0.1))))/3] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 1") - global error1 |= true - global ind = 1 -end - - -q2 = Quartet(2,["6","7","10","8"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q2); -try - identifyQuartet!(qnet) - qnet.which != 1 ? error("qnet which not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 0 || qnet.numHybrids != 0 ? error("qnet should have 0 hybrid nodes") : nothing - qnet.t1 != 0.1 ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [1,1,2,2] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [1,2,2] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [1-2/3*(exp(-0.1)),1/3*(exp(-0.1)),1/3*(exp(-0.1))] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 2") - global error1 |= true - global ind = 2 -end - -q3 = Quartet(3,["10","7","4","8"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q3); -try - identifyQuartet!(qnet) - qnet.which != 1 ? error("qnet which not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 0 || qnet.numHybrids != 0 ? error("qnet should have 0 hybrid nodes") : nothing - qnet.t1 != 0.1-log(1-(0.3*(1-exp(-0.1)))) ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [1,1,2,2] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [2,2,1] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [1/3*exp(-qnet.t1),1/3*exp(-qnet.t1),1-2/3*exp(-qnet.t1)] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 3") - global error1 |= true - global ind = 3 -end - - -q4 = Quartet(4,["6","10","4","8"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q4); - -try - identifyQuartet!(qnet) - qnet.which != 1 ? error("qnet which not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 0 || qnet.numHybrids != 0 ? error("qnet should have 0 hybrid nodes") : nothing - qnet.t1 != 0.1-log(1-(0.7*(1-exp(-0.2)))) ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [1,1,2,2] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [2,1,2] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [1/3*exp(-qnet.t1),1-2/3*exp(-qnet.t1),1/3*exp(-qnet.t1)] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 4") - global error1 |= true - global ind = 4 -end - - -q5 = Quartet(5,["6","7","4","10"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q5); -try - identifyQuartet!(qnet) - qnet.which != 2 ? error("qnet which not correctly assigned") : nothing - qnet.hybrid[1].k != 4 ? error("qnet.hybrid[1].k not correctly assigned") : nothing - qnet.hybrid[1].typeHyb != 5 ? error("qnet.hybrid[1].typeHyb not correctly assigned") : nothing - !isa(qnet.hybrid[1].prev,Nothing) ? error("qnet.hybrid[1].prev not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 1 || qnet.numHybrids != 1 ? error("qnet should not have hybrid nodes anymore") : nothing - qnet.t1 != -1 ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [-1,-1,-1,-1] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [-1,-1,-1] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [(1-0.7*(1-exp(-0.2))-0.3*(1-exp(-0.1)))/3,(1+2*0.7*(1-exp(-0.2))-0.3*(1-exp(-0.1)))/3,(1-0.7*(1-exp(-0.2))+2*0.3*(1-exp(-0.1)))/3] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 5") - global error1 |= true - global ind = 5 -end - -if error1 - throw("error Case F in quartet $(ind)") -end - - -# Case I Bad Diamond II ----------------- - -#println("------ Case I Bad diamond II ----------") -include("../examples/case_i_example.jl"); -# include(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","case_i_example.jl")) -error1 = false -ind = 0 - -q1 = Quartet(1,["6","7","4","8"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q1); -try - identifyQuartet!(qnet) - qnet.which != 2 ? error("qnet which not correctly assigned") : nothing - qnet.hybrid[1].k != 4 ? error("qnet.hybrid[1].k not correctly assigned") : nothing - qnet.hybrid[1].typeHyb != 5 ? error("qnet.hybrid[1].typeHyb not correctly assigned") : nothing - !isa(qnet.hybrid[1].prev,Nothing) ? error("qnet.hybrid[1].prev not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 1 || qnet.numHybrids != 1 ? error("qnet should not have hybrid nodes anymore") : nothing - qnet.t1 != -1 ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [-1,-1,-1,-1] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [-1,-1,-1] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [0.9*(1/3*exp(-1))+0.1*(1-2/3*exp(-1)),0.9*(1-2/3*exp(-1))+0.1*1/3*exp(-1),0.9*(1/3*exp(-1))+0.1*(1/3*exp(-1))] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 1") - global error1 |= true - global ind = 1 -end - - -q2 = Quartet(2,["6","7","10","8"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q2); -try - identifyQuartet!(qnet) - qnet.which != 1 ? error("qnet which not correctly assigned") : nothing - qnet.hybrid[1].k != 3 ? error("qnet.hybrid[1].k not correctly assigned") : nothing - qnet.hybrid[1].typeHyb != 4 ? error("qnet.hybrid[1].typeHyb not correctly assigned") : nothing - (qnet.hybrid[1].prev.number != -2 && qnet.hybrid[1].prev.number != -3) ? error("qnet.hybrid[1].prev not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 0 || qnet.numHybrids != 0 ? error("qnet should have 0 hybrid nodes") : nothing - !approxEq(qnet.t1,-log(1+0.1*(1-exp(-1))-0.1*0.1*(1-exp(-1-1))-0.1*0.1*(1-exp(-1))-0.9*0.9*(1-exp(-2.)))) ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [1,1,2,2] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [1,2,2] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [1-2/3*(exp(-qnet.t1)),1/3*(exp(-qnet.t1)),1/3*(exp(-qnet.t1))] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 2") - global error1 |= true - global ind = 2 -end - -q3 = Quartet(3,["10","7","4","8"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q3); -try - identifyQuartet!(qnet) - qnet.which != 1 ? error("qnet which not correctly assigned") : nothing - qnet.hybrid[1].k != 3 ? error("qnet.hybrid[1].k not correctly assigned") : nothing - qnet.hybrid[1].typeHyb != 4 ? error("qnet.hybrid[1].typeHyb not correctly assigned") : nothing - (qnet.hybrid[1].prev.number != -6 && qnet.hybrid[1].prev.number != -3) ? error("qnet.hybrid[1].prev not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 0 || qnet.numHybrids != 0 ? error("qnet should have 0 hybrid nodes") : nothing - !approxEq(qnet.t1,-log(1+0.1*(1-exp(-2))-0.1*0.1*(1-exp(-1))-0.1*0.1*(1-exp(-2))-0.9*0.9*(1-exp(-2.)))) ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [1,1,2,2] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [2,2,1] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [1/3*exp(-qnet.t1),1/3*exp(-qnet.t1),1-2/3*exp(-qnet.t1)] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 3") - global error1 |= true - global ind = 3 -end - - -q4 = Quartet(4,["6","10","4","8"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q4); - -try - identifyQuartet!(qnet) - qnet.which != 1 ? error("qnet which not correctly assigned") : nothing - qnet.hybrid[1].k != 3 ? error("qnet.hybrid[1].k not correctly assigned") : nothing - qnet.hybrid[1].typeHyb != 4 ? error("qnet.hybrid[1].typeHyb not correctly assigned") : nothing - (qnet.hybrid[1].prev.number != -6 && qnet.hybrid[1].prev.number != -3) ? error("qnet.hybrid[1].prev not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 0 || qnet.numHybrids != 0 ? error("qnet should have 0 hybrid nodes") : nothing - !approxEq(qnet.t1,-log(1+0.1*(1-exp(-1))-0.1*0.1*(1-exp(-1))-0.1*0.1*(1-exp(-1))-0.9*0.9*(1-exp(-3)))) ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [1,1,2,2] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [2,1,2] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [1/3*exp(-qnet.t1),1-2/3*exp(-qnet.t1),1/3*exp(-qnet.t1)] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 4") - global error1 |= true - global ind = 4 -end - - -q5 = Quartet(5,["6","7","4","10"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net,q5); -try - identifyQuartet!(qnet) - qnet.which != 2 ? error("qnet which not correctly assigned") : nothing - qnet.hybrid[1].k != 4 ? error("qnet.hybrid[1].k not correctly assigned") : nothing - qnet.hybrid[1].typeHyb != 5 ? error("qnet.hybrid[1].typeHyb not correctly assigned") : nothing - !isa(qnet.hybrid[1].prev,Nothing) ? error("qnet.hybrid[1].prev not correctly assigned") : nothing - - eliminateHybridization!(qnet) - size(qnet.hybrid,1) != 1 || qnet.numHybrids != 1 ? error("qnet should not have hybrid nodes anymore") : nothing - qnet.t1 != -1 ? error("internal edge length not correctly updated") : nothing - - updateSplit!(qnet) - qnet.split != [-1,-1,-1,-1] ? error("qnet.split not correctly assigned") : nothing - - updateFormula!(qnet) - qnet.formula != [-1,-1,-1] ? error("qnet.formula not correctly assigned") : nothing - - calculateExpCF!(qnet) - qnet.expCF != [0.9*(1/3*exp(-1))+0.1*(1-2/3*exp(-1)),0.9*(1-2/3*exp(-1))+0.1*1/3*exp(-1),0.9*(1/3*exp(-1))+0.1*(1/3*exp(-1))] ? error("qnet.expCF wrongly calculated") : nothing -catch - println("errors in quartet 5") - global error1 |= true - global ind = 5 -end - -if error1 - throw("error Case I in quartet $(ind)") -end - diff --git a/test/test_calculateExpCF2.jl b/test/test_calculateExpCF2.jl deleted file mode 100644 index 2485de520..000000000 --- a/test/test_calculateExpCF2.jl +++ /dev/null @@ -1,36 +0,0 @@ -# test function from a debugging case in simScript.jl -# in julia/debug/bigSimulation/n6/julia -# seed 4545 -# Claudia August 2015 - -# to debug problem -tree="(3,(2,(((6,(5)#H9:0.91507):0.93066,(4,#H9:0.0):0.73688):0.0)#H7:1.79104::0.99498):0.11675,(1,#H7:0.04487::0.00502):0.4897);" -net0=readTopologyLevel1(tree); -#printEdges(net0) -net0.node[6].gammaz =1.0 #-5 -net0.node[8].gammaz =0.067 #-7 - -q1 = Quartet(1,["6","5","4","1"],[0.5,0.4,0.1]); -qnet = extractQuartet!(net0,q1); -#printEdges(qnet) - -identifyQuartet!(qnet) -qnet.which != 2 ? error("qnet which not correctly assigned") : nothing -#printEdges(qnet) - -eliminateHybridization!(qnet) -qnet.which != 2 ? error("qnet which not correctly assigned") : nothing -qnet.numHybrids == 1 || error("qnet not correctly eliminated hyb") -qnet.hybrid[1].k == 4 || error("qnet not correclty identified") -qnet.hybrid[1].typeHyb == 5 || error("qnet not correclty identified") -qnet.hybrid[1].isBadDiamondI || error("qnet forgot it is a bad diamondI") - -updateSplit!(qnet) -qnet.split != [-1,-1,-1,-1] ? error("qnet.split not correctly assigned") : nothing - -updateFormula!(qnet) -qnet.formula != [-1,-1,-1] ? error("qnet.formula not correctly assigned") : nothing - -calculateExpCF!(qnet) -qnet.expCF[2] < 0. || error("expCF not correctly calculated") - diff --git a/test/test_calibratePairwise.jl b/test/test_calibratePairwise.jl index ec4623da9..7f1519edf 100644 --- a/test/test_calibratePairwise.jl +++ b/test/test_calibratePairwise.jl @@ -1,6 +1,6 @@ @testset "calibrate with distances: 3-cycle, non-identifiable example" begin -net2 = readTopology("((((D:0.1,C:0.2):1.5,(B:0.1)#H1:0.9::0.7):0.1,(#H1:0.01::0.3,A:0.3):0.8):0.1);") -dAll = pairwiseTaxonDistanceMatrix(net2, keepInternal=true) +net2 = readnewick("((((D:0.1,C:0.2):1.5,(B:0.1)#H1:0.9::0.7):0.1,(#H1:0.01::0.3,A:0.3):0.8):0.1);") +dAll = pairwisetaxondistancematrix(net2, keepInternal=true) @test dAll ≈ [0.0 .8 1.1 .1 .943 1.043 1.6 1.8 1.7 0.8 0.0 0.3 0.9 1.263 1.363 2.4 2.6 2.5 1.1 0.3 0.0 1.2 1.563 1.663 2.7 2.9 2.8 @@ -11,28 +11,28 @@ dAll = pairwiseTaxonDistanceMatrix(net2, keepInternal=true) 1.8 2.6 2.9 1.7 2.603 2.703 0.2 0.0 0.3 1.7 2.5 2.8 1.6 2.503 2.603 0.1 0.3 0.0] taxa = [l.name for l in net2.leaf] -net2distances = pairwiseTaxonDistanceMatrix(net2) +net2distances = pairwisetaxondistancematrix(net2) @test net2distances ≈ [.0 .3 2.603 2.8 0.3 0.0 2.703 2.9 2.603 2.703 0.0 1.663 2.8 2.9 1.663 0.0] -g = PhyloNetworks.pairwiseTaxonDistanceGrad(net2); +g = PhyloNetworks.pairwisetaxondistance_gradient(net2); @test size(g) == (9,9,9) -na = getNodeAges(net2); +na = getnodeages(net2); @test na ≈ [1.7,0.11,0.0,1.6,0.1,0.0,0.1,0.0,0.0] -g = PhyloNetworks.pairwiseTaxonDistanceGrad(net2, nodeAges=na); +g = PhyloNetworks.pairwisetaxondistance_gradient(net2, nodeAges=na); @test size(g) == (9,9,9) @test g[:,:,1] ≈ [0 1 1 1 1 1 1 1 1;1 0 0 2 1.4 1.4 2 2 2; 1 0 0 2 1.4 1.4 2 2 2 1 2 2 0 .6 .6 0 0 0; 1 1.4 1.4 .6 0 0 .6 .6 .6; 1 1.4 1.4 .6 0 0 .6 .6 .6 1 2 2 0 .6 .6 0 0 0; 1 2 2 0 .6 .6 0 0 0; 1 2 2 0 .6 .6 0 0 0] global net -net = readTopology("((#H1:0.06::0.3,A:0.6):1.3,(B:0.1)#H1:0.7::0.7,(C,D):1.4);"); +net = readnewick("((#H1:0.06::0.3,A:0.6):1.3,(B:0.1)#H1:0.7::0.7,(C,D):1.4);"); # same topology, unrooted, different BL, leaves ordered differently # here: branch lengths not identifiable, even if minor fixed to 0 -calibrateFromPairwiseDistances!(net, net2distances, taxa, #verbose=true, +calibratefrompairwisedistances!(net, net2distances, taxa, #verbose=true, forceMinorLength0=true, ultrametric=false) -est = pairwiseTaxonDistanceMatrix(net, checkPreorder=false) +est = pairwisetaxondistancematrix(net, checkpreorder=false) @test est ≈ [0 1.663 2.9 2.8; 1.663 0 2.703 2.603; 2.9 2.703 0 .3; 2.8 2.603 .3 0] atol=.00002 # deep LN_BOBYQA: 146 evaluations @@ -43,10 +43,10 @@ est = pairwiseTaxonDistanceMatrix(net, checkPreorder=false) # second call, starting from solution: # got 0.0 at [0.00536, 1.32092, 0.14155, 0.84493, 0.2, 0.1, 1.37373] after 29 iterations (returned FTOL_REACHED) -net = readTopology("((#H1:0.06::0.3,A:0.6):1.3,(B:0.1)#H1:0.7::0.7,(C,D):1.4);"); -calibrateFromPairwiseDistances!(net, net2distances, taxa, +net = readnewick("((#H1:0.06::0.3,A:0.6):1.3,(B:0.1)#H1:0.7::0.7,(C,D):1.4);"); +calibratefrompairwisedistances!(net, net2distances, taxa, verbose=false, forceMinorLength0=false, ultrametric=false) -est = pairwiseTaxonDistanceMatrix(net) +est = pairwisetaxondistancematrix(net) @test est ≈ [0 1.663 2.9 2.8; 1.663 0 2.703 2.603; 2.9 2.703 0 .3; 2.8 2.603 .3 0] atol=.00002 end @@ -56,54 +56,71 @@ end # minor hybrid to length 0 and ultrametric network # not identifiable otherwise global net -net = readTopology("((Ag:3.0,(#H1:0.0::0.2,Ak:2.5):0.5):0.5,(((((Az:0.2,Ag2:0.2):1.3,As:1.5):1.0)#H1:0.3::0.8,Ap:2.8):0.2,Ar:3.0):0.5);"); +net = readnewick("((Ag:3.0,(#H1:0.0::0.2,Ak:2.5):0.5):0.5,(((((Az:0.2,Ag2:0.2):1.3,As:1.5):1.0)#H1:0.3::0.8,Ap:2.8):0.2,Ar:3.0):0.5);"); taxa = [l.name for l in net.leaf]; -netdist = pairwiseTaxonDistanceMatrix(net); -@test getNodeAges(net) ≈ [3.5,3,0,2.8,0,3,2.5,0,2.5,1.5,0,.2,0,0,0] -net = readTopology("((((((Ag2,Az),As))#H1:::0.8,Ap),Ar),(Ag,(#H1:::0.2,Ak)));"); +netdist = pairwisetaxondistancematrix(net); +@test getnodeages(net) ≈ [3.5,3,0,2.8,0,3,2.5,0,2.5,1.5,0,.2,0,0,0] +net = readnewick("((((((Ag2,Az),As))#H1:::0.8,Ap),Ar),(Ag,(#H1:::0.2,Ak)));"); # same topology, no BL, leaves ordered differently o = [4,3,5,6,7,1,2]; # to get leaves in same order as in taxa. inverse: [6,7,2,1,3,4,5] -calibrateFromPairwiseDistances!(net, netdist, taxa, +calibratefrompairwisedistances!(net, netdist, taxa, forceMinorLength0=true, ultrametric=false) # got 0.0 at [0.19998, 0.19998, 1.30003, 1.5, 0.6802, 0.69964, 2.79995, 0.20002, 2.99995, 0.50006, 2.9999, 2.49952, 0.50049, 0.50006] after 1000 iterations (returned MAXEVAL_REACHED) -est = pairwiseTaxonDistanceMatrix(net, checkPreorder=false) +est = pairwisetaxondistancematrix(net, checkpreorder=false) @test est ≈ netdist[o,o] atol=.0005 # most edge lengths are correct, except for 5 edges: # - the 2 edges at the root: expected (the network should be unrooted) # when the optimization uses LN_BOBYQA # - the 3 edges connecting to the hybrid node: lack of identifiability? -net = readTopology("((((((Ag2,Az),As))#H1:::0.8,Ap),Ar),(Ag,(#H1:::0.2,Ak)));"); +net = readnewick("((((((Ag2,Az),As))#H1:::0.8,Ap),Ar),(Ag,(#H1:::0.2,Ak)));"); # same topology, no BL, leaf ordered differently for e in net.edge e.length=1.0; end preorder!(net) -na = getNodeAges(net); +na = getnodeages(net); @test na ≈ [6.,1,4,0,0,5,0,4,0,3,2,0,1,0,0] -pairwiseTaxonDistanceMatrix(net, nodeAges=na); # update edge lengths in net +pairwisetaxondistancematrix(net, nodeAges=na); # update edge lengths in net @test [e.length for e in net.edge] ≈ [1.,1,1,2,1,1,4,1,5,1,1,1,4,-3,5] -g = PhyloNetworks.pairwiseTaxonDistanceGrad(net, nodeAges=na); +g = PhyloNetworks.pairwisetaxondistance_gradient(net, nodeAges=na); net.edge[11].length = 4.; # to respect constraints net.edge[14].length = 0.; net.edge[15].length = 2.; net1 = deepcopy(net); -fmin, na = calibrateFromPairwiseDistances!(net1, netdist, taxa, #verbose=true, +fmin, na = calibratefrompairwisedistances!(net1, netdist, taxa, #verbose=true, forceMinorLength0=false, ultrametric=true) # got 0.0 at [3.5, 3.0, 2.50001, 3.0, 2.8, 1.95797, 1.5, 0.2] after 58 iterations (returned FTOL_REACHED) -est = pairwiseTaxonDistanceMatrix(net1) +est = pairwisetaxondistancematrix(net1) @test est ≈ netdist[o,o] atol=.0005 # still not identifiable: all good but the 3 edges adjacent to hybrid node # only the age of the hybrid node is wrong: zipped down nearer tips -calibrateFromPairwiseDistances!(net, netdist, taxa, #verbose=true, +calibratefrompairwisedistances!(net, netdist, taxa, #verbose=true, forceMinorLength0=true, ultrametric=true, NLoptMethod=:LN_COBYLA) -est = pairwiseTaxonDistanceMatrix(net) +est = pairwisetaxondistancematrix(net) @test est ≈ netdist[o,o] atol=.06 # hard problem? reached max # iterations -calibrateFromPairwiseDistances!(net, netdist, taxa, #verbose=true, +calibratefrompairwisedistances!(net, netdist, taxa, #verbose=true, forceMinorLength0=true, ultrametric=true) -est = pairwiseTaxonDistanceMatrix(net) +est = pairwisetaxondistancematrix(net) @test est ≈ netdist[o,o] atol=.06 est = [e.length for e in net.edge] el = [.2,.2,1.3,1.5,1,.3,2.8,.2,3,.5,3,0,2.5,.5,.5] @test est ≈ el atol=0.06 end + +@testset "starting BL by fitting data-estimated distances" begin +trait_weights = [3,2,1,1,1] +trait_dat = Vector{Vector{Union{Missings.Missing,Int}}}([ + [4,3,4,1,3], # taxon 1 + [4,3,1,1,3], + [4,3,1,1,2], + [4,3,1,missing,missing], + [4,3,1,4,2], # taxon 5 +]) +net = readnewick("((t1,t2),(t3,t4),t5);"); +# printnodes(net) # leaf named "ti" does have node.number i +PhyloNetworks.startingBL!(net, trait_dat, trait_weights) +# ((t1:0.159,t2:0.0):0.099,(t3:0.018,t4:0.0):0.0,t5:0.146); +@test all([e.length for e in net.edge] .≈ + [0.1586697132288586, 0.0001, 0.09935344568620236, 0.018499865670972223, 0.0001, 0.0001, 0.14620582339229848]) +end diff --git a/test/test_compareNetworks.jl b/test/test_compareNetworks.jl index d1fbfaa0c..3b6c231cd 100644 --- a/test/test_compareNetworks.jl +++ b/test/test_compareNetworks.jl @@ -1,8 +1,5 @@ -# test of deletehybridedge!, functions to extract displayed trees/subnetworks, -# used to compare networks with the hardwired cluster distance. -# Cecile March 2016 - if !(@isdefined doalltests) doalltests = false; end + @testset "test sets: compareNetworks" begin global net, tree #----------------------------------------------------------# @@ -10,262 +7,256 @@ global net, tree #----------------------------------------------------------# @testset "testing deletehybridedge!" begin +PN = PhyloNetworks # local to testset + # with nofuse=true netstr = "(((A:4.0,(B:1.0)#H1:1.1::0.9):0.5,(C:0.6,#H1:1.0::0.1):1.0):3.0,D:5.0);" -net = readTopology(netstr) -@test_logs PhyloNetworks.deletehybridedge!(net, net.edge[6], true); -@test writeTopology(net) == "(((A:4.0,(B:1.0)H1:1.1):0.5,(C:0.6):1.0):3.0,D:5.0);" +net = readnewick(netstr) +@test_logs PN.deletehybridedge!(net, net.edge[6], true); +@test writenewick(net) == "(((A:4.0,(B:1.0)H1:1.1):0.5,(C:0.6):1.0):3.0,D:5.0);" @test net.edge[3].gamma == 0.9 @test net.node[3].name == "H1" -net = readTopology(netstr) -@test_logs PhyloNetworks.deletehybridedge!(net, net.edge[3], true); -@test writeTopology(net) == "(((A:4.0):0.5,(C:0.6,(B:1.0)H1:1.0):1.0):3.0,D:5.0);" +net = readnewick(netstr) +@test_logs PN.deletehybridedge!(net, net.edge[3], true); +@test writenewick(net) == "(((A:4.0):0.5,(C:0.6,(B:1.0)H1:1.0):1.0):3.0,D:5.0);" @test net.edge[5].gamma == 0.1 @test !net.edge[5].hybrid -@test net.edge[5].isMajor +@test net.edge[5].ismajor @test net.node[3].name == "H1" @test !net.node[3].hybrid # example of network with one hybrid edge connected to the root # 3 edges below the root (1 of them hybrid): netstr = "((Adif:1.0,(Aech:0.122,#H6:10.0::0.047):10.0):1.614,Aten:1.0,((Asub:1.0,Agem:1.0):0.0)#H6:5.062::0.953);"; -net = readTopology(netstr); -@test_logs PhyloNetworks.deletehybridedge!(net, net.edge[10]); # will be rooted -@test writeTopology(net) == "((Adif:1.0,(Aech:0.122,(Asub:1.0,Agem:1.0):10.0):10.0):1.614,Aten:1.0);" -net = readTopology(netstr); -@test_logs PhyloNetworks.deletehybridedge!(net, net.edge[10], false, true); # unrooted -@test writeTopology(net) == "(Adif:1.0,(Aech:0.122,(Asub:1.0,Agem:1.0):10.0):10.0,Aten:2.614);" -net = readTopology(netstr); -@test_logs PhyloNetworks.deletehybridedge!(net, net.edge[3]); -@test writeTopology(net) == "((Adif:1.0,Aech:10.122):1.614,Aten:1.0,(Asub:1.0,Agem:1.0):5.062);" +net = readnewick(netstr); +@test_logs PN.deletehybridedge!(net, net.edge[10]); # will be rooted +@test writenewick(net) == "((Adif:1.0,(Aech:0.122,(Asub:1.0,Agem:1.0):10.0):10.0):1.614,Aten:1.0);" +net = readnewick(netstr); +@test_logs PN.deletehybridedge!(net, net.edge[10], false, true); # unrooted +@test writenewick(net) == "(Adif:1.0,(Aech:0.122,(Asub:1.0,Agem:1.0):10.0):10.0,Aten:2.614);" +net = readnewick(netstr); +@test_logs PN.deletehybridedge!(net, net.edge[3]); +@test writenewick(net) == "((Adif:1.0,Aech:10.122):1.614,Aten:1.0,(Asub:1.0,Agem:1.0):5.062);" # 2 edges below the root (1 of them hybrid): netstr = "((Adif:1.0,(Aech:0.122,#H6:10.0::0.047):10.0):1.614,((Asub:1.0,Agem:1.0):0.0)#H6:5.062::0.953);"; -net = readTopology(netstr); -@test_logs PhyloNetworks.deletehybridedge!(net, net.edge[9]); -@test writeTopology(net) == "(Adif:1.0,(Aech:0.122,(Asub:1.0,Agem:1.0):10.0):10.0);" -net = readTopology(netstr); -@test_logs PhyloNetworks.deletehybridedge!(net, net.edge[9], true); -@test writeTopology(net) == "(Adif:1.0,(Aech:0.122,((Asub:1.0,Agem:1.0):0.0)H6:10.0):10.0);" -net = readTopology(netstr); -@test_logs PhyloNetworks.deletehybridedge!(net, net.edge[9], true, false, false, +net = readnewick(netstr); +@test_logs PN.deletehybridedge!(net, net.edge[9]); +@test writenewick(net) == "(Adif:1.0,(Aech:0.122,(Asub:1.0,Agem:1.0):10.0):10.0);" +net = readnewick(netstr); +@test_logs PN.deletehybridedge!(net, net.edge[9], true); +@test writenewick(net) == "(Adif:1.0,(Aech:0.122,((Asub:1.0,Agem:1.0):0.0)H6:10.0):10.0);" +net = readnewick(netstr); +@test_logs PN.deletehybridedge!(net, net.edge[9], true, false, false, true, true); # last: keeporiginalroot=true to keep the root of degree 1 -@test writeTopology(net) == "((Adif:1.0,(Aech:0.122,((Asub:1.0,Agem:1.0):0.0)H6:10.0):10.0):1.614);" +@test writenewick(net) == "((Adif:1.0,(Aech:0.122,((Asub:1.0,Agem:1.0):0.0)H6:10.0):10.0):1.614);" if doalltests -net=readTopology("(4,((1,(2)#H7:::0.864):2.069,(6,5):3.423):0.265,(3,#H7:::0.1361111):10.0);"); -deletehybridedge!(net, net.edge[11]); -writeTopologyLevel1(net) == "(4,((1,2):2.069,(6,5):3.423):0.265,3);" || +net=readnewick("(4,((1,(2)#H7:::0.864):2.069,(6,5):3.423):0.265,(3,#H7:::0.1361111):10.0);"); +PN.deletehybridedge!(net, net.edge[11]); +writenewick(net) == "(4,((1,2):2.069,(6,5):3.423):0.265,3);" || error("deletehybridedge! didn't work on 11th edge") -net=readTopology("(4,((1,(2)#H7:::0.864):2.069,(6,5):3.423):0.265,(3,#H7:::0.1361111):10.0);"); -deletehybridedge!(net, net.edge[4]); -writeTopologyLevel1(net) == "(4,((6,5):3.423,1):0.265,(3,2):10.0);" || +net=readnewick("(4,((1,(2)#H7:::0.864):2.069,(6,5):3.423):0.265,(3,#H7:::0.1361111):10.0);"); +PN.deletehybridedge!(net, net.edge[4]); +writenewick(net) == "(4,((6,5):3.423,1):0.265,(3,2):10.0);" || error("deletehybridedge! didn't work on 4th edge") end # example with wrong attributed inChild1 -net=readTopology("(4,((1,(2)#H7:::0.864):2.069,(6,5):3.423):0.265,(3,#H7:::0.1361111):10.0);"); -net.edge[5].isChild1 = false; -@test_logs deletehybridedge!(net, net.edge[4]); -@test writeTopologyLevel1(net) == "(4,((6,5):3.423,1):0.265,(3,2):10.0);" -# or: deletehybridedge! didn't work on 4th edge when isChild1 was outdated +net=readnewick("(4,((1,(2)#H7:::0.864):2.069,(6,5):3.423):0.265,(3,#H7:::0.1361111):10.0);"); +net.edge[5].ischild1 = false; +@test_logs PN.deletehybridedge!(net, net.edge[4]); +@test writenewick(net) == "(4,((6,5):3.423,1):0.265,(3,2):10.0);" if doalltests -net = readTopology("((Adif:1.0,(Aech:0.122,#H6:10.0::0.047):10.0):1.614,Aten:1.0,((Asub:1.0,Agem:1.0):0.0)#H6:5.062::0.953);"); -net.edge[5].isChild1 = false # edge 5 from -1 to -2 -deletehybridedge!(net, net.edge[10]); -println("a warning is expected: \"node -1 being the root is contradicted by isChild1 of its edges.\"") -writeTopologyLevel1(net) == "(Adif:1.0,(Aech:0.122,(Asub:1.0,Agem:1.0):10.0):10.0,Aten:2.614);" || - error("deletehybridedge! didn't work on 10th edge after isChild1 was changed") +net = readnewick("((Adif:1.0,(Aech:0.122,#H6:10.0::0.047):10.0):1.614,Aten:1.0,((Asub:1.0,Agem:1.0):0.0)#H6:5.062::0.953);"); +net.edge[5].ischild1 = false # edge incident to the root, now pointing towards the root +# tests that deletehybridedge! and writenewick don't use ischild1, +# now in conflict with net.rooti: node -2 instead of -3 as would ischild1 suggest +PN.deletehybridedge!(net, net.edge[10]); +@test writenewick(net) == "((Adif:1.0,(Aech:0.122,(Asub:1.0,Agem:1.0):10.0):10.0):1.614,Aten:1.0);" end # example with simplify=false -net0 = readTopology("((((((a:1)#H1:1::.9)#H2:1::.8)#H3:1::.7,#H3:0.5):1,#H2:1):1,(#H1:1,b:1):1,c:1);") +net0 = readnewick("((((((a:1)#H1:1::.9)#H2:1::.8)#H3:1::.7,#H3:0.5):1,#H2:1):1,(#H1:1,b:1):1,c:1);") net = deepcopy(net0) -@test writeTopology(deletehybridedge!(net, net.edge[5]), round=true) == "((#H1:1.0::0.1,b:1.0):1.0,c:1.0,(a:1.0)#H1:3.0::0.9);" -@test writeTopology(deletehybridedge!(net0, net0.edge[5],false,true,false,false), round=true) == +@test writenewick(PN.deletehybridedge!(net, net.edge[5]), round=true) == + "((#H1:1.0::0.1,b:1.0):1.0,c:1.0,(a:1.0)#H1:3.0::0.9);" +@test writenewick(PN.deletehybridedge!(net0, net0.edge[5],false,true,false,false), round=true) == "((#H2:1.0::0.2,((a:1.0)#H1:1.0::0.9)#H2:3.0::0.8):1.0,(#H1:1.0::0.1,b:1.0):1.0,c:1.0);" # level-2 degree-2 blob simplifying to parallel edges, + polytomy below -net0 = readTopology("(africa_east:0.003,((#H3:0::0.003,(non_africa_west:0.2,non_africa_east:0.2)#H1:0.3::1):0.3,(#H1:0::0)#H3:0::0.997)H2:0);"); -PhyloNetworks.deletehybridedge!(net0, net0.edge[2], false, false, false, true, false) +net0 = readnewick("(africa_east:0.003,((#H3:0::0.003,(non_africa_west:0.2,non_africa_east:0.2)#H1:0.3::1):0.3,(#H1:0::0)#H3:0::0.997)H2:0);"); +PN.deletehybridedge!(net0, net0.edge[2], false, false, false, true, false) @test all(!n.hybrid for n in net0.node) -@test all(e.containRoot for e in net0.edge) -@test writeTopology(net0) == "(africa_east:0.003,(non_africa_west:0.2,non_africa_east:0.2)H1:0.0);" +@test all(e.containroot for e in net0.edge) +@test writenewick(net0) == "(africa_east:0.003,(non_africa_west:0.2,non_africa_east:0.2)H1:0.0);" end # of testing deletehybridedge! -@testset "testing deleteleaf! and hardwiredClusterDistance" begin +@testset "testing deleteleaf! and hardwiredclusterdistance" begin cui2str = "(Xgordoni,Xmeyeri,(Xcouchianus,(Xvariatus,(Xevelynae,((Xxiphidium,#H25:9.992::0.167):1.383,(Xmilleri,(Xandersi,(Xmaculatus,((((Xhellerii,(Xalvarezi,Xmayae):0.327):0.259,Xsignum):1.866,(Xclemenciae_F2,Xmonticolus):1.461):0.786,((((Xmontezumae,(Xnezahuacoyotl)#H26:0.247::0.807):0.372,((Xbirchmanni_GARC,Xmalinche_CHIC2):1.003,Xcortezi):0.454):0.63,((Xcontinens,Xpygmaeus):1.927,((Xnigrensis,Xmultilineatus):1.304,#H26:0.0::0.193):0.059):2.492):2.034)#H25:0.707::0.833):1.029):0.654):0.469):0.295):0.41):0.646):3.509):0.263);" cui3str = "(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.458,(((((Xmontezumae,(Xnezahuacoyotl)#H26:0.247::0.804):0.375,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.997,Xcortezi):0.455):0.63,(#H26:0.0::0.196,((Xcontinens,Xpygmaeus):1.932,(Xnigrensis,Xmultilineatus):1.401):0.042):2.439):2.0)#H7:0.787::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.563::0.165):1.409,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.263):3.532):0.642):0.411):0.295):0.468):0.654):1.022):0.788):1.917)#H27:0.149::0.572):0.668,Xalvarezi):0.257,(Xsignum,#H27:1.381::0.428):4.669);" if doalltests -net3 = readTopology(cui3str); -net2 = readTopology(cui2str); +net3 = readnewick(cui3str); +net2 = readnewick(cui2str); # major tree, root with outgroup then delete 2 leaves: -tree2 = majorTree(net2); tree3 = majorTree(net3); +tree2 = majortree(net2); tree3 = majortree(net3); rootatnode!(tree2,"Xmayae"); rootatnode!(tree3,"Xmayae"); deleteleaf!(tree2,"Xhellerii"); deleteleaf!(tree3,"Xhellerii"); deleteleaf!(tree2,"Xsignum"); deleteleaf!(tree3,"Xsignum"); -hardwiredClusterDistance(tree2, tree3, false) == 0 || +hardwiredclusterdistance(tree2, tree3, false) == 0 || error("HWDist not 0, major tree, root then prune"); # major tree, delete 2 leaves then root with outgroup: -tree2 = majorTree(net2); tree3 = majorTree(net3); +tree2 = majortree(net2); tree3 = majortree(net3); deleteleaf!(tree2,"Xhellerii"); deleteleaf!(tree3,"Xhellerii"); deleteleaf!(tree2,"Xsignum"); deleteleaf!(tree3,"Xsignum"); -hardwiredClusterDistance(tree2, tree3, false) == 0 || error("HWD not 0, major tree - 2 taxa"); -@test hardwiredClusterDistance(tree2, tree3, true) == 21 +hardwiredclusterdistance(tree2, tree3, false) == 0 || error("HWD not 0, major tree - 2 taxa"); +@test hardwiredclusterdistance(tree2, tree3, true) == 21 rootatnode!(tree3,"Xmaculatus"); -hardwiredClusterDistance(tree2, tree3, true) == 15 || error("rooted RF dist not 15"); +hardwiredclusterdistance(tree2, tree3, true) == 15 || error("rooted RF dist not 15"); rootatnode!(tree2,"Xgordoni"); -hardwiredClusterDistance(tree2, tree3, true) == 16 || error("rooted RF dist not 16"); -hardwiredClusterDistance(tree2, tree3, false) == 0 || error("HWD not 0, major tree - 2 taxa"); +hardwiredclusterdistance(tree2, tree3, true) == 16 || error("rooted RF dist not 16"); +hardwiredclusterdistance(tree2, tree3, false) == 0 || error("HWD not 0, major tree - 2 taxa"); end # network: delete 2 leaves -net2 = readTopology(cui2str); +net2 = readnewick(cui2str); @test_logs deleteleaf!(net2,"Xhellerii"); @test_logs deleteleaf!(net2,"Xsignum"); @test_logs rootatnode!(net2,"Xmayae"); -net3 = readTopology(cui3str); +net3 = readnewick(cui3str); @test_logs deleteleaf!(net3,"Xhellerii"); @test_logs deleteleaf!(net3,"Xsignum"); -@test hardwiredClusterDistance(net2, net3, true) == 3 +@test hardwiredclusterdistance(net2, net3, true) == 3 @test_logs rootatnode!(net3,"Xmayae"); -@test hardwiredClusterDistance(net2, net3, true) == 4 -@test hardwiredClusterDistance(net2, net3, false) == 4 +@test hardwiredclusterdistance(net2, net3, true) == 4 +@test hardwiredclusterdistance(net2, net3, false) == 4 @test_logs deleteleaf!(net3,"Xmayae"; unroot=true); #plot(net3); -@test net3.numHybrids == 2 +@test net3.numhybrids == 2 # using simplify=false in deleteleaf! -net3 = readTopology(cui3str); +net3 = readnewick(cui3str); deleteleaf!(net3,"Xhellerii"); deleteleaf!(net3,"Xsignum"); deleteleaf!(net3,"Xmayae", simplify=false); -@test net3.numHybrids==3 -@test net3.numNodes == 47 -net3 = readTopology(cui3str); +@test net3.numhybrids==3 +@test net3.numnodes == 47 +net3 = readnewick(cui3str); deleteleaf!(net3,"Xhellerii"); deleteleaf!(net3,"Xsignum"); deleteleaf!(net3,"Xmayae", simplify=false, unroot=true); -@test net3.numHybrids==3 -@test net3.numNodes == 46 +@test net3.numhybrids==3 +@test net3.numnodes == 46 -end # of testset for deleteleaf! and hardwiredClusterDistance +end # of testset for deleteleaf! and hardwiredclusterdistance #----------------------------------------------------------# # testing functions to display trees / subnetworks # #----------------------------------------------------------# -@testset "testing deleteHybridThreshold!" begin +@testset "testing deletehybridthreshold!" begin if doalltests -net21 = readTopology("(A,((B,#H1:::0.5),(C,(D)#H1)));"); -deleteHybridThreshold!(net21,0.2); -writeTopology(net21) == "(A,((B,#H1:::0.5),(C,(D)#H1:::0.5)));" || - error("deleteHybridThreshold! didn't work on net21, gamma=0.2") -deleteHybridThreshold!(net21,0.5); -writeTopologyLevel1(net21) == "(A,((C,D),B));" || - error("deleteHybridThreshold! didn't work on net21, gamma=0.5") - -net22 = readTopology("(A,((B,#H1:::0.2),(C,(D)#H1:::0.8)));"); -deleteHybridThreshold!(net22,0.3); -writeTopologyLevel1(net22) == "(A,((C,D),B));" || - error("deleteHybridThreshold! didn't work on net22, gamma=0.3") - -net31 = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(C:0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); +net21 = readnewick("(A,((B,#H1:::0.5),(C,(D)#H1)));"); +deletehybridthreshold!(net21,0.2); +writenewick(net21) == "(A,((B,#H1:::0.5),(C,(D)#H1:::0.5)));" || + error("deletehybridthreshold! didn't work on net21, gamma=0.2") +deletehybridthreshold!(net21,0.5); +writenewick(net21) == "(A,((C,D),B));" || + error("deletehybridthreshold! didn't work on net21, gamma=0.5") + +net22 = readnewick("(A,((B,#H1:::0.2),(C,(D)#H1:::0.8)));"); +deletehybridthreshold!(net22,0.3); +writenewick(net22) == "(A,((C,D),B));" || + error("deletehybridthreshold! didn't work on net22, gamma=0.3") + +net31 = readnewick("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(C:0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); net32 = deepcopy(net31); for e in net32.edge e.length=-1.0; end # plot(net31) -deleteHybridThreshold!(net31,0.3); -writeTopologyLevel1(net31) == "(A:1.0,((C:0.9,D:1.1):1.3,B:2.3):0.7);" || - error("deleteHybridThreshold! didn't work on net31, gamma=0.3") -deleteHybridThreshold!(net32,0.3) -writeTopologyLevel1(net32) == "(A,((C,D),B));" || - error("deleteHybridThreshold! didn't work on net32, gamma=0.3") - -net42 = readTopology("(A:1.0,((B:1.1,#H1:0.2):1.2,(C:0.9,(D:0.8)#H1:0.3):1.3):0.7):0.1;"); -deleteHybridThreshold!(net42,0.5); -writeTopologyLevel1(net42) == "(A:1.0,((C:0.9,D:1.1):1.3,B:2.3):0.7);" || - error("deleteHybridThreshold! didn't work on net42, gamma=0.5") +deletehybridthreshold!(net31,0.3); +writenewick(net31) == "(A:1.0,((C:0.9,D:1.1):1.3,B:2.3):0.7);" || + error("deletehybridthreshold! didn't work on net31, gamma=0.3") +deletehybridthreshold!(net32,0.3) +writenewick(net32) == "(A,((C,D),B));" || + error("deletehybridthreshold! didn't work on net32, gamma=0.3") + +net42 = readnewick("(A:1.0,((B:1.1,#H1:0.2):1.2,(C:0.9,(D:0.8)#H1:0.3):1.3):0.7):0.1;"); +deletehybridthreshold!(net42,0.5); +writenewick(net42) == "(A:1.0,((C:0.9,D:1.1):1.3,B:2.3):0.7);" || + error("deletehybridthreshold! didn't work on net42, gamma=0.5") end -net5 = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); +net5 = readnewick("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); # plot(net5) -@test_logs deleteHybridThreshold!(net5,0.5); # both H1 and H2 eliminated -@test writeTopologyLevel1(net5) == "(A:1.0,((((C:0.52,E:0.52):0.6,F:1.5):0.9,D:1.1):1.3,B:2.3):0.7);" -# or: deleteHybridThreshold! didn't work on net5, gamma=0.5 -net5 = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); -@test_logs deleteHybridThreshold!(net5,0.3); # H2 remains -@test writeTopologyLevel1(net5) == "(A:1.0,((((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,D:1.1):1.3,B:2.3):0.7);" -# or: deleteHybridThreshold! didn't work on net5, gamma=0.3 +@test_logs deletehybridthreshold!(net5,0.5); # both H1 and H2 eliminated +@test writenewick(net5) == "(A:1.0,((((C:0.52,E:0.52):0.6,F:1.5):0.9,D:1.1):1.3,B:2.3):0.7);" +net5 = readnewick("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); +@test_logs deletehybridthreshold!(net5,0.3); # H2 remains +@test writenewick(net5) == "(A:1.0,((((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,D:1.1):1.3,B:2.3):0.7);" -end # of testset, deleteHybridThreshold! +end # of testset, deletehybridthreshold! -@testset "testing displayedNetworks! and displayedTrees" begin +@testset "testing displayednetworks! and displayedtrees" begin -net3 = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(C:0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); -net31 = displayedNetworks!(net3, net3.node[6]); #H1 = 6th node -@test writeTopologyLevel1(net31) == "(A:1.0,((B:1.1,D:1.0):1.2,C:2.2):0.7);" -# or: displayedNetworks! didn't work on net3, minor at 6th node -@test writeTopologyLevel1(net3) == "(A:1.0,((C:0.9,D:1.1):1.3,B:2.3):0.7);" -# or: displayedNetworks! didn't work on net3, major at 6th node +net3 = readnewick("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(C:0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); +net31 = PhyloNetworks.displayednetworks!(net3, net3.node[6]); #H1 = 6th node +@test writenewick(net31) == "(A:1.0,((B:1.1,D:1.0):1.2,C:2.2):0.7);" +@test writenewick(net3) == "(A:1.0,((C:0.9,D:1.1):1.3,B:2.3):0.7);" if doalltests -net3 = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(C:0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); -a = displayedTrees(net3, 0.2); -length(a) == 2 || - error("displayedTrees didn't work on net3, gamma=0.2: output not of length 2") -writeTopologyLevel1(a[1]) == "(A:1.0,((C:0.9,D:1.1):1.3,B:2.3):0.7);" || - error("displayedTrees didn't work on net3, gamma=0.2: 1st tree wrong") -writeTopologyLevel1(a[2]) == "(A:1.0,((B:1.1,D:1.0):1.2,C:2.2):0.7);" || - error("displayedTrees didn't work on net3, gamma=0.2: 2nd tree wrong") +net3 = readnewick("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(C:0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); +a = displayedtrees(net3, 0.2); +@test length(a) == 2 +@test writenewick(a[1]) == "(A:1.0,((C:0.9,D:1.1):1.3,B:2.3):0.7);" +@test writenewick(a[2]) == "(A:1.0,((B:1.1,D:1.0):1.2,C:2.2):0.7);" end -net5 = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); -a = displayedTrees(net5, 0.5); -@test length(a) == 1 # or: displayedTrees didn't work on net5, gamma=0.5 -@test writeTopologyLevel1(a[1]) == "(A:1.0,((((C:0.52,E:0.52):0.6,F:1.5):0.9,D:1.1):1.3,B:2.3):0.7);" -# or: displayedTrees didn't work on net5, gamma=0.5 -a = displayedTrees(net5, 0.1); -@test length(a) == 4 # or: displayedTrees didn't work on net5, gamma=0.1 -@test writeTopologyLevel1(a[1]) == "(A:1.0,((((C:0.52,E:0.52):0.6,F:1.5):0.9,D:1.1):1.3,B:2.3):0.7);" -@test writeTopologyLevel1(a[2]) == "(A:1.0,((B:1.1,D:1.0):1.2,((C:0.52,E:0.52):0.6,F:1.5):2.2):0.7);" -@test writeTopologyLevel1(a[3]) == "(A:1.0,((((F:0.7,E:0.51):0.8,C:1.12):0.9,D:1.1):1.3,B:2.3):0.7);" -@test writeTopologyLevel1(a[4]) == "(A:1.0,((B:1.1,D:1.0):1.2,((F:0.7,E:0.51):0.8,C:1.12):2.2):0.7);" - -net = readTopology("(((A:4.0,(B:1.0)#H1:1.1::0.9):0.5,(C:0.6,#H1:1.0::0.1):1.0):3.0,D:5.0);") -trees = (@test_logs displayedTrees(net,0.0; nofuse=true)); -@test writeTopology(trees[1])=="(((A:4.0,(B:1.0)H1:1.1):0.5,(C:0.6):1.0):3.0,D:5.0);" -@test writeTopology(trees[2])=="(((A:4.0):0.5,(C:0.6,(B:1.0)H1:1.0):1.0):3.0,D:5.0);" -@test PhyloNetworks.inheritanceWeight.(trees) ≈ [log(0.9), log(0.1)] - -end # of testset, displayedNetworks! & displayedTrees - -@testset "testing majorTree and displayedNetworkAt!" begin - -net5 = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); -@test writeTopology(majorTree(net5)) == "(A:1.0,((((C:0.52,E:0.52):0.6,F:1.5):0.9,D:1.1):1.3,B:2.3):0.7);" -@test_logs displayedNetworkAt!(net5, net5.hybrid[1]); -@test writeTopology(net5) == "(A:1.0,((((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,D:1.1):1.3,B:2.3):0.7);" -net = readTopology("((((B)#H1)#H2,((D,C,#H2)S1,(#H1,A)S2)S3)S4);") # missing γ's, level 2 -@test writeTopology(majorTree(net)) == "(((D,C)S1,A)S3,B)S4;" -@test writeTopology(majorTree(net; nofuse=true)) == "(((B)H1)H2,((D,C)S1,(A)S2)S3)S4;" -setGamma!(net.edge[8], 0.8) -@test writeTopology(majorTree(net)) == "((D,C)S1,(A,B)S2)S3;" -@test writeTopology(majorTree(net; nofuse=true)) == "((D,C)S1,((B)H1,A)S2)S3;" -@test writeTopology(majorTree(net; nofuse=true, keeporiginalroot=true)) == "(((D,C)S1,((B)H1,A)S2)S3)S4;" -@test writeTopology(majorTree(net; keeporiginalroot=true)) == "(((D,C)S1,(A,B)S2)S3)S4;" +net5 = readnewick("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); +a = displayedtrees(net5, 0.5); +@test length(a) == 1 +@test writenewick(a[1]) == "(A:1.0,((((C:0.52,E:0.52):0.6,F:1.5):0.9,D:1.1):1.3,B:2.3):0.7);" +a = displayedtrees(net5, 0.1); +@test length(a) == 4 +@test writenewick(a[1]) == "(A:1.0,((((C:0.52,E:0.52):0.6,F:1.5):0.9,D:1.1):1.3,B:2.3):0.7);" +@test writenewick(a[2]) == "(A:1.0,((B:1.1,D:1.0):1.2,((C:0.52,E:0.52):0.6,F:1.5):2.2):0.7);" +@test writenewick(a[3]) == "(A:1.0,((((F:0.7,E:0.51):0.8,C:1.12):0.9,D:1.1):1.3,B:2.3):0.7);" +@test writenewick(a[4]) == "(A:1.0,((B:1.1,D:1.0):1.2,((F:0.7,E:0.51):0.8,C:1.12):2.2):0.7);" + +net = readnewick("(((A:4.0,(B:1.0)#H1:1.1::0.9):0.5,(C:0.6,#H1:1.0::0.1):1.0):3.0,D:5.0);") +trees = (@test_logs displayedtrees(net,0.0; nofuse=true)); +@test writenewick(trees[1])=="(((A:4.0,(B:1.0)H1:1.1):0.5,(C:0.6):1.0):3.0,D:5.0);" +@test writenewick(trees[2])=="(((A:4.0):0.5,(C:0.6,(B:1.0)H1:1.0):1.0):3.0,D:5.0);" +@test PhyloNetworks.inheritanceweight.(trees) ≈ [log(0.9), log(0.1)] + +end # of testset, displayednetworks! & displayedtrees + +@testset "testing majortree and displayednetworkat!" begin + +net5 = readnewick("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); +@test writenewick(majortree(net5)) == "(A:1.0,((((C:0.52,E:0.52):0.6,F:1.5):0.9,D:1.1):1.3,B:2.3):0.7);" +@test_logs displayednetworkat!(net5, net5.hybrid[1]); +@test writenewick(net5) == "(A:1.0,((((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,D:1.1):1.3,B:2.3):0.7);" +net = readnewick("((((B)#H1)#H2,((D,C,#H2)S1,(#H1,A)S2)S3)S4);") # missing γ's, level 2 +@test writenewick(majortree(net)) == "(((D,C)S1,A)S3,B)S4;" +@test writenewick(majortree(net; nofuse=true)) == "(((B)H1)H2,((D,C)S1,(A)S2)S3)S4;" +setgamma!(net.edge[8], 0.8) +@test writenewick(majortree(net)) == "((D,C)S1,(A,B)S2)S3;" +@test writenewick(majortree(net; nofuse=true)) == "((D,C)S1,((B)H1,A)S2)S3;" +@test writenewick(majortree(net; nofuse=true, keeporiginalroot=true)) == "(((D,C)S1,((B)H1,A)S2)S3)S4;" +@test writenewick(majortree(net; keeporiginalroot=true)) == "(((D,C)S1,(A,B)S2)S3)S4;" # net6 below: hybrid ladder H2 -> H1; and H2 child of root # using multgammas=true, to test multiplygammas and how it is used -net6 = readTopology("(#H2:::0.2,((C,((B)#H1:::0.6)#H2:::0.8),(#H1,(A1,A2))),O);") -tre6 = displayedTrees(net6, 0.5; nofuse=false, multgammas=true)[1] +net6 = readnewick("(#H2:::0.2,((C,((B)#H1:::0.6)#H2:::0.8),(#H1,(A1,A2))),O);") +tre6 = displayedtrees(net6, 0.5; nofuse=false, multgammas=true)[1] @test tre6.edge[2].gamma ≈ 0.48 -displayedNetworkAt!(net6, net6.node[4], false, false, true) # nofuse, unroot=false, multgammas=true +displayednetworkat!(net6, net6.node[4], false, false, true) # nofuse, unroot=false, multgammas=true @test net6.edge[3].gamma ≈ 0.6 -net6 = readTopology("(#H2:::0.2,((C,((B)#H1:::0.6)#H2:::0.8),(#H1,(A1,A2))),O);") -displayedNetworkAt!(net6, net6.node[3], false, false, true) # nofuse, unroot=false, multgammas=true +net6 = readnewick("(#H2:::0.2,((C,((B)#H1:::0.6)#H2:::0.8),(#H1,(A1,A2))),O);") +displayednetworkat!(net6, net6.node[3], false, false, true) # nofuse, unroot=false, multgammas=true @test net6.edge[5].gamma ≈ 0.4 @test net6.edge[3].gamma ≈ 0.48 -end # of testset, majorTree & displayedNetworkAt! +end # of testset, majortree & displayednetworkat! #----------------------------------------------------------# # testing functions to compare trees # @@ -274,11 +265,11 @@ end # of testset, majorTree & displayedNetworkAt! @testset "testing tree2Matrix" begin if doalltests -net5 = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); -tree = displayedTrees(net5, 0.0); -taxa = tipLabels(net5); -M1 = tree2Matrix(tree[1], taxa, rooted=false); -M2 = tree2Matrix(tree[2], taxa, rooted=false); +net5 = readnewick("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); +tree = displayedtrees(net5, 0.0); +taxa = tiplabels(net5) +M1 = PhyloNetworks.tree2Matrix(tree[1], taxa, rooted=false); +M2 = PhyloNetworks.tree2Matrix(tree[2], taxa, rooted=false); M1 == [15 0 0 1 1 1 1; 12 0 0 1 1 1 0; @@ -287,9 +278,9 @@ M2 == [ 4 0 1 0 0 0 1; 12 0 0 1 1 1 0; 8 0 0 1 1 0 0] || error("bad M2, from net5") -hardwiredClusterDistance(tree[1], tree[2], true) == 2 || error("wrong dist between rooted trees 1 and 2"); -hardwiredClusterDistance(tree[1], tree[2], false)== 2 || error("wrong dist between unrooted trees 1 and 2"); -hardwiredClusters(net5, taxa) == +hardwiredclusterdistance(tree[1], tree[2], true) == 2 || error("wrong dist between rooted trees 1 and 2"); +hardwiredclusterdistance(tree[1], tree[2], false)== 2 || error("wrong dist between unrooted trees 1 and 2"); +hardwiredclusters(net5, taxa) == [16 0 1 1 1 1 1 10; 4 0 1 0 0 0 1 10; 3 0 0 0 0 0 1 11; @@ -298,7 +289,7 @@ hardwiredClusters(net5, taxa) == 8 0 0 1 1 0 0 10; 7 0 0 0 1 0 0 11; 11 0 0 0 1 1 0 10] || error("wrong matrix of hardwired clusters for net5"); -hardwiredClusterDistance(net5, tree[2], true) == 4 || error("wrong dist between net5 and tree 2"); +hardwiredclusterdistance(net5, tree[2], true) == 4 || error("wrong dist between net5 and tree 2"); end ## check things with R @@ -317,21 +308,21 @@ end # i=10; j=1; RF.dist(phy[[i]],phy[[j]],rooted=T) # 10 # i=10; j=2; RF.dist(phy[[i]],phy[[j]],rooted=T) # 8 ## now checking if we get the same results in julia -# phy = readInputTrees("tenRtrees.tre") +# phy = readmultinewick("tenRtrees.tre") # or -phy1 = readTopology("((t8:0.8623136566,(((t6:0.141187073,t2:0.7767125128):0.9646669542,t4:0.8037273993):0.447443719,t5:0.7933459524):0.8417851452):0.7066285675,(t1:0.0580010619,(t7:0.6590069213,t3:0.1069735419):0.5657461432):0.3575631182);"); -phy2 = readTopology("((t3:0.9152618761,t4:0.4574306419):0.7603277895,(((t1:0.4291725352,t8:0.3302786439):0.3437780738,(t5:0.8438980761,(t6:0.6667000714,t2:0.7141199473):0.01087239943):0.752832541):0.2591188031,t7:0.7685037958):0.9210739341);"); -phy3 = readTopology("(((t7:0.3309174306,t6:0.8330178803):0.7741786113,(((t2:0.4048132468,t8:0.6809111023):0.6810255498,(t4:0.6540613638,t5:0.2610215396):0.8490990005):0.6802781771,t3:0.2325445588):0.911911567):0.94644987,t1:0.09404937108);"); -phy10= readTopology("((t4:0.1083955287,((t1:0.8376079942,t8:0.1745392387):0.6178579947,((t6:0.3196466176,t2:0.9228881211):0.3112748025,t7:0.05162345758):0.7137957355):0.5162231021):0.06693460606,(t5:0.005652675638,t3:0.2584615161):0.7333540542);"); - -@test hardwiredClusterDistance(phy1, phy10, false)== 8 -@test hardwiredClusterDistance(phy2, phy10, false)== 6 -@test hardwiredClusterDistance(phy3, phy10, false)==10 -@test hardwiredClusterDistance(phy1, phy2, false)== 8 -@test hardwiredClusterDistance(phy1, phy3, false)==10 -@test hardwiredClusterDistance(phy2, phy3, false)==10 -@test hardwiredClusterDistance(phy1, phy10, true) ==10 -@test hardwiredClusterDistance(phy2, phy10, true) == 8 +phy1 = readnewick("((t8:0.8623136566,(((t6:0.141187073,t2:0.7767125128):0.9646669542,t4:0.8037273993):0.447443719,t5:0.7933459524):0.8417851452):0.7066285675,(t1:0.0580010619,(t7:0.6590069213,t3:0.1069735419):0.5657461432):0.3575631182);"); +phy2 = readnewick("((t3:0.9152618761,t4:0.4574306419):0.7603277895,(((t1:0.4291725352,t8:0.3302786439):0.3437780738,(t5:0.8438980761,(t6:0.6667000714,t2:0.7141199473):0.01087239943):0.752832541):0.2591188031,t7:0.7685037958):0.9210739341);"); +phy3 = readnewick("(((t7:0.3309174306,t6:0.8330178803):0.7741786113,(((t2:0.4048132468,t8:0.6809111023):0.6810255498,(t4:0.6540613638,t5:0.2610215396):0.8490990005):0.6802781771,t3:0.2325445588):0.911911567):0.94644987,t1:0.09404937108);"); +phy10= readnewick("((t4:0.1083955287,((t1:0.8376079942,t8:0.1745392387):0.6178579947,((t6:0.3196466176,t2:0.9228881211):0.3112748025,t7:0.05162345758):0.7137957355):0.5162231021):0.06693460606,(t5:0.005652675638,t3:0.2584615161):0.7333540542);"); + +@test hardwiredclusterdistance(phy1, phy10, false)== 8 +@test hardwiredclusterdistance(phy2, phy10, false)== 6 +@test hardwiredclusterdistance(phy3, phy10, false)==10 +@test hardwiredclusterdistance(phy1, phy2, false)== 8 +@test hardwiredclusterdistance(phy1, phy3, false)==10 +@test hardwiredclusterdistance(phy2, phy3, false)==10 +@test hardwiredclusterdistance(phy1, phy10, true) ==10 +@test hardwiredclusterdistance(phy2, phy10, true) == 8 # or: wrong RF distance between some of the trees end # of testset, tree2Matrix @@ -342,44 +333,44 @@ end # of testset, tree2Matrix # used for detection of given hybridization event # #----------------------------------------------------------# -@testset "test displayedTrees, hardwiredClusters, hardwiredClusterDistance, displayedNetworkAt!" begin +@testset "test displayedtrees, hardwiredclusters, hardwiredclusterdistance, displayednetworkat!" begin -estnet = readTopology("(6,((5,#H7:0.0::0.402):8.735,((1,2):6.107,((3,4):1.069)#H7:9.509::0.598):6.029):0.752);") +estnet = readnewick("(6,((5,#H7:0.0::0.402):8.735,((1,2):6.107,((3,4):1.069)#H7:9.509::0.598):6.029):0.752);") # originally from "../msSNaQ/simulations/estimatedNetworks/baseline/nloci10/1_julia.out" -trunet = readTopology("((((1,2),((3,4))#H1),(#H1,5)),6);"); -@test hardwiredClusterDistance(majorTree(trunet), majorTree(estnet),false) == 0 # false: unrooted -truminor = minorTreeAt(trunet, 1); # (1:1.0,2:1.0,((5:1.0,(3:1.0,4:1.0):2.0):1.0,6:1.0):2.0); -estminor = minorTreeAt(estnet, 1); # (5:1.0,(3:1.0,4:1.0):1.069,(6:1.0,(1:1.0,2:1.0):10.0):8.735); -@test writeTopology(truminor) == "(((5,(3,4)),(1,2)),6);" -@test writeTopology(estminor) == "(6,((5,(3,4):1.069):8.735,(1,2):12.136):0.752);" -@test hardwiredClusterDistance(truminor, estminor, false) == 0 # false: unrooted +trunet = readnewick("((((1,2),((3,4))#H1),(#H1,5)),6);"); +@test hardwiredclusterdistance(majortree(trunet), majortree(estnet),false) == 0 # false: unrooted +truminor = minortreeat(trunet, 1); # (1:1.0,2:1.0,((5:1.0,(3:1.0,4:1.0):2.0):1.0,6:1.0):2.0); +estminor = minortreeat(estnet, 1); # (5:1.0,(3:1.0,4:1.0):1.069,(6:1.0,(1:1.0,2:1.0):10.0):8.735); +@test writenewick(truminor) == "(((5,(3,4)),(1,2)),6);" +@test writenewick(estminor) == "(6,((5,(3,4):1.069):8.735,(1,2):12.136):0.752);" +@test hardwiredclusterdistance(truminor, estminor, false) == 0 # false: unrooted # so the hybrid edge was estimated correctly!! rootatnode!(trunet, -8) -@test hardwiredClusterDistance(estnet, trunet, true) == 3 -# next: testing hardwiredClusterDistance_unrooted, via the option rooted=false -@test hardwiredClusterDistance(estnet, trunet, false) == 0 -h0est = readTopology("(((2:0.01,1:0.01):0.033,(3:0.0154,4:0.0149):0.0186):0.0113,6:0.0742,5:0.0465);") -truenet = readTopology("((((1,2),((3,4))#H1),(#H1,5)),6);") -h1est = readTopology("(5:0.0,6:0.0,(((2:0.0)#H1:0.0::0.95,1:0.0):0.0,((4:0.0,3:0.0):0.0,#H1:0.0::0.05):0.0):0.0);") -@test hardwiredClusterDistance(h0est, truenet, false) == 2 -@test hardwiredClusterDistance(truenet, h0est, false) == 2 -@test hardwiredClusterDistance(h1est, truenet, false) == 4 -@test hardwiredClusterDistance(truenet, h1est, false) == 4 - -net5 = readTopology("(A,((B,#H1:::0.2),(((C,(E)#H2:::0.7),(#H2:::0.3,F)),(D)#H1:::0.8)));"); -tree = displayedTrees(net5, 0.0); -taxa = tipLabels(net5); -@test hardwiredClusters(tree[1], taxa) == +@test hardwiredclusterdistance(estnet, trunet, true) == 3 +# next: testing hardwiredclusterdistance_unrooted, via the option rooted=false +@test hardwiredclusterdistance(estnet, trunet, false) == 0 +h0est = readnewick("(((2:0.01,1:0.01):0.033,(3:0.0154,4:0.0149):0.0186):0.0113,6:0.0742,5:0.0465);") +truenet = readnewick("((((1,2),((3,4))#H1),(#H1,5)),6);") +h1est = readnewick("(5:0.0,6:0.0,(((2:0.0)#H1:0.0::0.95,1:0.0):0.0,((4:0.0,3:0.0):0.0,#H1:0.0::0.05):0.0):0.0);") +@test hardwiredclusterdistance(h0est, truenet, false) == 2 +@test hardwiredclusterdistance(truenet, h0est, false) == 2 +@test hardwiredclusterdistance(h1est, truenet, false) == 4 +@test hardwiredclusterdistance(truenet, h1est, false) == 4 + +net5 = readnewick("(A,((B,#H1:::0.2),(((C,(E)#H2:::0.7),(#H2:::0.3,F)),(D)#H1:::0.8)));"); +tree = displayedtrees(net5, 0.0); +taxa = tiplabels(net5) +@test hardwiredclusters(tree[1], taxa) == [16 0 1 1 1 1 1 10; 15 0 0 1 1 1 1 10; 12 0 0 1 1 1 0 10; 8 0 0 1 1 0 0 10] -@test hardwiredClusters(tree[2], taxa) == +@test hardwiredclusters(tree[2], taxa) == [16 0 1 1 1 1 1 10; 4 0 1 0 0 0 1 10; 12 0 0 1 1 1 0 10; 8 0 0 1 1 0 0 10] -@test hardwiredClusters(net5, taxa) == +@test hardwiredclusters(net5, taxa) == [16 0 1 1 1 1 1 10; 4 0 1 0 0 0 1 10; 3 0 0 0 0 0 1 11; @@ -390,68 +381,68 @@ taxa = tipLabels(net5); 11 0 0 0 1 1 0 10] if doalltests -trunet = readTopology("(((1,2),((3,4))#H1),(#H1,5),6);"); # unrooted -taxa = tipLabels(trunet); -hardwiredClusters(trunet, taxa) == +trunet = readnewick("(((1,2),((3,4))#H1),(#H1,5),6);"); # unrooted +taxa = tiplabels(trunet) +hardwiredclusters(trunet, taxa) == [8 1 1 1 1 0 0 10 3 1 1 0 0 0 0 10 7 0 0 1 1 0 0 11 6 0 0 1 1 0 0 10 11 0 0 1 1 1 0 10] || error("wrong hardwired cluster matrix for unrooted trunet"); -trunet = readTopology("((((1,2),((3,4))#H1),(#H1,5)),6);"); # rooted: good! -hardwiredClusters(trunet, taxa) == +trunet = readnewick("((((1,2),((3,4))#H1),(#H1,5)),6);"); # rooted: good! +hardwiredclusters(trunet, taxa) == [12 1 1 1 1 1 0 10; 8 1 1 1 1 0 0 10; 3 1 1 0 0 0 0 10; 7 0 0 1 1 0 0 11; 6 0 0 1 1 0 0 10; 11 0 0 1 1 1 0 10] || error("wrong hardwired cluster matrix for trunet"); -hardwiredClusters(estnet, taxa) == +hardwiredclusters(estnet, taxa) == [13 1 1 1 1 1 0 10 4 0 0 1 1 1 0 10 3 0 0 1 1 0 0 11 10 0 0 1 1 0 0 10 12 1 1 1 1 0 0 10 7 1 1 0 0 0 0 10] || error("wrong hardwired cluster matrix for estnet") -hardwiredClusterDistance(trunet,estnet,true) == 0 || +hardwiredclusterdistance(trunet,estnet,true) == 0 || error("trunet and estnet should be found to be at HWDist 0"); -net51 = readTopologyLevel1("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;") -directEdges!(net51); # doing this avoids a warning on the next line: -displayedNetworkAt!(net51, net51.hybrid[1]) # H2 -# "WARNING: node -3 being the root is contradicted by isChild1 of its edges." +net51 = readnewick("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;") +directedges!(net51); # doing this avoids a warning on the next line: +displayednetworkat!(net51, net51.hybrid[1]) # H2 +# "WARNING: node -3 being the root is contradicted by ischild1 of its edges." rootatnode!(net51, "A"); -writeTopologyLevel1(net51) == "(A:0.5,((((C:0.52,(E:0.5)#H2:0.02):0.6,(#H2:0.01,F:0.7):0.8):0.9,D:1.1):1.3,B:2.3):0.5);" || - error("wrong net51 after displayedNetworkAt!"); -net52 = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); -displayedNetworkAt!(net52, net52.hybrid[2]) -writeTopologyLevel1(net52) == "(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,E:0.52):0.6,F:1.5):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7);" || - error("wrong net52 after displayedNetworkAt!"); -taxa = tipLabels(net52); # order: A B C E F D -hardwiredClusters(net51, taxa) == +writenewick(net51) == "(A:1.0,((((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,D:1.1):1.3,B:2.3):0.7);" || + error("wrong net51 after displayednetworkat!"); +net52 = readnewick("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); +displayednetworkat!(net52, net52.hybrid[2]) +writenewick(net52) == "(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,E:0.52):0.6,F:1.5):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7);" || + error("wrong net52 after displayednetworkat!"); +taxa = tiplabels(net52) # order: A B C E F D +hardwiredclusters(net51, taxa) == [16 0 1 1 1 1 1 10; 15 0 0 1 1 1 1 10; 12 0 0 1 1 1 0 10; 8 0 0 1 1 0 0 10; 7 0 0 0 1 0 0 11; 11 0 0 0 1 1 0 10] || error("wrong hardwired clusters for net51"); -hardwiredClusters(net52, taxa) == +hardwiredclusters(net52, taxa) == [16 0 1 1 1 1 1 10; 4 0 1 0 0 0 1 10; 3 0 0 0 0 0 1 11; 15 0 0 1 1 1 1 10; 12 0 0 1 1 1 0 10; 8 0 0 1 1 0 0 10] || error("wrong hardwired clusters for net52"); -hardwiredClusterDistance(net51,net52,true) == 4 || +hardwiredclusterdistance(net51,net52,true) == 4 || error("wrong HWDist between net51 and net52"); end -end # of testset: displayedTrees, hardwiredClusters, hardwiredClusterDistance, displayedNetworkAt! +end # of testset: displayedtrees, hardwiredclusters, hardwiredclusterdistance, displayednetworkat! -@testset "testing hardwiredCluster! on single nodes" begin +@testset "testing hardwiredcluster! on single nodes" begin -net5 = "(A,((B,#H1),(((C,(E)#H2),(#H2,F)),(D)#H1)));" |> readTopology |> directEdges! ; -taxa = net5 |> tipLabels # ABC EF D +net5 = "(A,((B,#H1),(((C,(E)#H2),(#H2,F)),(D)#H1)));" |> readnewick |> directedges! ; +taxa = net5 |> tiplabels # ABC EF D m = hcat([true,false,false,false,false,false], [false,true,false,false,false,false], [false,false,false,false,false,true], @@ -469,8 +460,8 @@ m = hcat([true,false,false,false,false,false], [false,false,true,true,true,true], [false,true,true,true,true,true]) for i = 1:16 - @test hardwiredCluster(net5.edge[i], taxa) == m[:,i] + @test hardwiredcluster(net5.edge[i], taxa) == m[:,i] end -end # of testset, hardwiredCluster! on single nodes +end # of testset, hardwiredcluster! on single nodes end diff --git a/test/test_correctLik.jl b/test/test_correctLik.jl deleted file mode 100644 index 84ad18b6b..000000000 --- a/test/test_correctLik.jl +++ /dev/null @@ -1,100 +0,0 @@ -# test to see if the likelihood is correctly calculated -# and if the networks are correctly estimated -# Claudia August 2015 - -# -------------------5taxon tree------------------ - -PhyloNetworks.CHECKNET || error("need CHECKNET==true in PhyloNetworks to test snaq in test_correctLik.jl") - -df=DataFrame(t1=["6","6","10","6","6"], - t2=["7","7","7","10","7"], - t3=["4","10","4","4","4"], - t4=["8","8","8","8","10"], - obsCF12=[0.2729102510259939, 0.3967750546426937, 0.30161247267865315, 0.24693940689390592, 0.2729102510259939], - obsCF13=[0.45417949794801216, 0.30161247267865315, 0.30161247267865315, 0.5061211862121882, 0.45417949794801216], - obsCF14=[0.2729102510259939, 0.30161247267865315, 0.3967750546426937, 0.24693940689390592, 0.2729102510259939]) -d = readTableCF(df) -@test_throws ErrorException PhyloNetworks.writeExpCF(d) -@test writeTableCF(d) == rename(df, [:obsCF12 => :CF12_34, :obsCF13 => :CF13_24, :obsCF14 => :CF14_23]) -@test tipLabels(d) == ["4","6","7","8","10"] -@test_logs PhyloNetworks.descData(d, devnull) - -df[!,:ngenes] = [10,10,10,10,20] -allowmissing!(df, :ngenes) -d = readTableCF(df) -df[1,:ngenes] = missing; d.quartet[1].ngenes = -1.0 -newdf = writeTableCF(d) -@test newdf[!,1:7] == rename(df, [:obsCF12 => :CF12_34, :obsCF13 => :CF13_24, :obsCF14 => :CF14_23])[!,1:7] -@test ismissing(newdf[1,:ngenes]) -@test newdf[2:end,:ngenes] == df[2:end,:ngenes] - -# starting tree: -tree = "((6,4),(7,8),10);" -currT = readTopologyLevel1(tree); -#printEdges(currT) - -@testset "correct pseudo likelihood and snaq" begin -@testset "lik on tree" begin -extractQuartet!(currT,d) -calculateExpCFAll!(d) -tmp = (@test_logs PhyloNetworks.writeExpCF(d)) -for i in [5,7] for j in 2:5 @test tmp[j,i] ≈ 0.12262648039048077; end end -for j in 2:5 @test tmp[j,6] ≈ 0.7547470392190385; end -lik = logPseudoLik(d) -@test lik ≈ 193.7812623319291 -#estTree = optTopRun1!(currT,d,0,5454) # issue with printCounts, TravisCI? -#@test estTree.loglik ≈ 0.0 atol=1e-8 -#println("passed optTopRun1! on tree") -end - -# ------------------5taxon network 1 hybridization: Case H----------------- -# starting topology: Case G -global tree = "((((6:0.1,4:1.5)1:0.2,(7)11#H1)5:0.1,(11#H1,8)),10:0.1);" # Case G -global currT = readTopologyLevel1(tree); -# real network: Case H -global df=DataFrame(t1=["6","6","10","6","6"],t2=["7","7","7","10","7"],t3=["4","10","4","4","4"],t4=["8","8","8","8","10"],CF1234=[0.13002257237728915, 0.36936019721747243, 0.34692592933269173, 0.12051951084152591, 0.11095702789935982], CF1324=[0.7399548552454217, 0.28371387344983595, 0.28371387344983595, 0.7589609783169482, 0.7780859442012804],CF1423=[0.13002257237728915, 0.34692592933269173, 0.36936019721747243, 0.12051951084152591, 0.11095702789935982]) -global d = readTableCF(df) - -@testset "lik of network" begin -extractQuartet!(currT,d) -calculateExpCFAll!(d) -lik = logPseudoLik(d) -@test lik ≈ 50.17161079450669 -end - -@testset "network estimation h=1" begin -estNet = optTopRun1!(currT, 0.01,75, d,1, 1e-5,1e-6,1e-3,1e-4, - false,true,Int[], 54, stdout,false,0.3) -# topology, likAbs,Nfail, data,hmax, fRel,fAbs,xRel,xAbs, -# verbose,closeN,numMoves, seed, logfile,writelog,probST,sout) -@test estNet.loglik < 0.00217 -end - -@testset "snaq! in serial and in parallel" begin - global tree = readTopology("((((6:0.1,4:1.5),9)1:0.1,8),10:0.1);") - @test_throws ErrorException snaq!(tree, d) # some taxa are in quartets, not in tree - originalstdout = stdout - redirect_stdout(devnull) - global net = readTopology("((((6:0.1,4:1.5)1:0.2,((7,60))11#H1)5:0.1,(11#H1,8)),10:0.1);") - @test_logs (:warn, r"^these taxa will be deleted") snaq!(net, d, # taxon "60" in net: not in quartets - hmax=1, runs=1, Nfail=1, seed=1234, ftolRel=1e-2,ftolAbs=1e-2,xtolAbs=1e-2,xtolRel=1e-2) - global n1 = snaq!(currT, d, hmax=1, runs=1, Nfail=1, seed=123, - ftolRel=1e-2,ftolAbs=1e-2,xtolAbs=1e-2,xtolRel=1e-2, - verbose=true) - addprocs(1) - @everywhere using PhyloNetworks - global n2 = snaq!(currT, d, hmax=1, runs=2, Nfail=1, seed=123, - ftolRel=1e-2,ftolAbs=1e-2,xtolAbs=1e-2,xtolRel=1e-2) - redirect_stdout(originalstdout) - rmprocs(workers()) - @test writeTopology(n1, round=true)==writeTopology(n2, round=true) - @test n1.loglik == n2.loglik - n3 = readSnaqNetwork("snaq.out") - @test writeTopology(n3, round=true)==writeTopology(n2, round=true) - @test n3.loglik > 0.0 - rm("snaq.out") - rm("snaq.networks") - rm("snaq.log") # .log and .err should be git-ignored, but still - rm("snaq.err") -end -end diff --git a/test/test_deleteHybridizationUpdate.jl b/test/test_deleteHybridizationUpdate.jl deleted file mode 100644 index 425d1c55d..000000000 --- a/test/test_deleteHybridizationUpdate.jl +++ /dev/null @@ -1,84 +0,0 @@ -# test to see that deleteHybridizationUpdate undoes all attributes -# prompted by Cecile finding cases when containRoot was not updated -# Claudia December 2015 - -PhyloNetworks.CHECKNET || error("need CHECKNET==true in PhyloNetworks to test snaq in test_correctLik.jl") - -@testset "test: delete hybridization" begin -global seed, currT0, besttree, net, successful,hybrid,flag,nocycle,flag2,flag3 - -seed = 485 # 2738 at v0.14.2 - -currT0 = readTopologyLevel1("(((((((1,2),3),4),5),(6,7)),(8,9)),10);"); -# warning: the random number generator has a local scope: -# with subsets of tests, the same seed would be re-used over and over. -Random.seed!(seed); -besttree = deepcopy(currT0); - -# ===== first hybridization ========================== -successful,_ = PhyloNetworks.addHybridizationUpdate!(besttree); -@test successful -net = deepcopy(besttree); - -@test sum(!e.containRoot for e in net.edge) == 3 # 3 edges can't contain the root -@test sum(e.inCycle==11 for e in net.edge) == 6 -@test sum(n.inCycle==11 for n in net.node) == 6 -@test length(net.partition) == 6 -@test Set([e.number for e in p.edges] for p in net.partition) == - Set([[14], [11], [10], [9,7,5,3,1,2,4,6,8], [17], [15]]) - -# ===== second hybridization ========================== -successful = false -successful,_ = PhyloNetworks.addHybridizationUpdate!(besttree); -@test successful -net = deepcopy(besttree); -@test sum(!e.containRoot for e in net.edge) == 8 -@test sum(e.inCycle==11 for e in net.edge) == 6 # edges 12, 13, 16, 18, 19, 20 -@test sum(n.inCycle==11 for n in net.node) == 6 -@test sum(e.inCycle==13 for e in net.edge) == 4 # edges 5, 7, 22, 23 -@test sum(n.inCycle==13 for n in net.node) == 4 - -# test partition -@test length(net.partition) == 9 -@test Set([e.number for e in p.edges] for p in net.partition) == - Set([[15], [10], [11], [17], [14], [3,1,2], [21,8,9], [6], [4]]) - -## # ===== identify containRoot for net.node[21] -## net0=deepcopy(net); -## hybrid = net.node[21]; -## hybrid.isBadDiamondI -## nocycle, edgesInCycle, nodesInCycle = identifyInCycle(net,hybrid); -## [n.number for n in edgesInCycle] == [23,9,7,5,22] || error("wrong identified cycle") -## [n.number for n in nodesInCycle] == [13,14,-4,-5,-6] || error("wrong identified cycle") -## edgesRoot = identifyContainRoot(net,hybrid); -## [n.number for n in edgesRoot] == [3,1,2] || error("wrong identified contain root") -## [e.containRoot for e in edgesRoot] == [false,false,false] || error("edges root should be false contain root") -## edges = hybridEdges(hybrid); -## [e.number for e in edges] == [22,23,3] || error("wrong identified edges") -## undoGammaz!(hybrid,net); -## othermaj = getOtherNode(edges[1],hybrid); -## othermaj.number == -6 || error("wrong othermaj") -## edgesmaj = hybridEdges(othermaj); -## [e.number for e in edgesmaj] == [22,5,4] || error("wrong identified edges") -## edgesmaj[3].containRoot || error("wrong edgesmaj[3] contain root") -## undoContainRoot!(edgesRoot); -## [e.containRoot for e in edgesRoot] == [true,true,true] || error("edges root should be false contain root") -## deleteHybrid!(hybrid,net,true, false) -## [e.containRoot for e in edgesRoot] == [true,true,true] || error("edges root should be false contain root") -## printEdges(net) - -# ================= delete second hybridization ============================= -deleteHybridizationUpdate!(net,net.node[21], false,false); -@test length(net.partition) == 6 -@test Set([e.number for e in p.edges] for p in net.partition) == - Set([[15], [10], [11], [17], [14], [3,1,2,8,9,6,4,7,5]]) -@test sum(!e.containRoot for e in net.edge) == 3 -@test sum(e.inCycle==11 for e in net.edge) == 6 -@test sum(e.inCycle==13 for e in net.edge) == 0 - -# =============== delete first hybridization =================== -deleteHybridizationUpdate!(net,net.node[19]); -checkNet(net) -@test length(net.partition) == 0 -#printEdges(net) -end diff --git a/test/test_functions_5taxon_read.jl b/test/test_functions_5taxon_read.jl deleted file mode 100644 index c0d770ff8..000000000 --- a/test/test_functions_5taxon_read.jl +++ /dev/null @@ -1,183 +0,0 @@ -# test functions for the 5taxon networks -# functions used in tests_5taxon_readTopology.jl -# fixit: it would be better that within each function, it would look -# for the needed edges/nodes starting from the hybrid node -# so that it would be a general function (not bounded to the specific indeces) -# Claudia November 2014 - -# Case C bad triangle II -function testCaseC(net::HybridNetwork) - n=searchHybridNode(net); - node = n[1]; - node.k != 3 ? error("k diff than 3") : nothing - node.isVeryBadTriangle ? nothing : error("does not know it is very bad triangle") - node.isExtBadTriangle ? error("thinks it is extremely bad triangle") : nothing - net.hasVeryBadTriangle ? nothing : error("net does not know it has very bad triangle") - net.numBad == 0 ? nothing : error("net.numBad should be 0") - net.numHybrids != 1 ? error("should have 1 hybrid, but net.numHybrids is $(net.numHybrids): $([n.number for n in net.hybrid])") : nothing -end - -# Case F bad diamond I -function testCaseF(net::HybridNetwork) - net.visited = [e.istIdentifiable for e in net.edge]; - net.numHybrids == 1 ? nothing : error("networks should have one hybrid node and it has $(net.numHybrids)") - node=net.hybrid[1]; - node.k != 4 ? error("k diff than 4") : nothing - (net.edge[3].inCycle != node.number || net.edge[4].inCycle != node.number || net.edge[5].inCycle != node.number || net.edge[7].inCycle != node.number ) ? error("edges not correctly in cycle") : nothing - (net.node[3].inCycle != node.number || net.node[4].inCycle != node.number || net.node[6].inCycle != node.number || net.node[7].inCycle != node.number) ? error("nodes not correctly in cycle") : nothing - !node.isBadDiamondI ? error("does not know it is bad diamond I") : nothing - node.isBadDiamondII ? error("thinks it is bad diamond II") : nothing - net.edge[2].containRoot ? error("edge can contain root") : nothing - (!net.edge[3].hybrid || !net.edge[3].isMajor) ? error("edge 3 is not hybrid or major") : nothing - (!net.edge[5].hybrid || net.edge[5].isMajor) ? error("edge 5 is not hybrid or is major") : nothing - net.node[4].gammaz != net.edge[3].gamma*net.edge[4].z ? error("node 4 gammaz not correctly calculated") : nothing - net.node[6].gammaz != net.edge[5].gamma*net.edge[7].z ? error("node 6 gammaz not correctly calculated") : nothing - (net.edge[4].istIdentifiable || net.edge[7].istIdentifiable) ? error("edges identifiable that should not") : nothing - !net.edge[8].istIdentifiable ? error("edge 8 not identifiable") : nothing - net.visited[8] = false; - !all([!id for id in net.visited]) ? error("edges not identifiable as identifiable") : nothing - [n.number for n in net.leaf] == [1,2,5,7,8] ? nothing : error("net.leaf is wrong") -end - -# Case G -function testCaseG(net::HybridNetwork) - net.visited = [e.istIdentifiable for e in net.edge]; - net.numHybrids == 1 ? nothing : error("networks should have one hybrid node and it has $(net.numHybrids)") - node=net.hybrid[1]; - node.k != 4 ? error("k diff than 4") : nothing - (net.edge[5].inCycle != node.number || net.edge[6].inCycle != node.number || net.edge[7].inCycle != node.number || net.edge[9].inCycle != node.number ) ? error("edges not correctly in cycle") : nothing - (net.node[5].inCycle != node.number || net.node[6].inCycle != node.number || net.node[8].inCycle != node.number || net.node[9].inCycle != node.number) ? error("nodes not correctly in cycle") : nothing - (node.isBadDiamondI || node.isBadDiamondII ) ? error("thinks it is bad diamond") : nothing - net.edge[4].containRoot ? error("edge can contain root") : nothing - (!net.edge[5].hybrid || !net.edge[5].isMajor) ? error("edge 5 is not hybrid or major") : nothing - (!net.edge[7].hybrid || net.edge[7].isMajor) ? error("edge 7 is not hybrid or is major") : nothing - net.node[5].gammaz != -1 ? error("node 5 gammaz should be -1") : nothing - (!net.edge[6].istIdentifiable || !net.edge[3].istIdentifiable || !net.edge[9].istIdentifiable) ? error("edges identifiable as not identifiable") : nothing - net.visited[6] = false; - net.visited[3] = false; - net.visited[9] = false; - !all([!id for id in net.visited]) ? error("edges not identifiable as identifiable") : nothing - [n.number for n in net.leaf] == [1,2,4,7,8] ? nothing : error("net.leaf is wrong") -end - -# Case H -function testCaseH(net::HybridNetwork) - net.visited = [e.istIdentifiable for e in net.edge]; - net.numHybrids == 1 ? nothing : error("networks should have one hybrid node and it has $(net.numHybrids)") - node=net.hybrid[1]; - node.k != 4 ? error("k diff than 4") : nothing - (net.edge[4].inCycle != node.number || net.edge[5].inCycle != node.number || net.edge[7].inCycle != node.number || net.edge[9].inCycle != node.number ) ? error("edges not correctly in cycle") : nothing - (net.node[4].inCycle != node.number || net.node[6].inCycle != node.number || net.node[8].inCycle != node.number || net.node[10].inCycle != node.number) ? error("nodes not correctly in cycle") : nothing - (node.isBadDiamondI || node.isBadDiamondII) ? error("thinks it is bad diamond") : nothing - net.edge[8].containRoot ? error("8 can contain root") : nothing - (!net.edge[9].hybrid || !net.edge[9].isMajor) ? error("edge 9 is not hybrid or major") : nothing - (!net.edge[4].hybrid || net.edge[4].isMajor) ? error("edge 4 is not hybrid or is major") : nothing - node.gammaz != -1 ? error("hybrid node gammaz should be -1") : nothing - (!net.edge[3].istIdentifiable || !net.edge[5].istIdentifiable || !net.edge[7].istIdentifiable) ? error("edge9,5,13not identifiable") : nothing - net.visited[3] = false; - net.visited[5] = false; - net.visited[7] = false; - !all([!id for id in net.visited]) ? error("edges not identifiable as identifiable") : nothing - [n.number for n in net.leaf] == [1,2,4,5,6] ? nothing : error("net.leaf is wrong") -end - - -# Case J -function testCaseJ(net::HybridNetwork) - net.visited = [e.istIdentifiable for e in net.edge]; - net.numHybrids == 1 ? nothing : error("networks should have one hybrid node and it has $(net.numHybrids)") - node=net.hybrid[1]; - node.k != 5 ? error("k diff than 5") : nothing - (net.edge[2].inCycle != node.number || net.edge[4].inCycle != node.number || net.edge[6].inCycle != node.number || net.edge[10].inCycle != node.number || net.edge[8].inCycle != node.number) ? error("edges not correctly in cycle") : nothing - (net.node[2].inCycle != node.number || net.node[4].inCycle != node.number || net.node[6].inCycle != node.number || net.node[10].inCycle != node.number || net.node[9].inCycle) != node.number ? error("nodes not correctly in cycle") : nothing - net.edge[1].containRoot ? error("edge can contain root") : nothing - (!net.edge[2].hybrid || !net.edge[2].isMajor) ? error("edge 2 is not hybrid or major") : nothing - node.gammaz != -1 ? error("hybrid node gammaz should be -1") : nothing - (!net.edge[4].istIdentifiable || !net.edge[6].istIdentifiable || !net.edge[10].istIdentifiable) ? error("edge9,5,10not identifiable") : nothing - net.visited[4] = false; - net.visited[6] = false; - net.visited[10] = false; - !all([!id for id in net.visited]) ? error("edges not identifiable as identifiable") : nothing - [n.number for n in net.leaf] == [1,3,4,5,6] ? nothing : error("net.leaf is wrong") -end - -# Case D bad triangle I -function testCaseD(net::HybridNetwork) - net.visited = [e.istIdentifiable for e in net.edge]; - n = searchHybridNode(net); - node = n[1]; - node.k != 3 ? error("k diff than 3") : nothing - node.isVeryBadTriangle ? nothing : error("does not know it is very bad triangle") - node.isExtBadTriangle ? error("thinks it is extremely bad triangle") : nothing - net.hasVeryBadTriangle ? nothing : error("net does not know it has very bad triangle") - net.numBad == 0 ? nothing : error("net.numBad should be 0") - net.numHybrids != 1 ? error("should have 1 hybrid, but net.numHybrids is $(net.numHybrids): $([n.number for n in net.hybrid])") : nothing -end - -# Case E bad triangle I -function testCaseE(net::HybridNetwork) - net.visited = [e.istIdentifiable for e in net.edge]; - n = searchHybridNode(net); - node = n[1]; - node.k != 3 ? error("k diff than 3") : nothing - node.isVeryBadTriangle ? nothing : error("does not know it is very bad triangle") - node.isExtBadTriangle ? error("thinks it is extremely bad triangle") : nothing - net.hasVeryBadTriangle ? nothing : error("net does not know it has very bad triangle") - net.numBad == 0 ? nothing : error("net.numBad should be 0") - net.numHybrids != 1 ? error("should have 1 hybrid, but net.numHybrids is $(net.numHybrids): $([n.number for n in net.hybrid])") : nothing -end - - -# Case I bad diamond II -function testCaseI(net::HybridNetwork) - net.numHybrids == 1 ? nothing : error("networks should have one hybrid node and it has $(net.numHybrids)") - node = net.hybrid[1]; - node.isBadDiamondII ? nothing : error("does not know it is bad diamond II") - node.isBadDiamondI ? error("thinks it is bad diamond I") : nothing - node.k == 4 ? nothing : error("k should be 4") - net.visited = [e.istIdentifiable for e in net.edge]; - edge4 = getIndexEdge(4,net); - edge1 = getIndexEdge(1,net); - edge2 = getIndexEdge(2,net); - edge3 = getIndexEdge(3,net); - edge9 = getIndexEdge(9,net); - edge10 = getIndexEdge(10,net); - edge6 = getIndexEdge(6,net); - node1 = getIndexNode(-2,net); - node2 = getIndexNode(-3,net); - node5 = getIndexNode(-6,net); - node3 = getIndexNode(3,net); - (net.edge[edge4].inCycle != node.number || net.edge[edge9].inCycle != node.number || net.edge[edge6].inCycle != node.number || net.edge[edge10].inCycle != node.number ) ? error("edges not correctly in cycle") : nothing - (net.node[node1].inCycle != node.number || net.node[node2].inCycle != node.number || net.node[node5].inCycle != node.number || net.node[node3].inCycle != node.number) ? error("nodes 1,5,11,12 not correctly in cycle") : nothing - (net.edge[edge1].containRoot || net.edge[edge2].containRoot || net.edge[edge3].containRoot) ? error("edges can contain root and shouldn't") : nothing - (!net.edge[edge4].hybrid || !net.edge[edge4].isMajor) ? error("edge 4 is not hybrid or major") : nothing - net.edge[edge3].length != 0 ? error("edges should have length 0") : nothing - net.edge[edge3].istIdentifiable ? error("edge9,4 identifiable and should not") : nothing - (net.edge[edge4].istIdentifiable && net.edge[edge9].istIdentifiable && net.edge[edge6].istIdentifiable && net.edge[edge10].istIdentifiable) || error("edges that should be identifiable, are not") - net.visited[edge4] = false; - net.visited[edge9] = false; - net.visited[edge6] = false; - net.visited[edge10] = false; - !all([!id for id in net.visited]) ? error("edges not identifiable as identifiable") : nothing - [n.number for n in net.leaf] == [1,2,4,5,6] ? nothing : error("net.leaf is wrong") -end - - -# tree example -function testTree(net::HybridNetwork) - !all([!e.hybrid for e in net.edge]) ? error("some edge is still hybrid") : nothing - !all([!e.hybrid for e in net.node]) ? error("some node is still hybrid") : nothing - !all([!e.hasHybEdge for e in net.node]) ? error("some node has hybrid edge") : nothing - !all([e.isMajor for e in net.edge]) ? error("some edge is not major") : nothing - !all([e.containRoot for e in net.edge]) ? error("some edge cannot contain root") : nothing - edge9 = getIndexNumEdge(9,net); - edge5 = getIndexNumEdge(5,net); - (!net.edge[5].istIdentifiable || !net.edge[3].istIdentifiable) ? error("edge3,5 not identifiable") : nothing - net.visited = [e.istIdentifiable for e in net.edge]; - net.visited[3] = false; - net.visited[5] = false; - !all([!id for id in net.visited]) ? error("edges not identifiable as identifiable") : nothing - net.edge[2].length != 1.5 ? error("edge length for 2 is wrong") : nothing - net.edge[4].length != 0.2 ? error("edge length for 4 is wrong") : nothing - [n.number for n in net.leaf] == [1,2,4,6,7] ? nothing : error("net.leaf is wrong") -end diff --git a/test/test_graph_components.jl b/test/test_graph_components.jl index bd16114a9..2cd9d0922 100644 --- a/test/test_graph_components.jl +++ b/test/test_graph_components.jl @@ -4,61 +4,61 @@ @testset "Testing Tarjan's biconnected components" begin -net = readTopology("(A,(B,(C,D)));"); -a = biconnectedComponents(net); +net = readnewick("(A,(B,(C,D)));"); +a = biconnectedcomponents(net); @test [[e.number for e in b] for b in a] == [[1],[2],[3],[4],[5],[6],] -net = readTopology("(((A,(((C,(D)#H2),(E,#H2)))#H1),(B,#H1)),F);"); -a = biconnectedComponents(net); +net = readnewick("(((A,(((C,(D)#H2),(E,#H2)))#H1),(B,#H1)),F);"); +a = biconnectedcomponents(net); @test [[e.number for e in b] for b in a] == [[1],[2],[3],[6], [8, 7, 4, 5],[9],[12],[14, 13, 10, 11],[15],[16]] -net = readTopology("(((A,(B)#H1),((C,(E)#H2),#H1)),(D,#H2));"); -a = biconnectedComponents(net); +net = readnewick("(((A,(B)#H1),((C,(E)#H2),#H1)),(D,#H2));"); +a = biconnectedcomponents(net); @test [[e.number for e in b] for b in a] == [[1], [2],[5],[6],[12],[10, 14, 13, 7, 8, 9, 3, 4, 11]] -net = readTopology("((((A,(B)#H1),((C,(E)#H2),#H1)),(D,#H2)),(((F)#H3,G),(H,#H3)));"); -a = biconnectedComponents(net); +net = readnewick("((((A,(B)#H1),((C,(E)#H2),#H1)),(D,#H2)),(((F)#H3,G),(H,#H3)));"); +a = biconnectedcomponents(net); @test [[e.number for e in b] for b in a] == [[1],[2],[5],[6],[12], [10, 14, 13, 7, 8, 9, 3, 4, 11],[15],[16],[20],[18], [22, 21, 17, 19],[23]] -a = biconnectedComponents(net, true); +a = biconnectedcomponents(net, true); @test [[e.number for e in b] for b in a] == [[10, 14, 13, 7, 8, 9, 3, 4, 11], [22, 21, 17, 19]] # net with hybrid ladder; 3 degree-2 nodes; root edge above LSA -net = readTopology("((((((((((((Ae_caudata))#H1,#H2),(Ae_umbellulata,#H1)),Ae_comosa),((((Ae_searsii)#H2,#H3),#H4)))),(((Ae_speltoides_Tr223,Ae_speltoides_Tr251))#H3,(Ae_mutica)#H4))),S_vavilovii)));") -a = biconnectedComponents(net, false); +net = readnewick("((((((((((((Ae_caudata))#H1,#H2),(Ae_umbellulata,#H1)),Ae_comosa),((((Ae_searsii)#H2,#H3),#H4)))),(((Ae_speltoides_Tr223,Ae_speltoides_Tr251))#H3,(Ae_mutica)#H4))),S_vavilovii)));") +a = biconnectedcomponents(net, false); a = [sort!([e.number for e in b]) for b in a] @test length(a) == 14 @test a[14] == [31] # root edge @test a[10] == [3,4,5, 7,8,9, 11, 13,14,15,16,17,18,19,20, 24, 26,27] -net = readTopology("((((A,(B)#H1),((C,(E)#H2),#H1)),(D,#H2)),(((F)#H3,G),(H,#H3)));"); -r,major,minor = PhyloNetworks.blobInfo(net, false); +net = readnewick("((((A,(B)#H1),((C,(E)#H2),#H1)),(D,#H2)),(((F)#H3,G),(H,#H3)));"); +r,major,minor = PhyloNetworks.blobinfo(net, false); @test [n.number for n in r] == [-5, 3, -8, 6, -10, -3, -2, 9, -14, -12, -11, -2] -r,major,minor = PhyloNetworks.blobInfo(net); +r,major,minor = PhyloNetworks.blobinfo(net); @test [n.number for n in r] == [-3,-11,-2] @test [[e.number for e in h] for h in major] == [[7, 3],[17],[]] @test [[e.number for e in h] for h in minor] == [[13,9],[21],[]] -forest, blobs = blobDecomposition(net); +forest, blobs = blobdecomposition(net); @test length(blobs)==3 -@test writeTopology(forest) == "(dummy -3,dummy -11);" +@test writenewick(forest) == "(dummy -3,dummy -11);" s = IOBuffer() -writeSubTree!(s, blobs[1], nothing, false, true) +writesubtree!(s, blobs[1], nothing, false, true) @test String(take!(s)) == "(((A,(B)#H1),((C,(E)#H2),#H1)),(D,#H2));" -writeSubTree!(s, blobs[2], nothing, false, true) +writesubtree!(s, blobs[2], nothing, false, true) @test String(take!(s)) == "(((F)#H3,G),(H,#H3));" -writeSubTree!(s, blobs[3], nothing, false, true) +writesubtree!(s, blobs[3], nothing, false, true) @test String(take!(s)) == "(dummy -3,dummy -11);" # h=2, 2 non-trivial blobs above the LSA, LSA = the single tip -net = readTopology("((((t1)#H22:::0.8,#H22))#H10:::0.7,#H10);") -a = biconnectedComponents(net,true); +net = readnewick("((((t1)#H22:::0.8,#H22))#H10:::0.7,#H10);") +a = biconnectedcomponents(net,true); @test [[e.number for e in b] for b in a] == [[3,2], [6,5]] lsa, lsaind = PhyloNetworks.leaststableancestor(net) @test (lsa.number,lsaind) == (2,4) # h=3, one level-1 blob above the LSA, one level-2 blob below including a 2-cycle -net = readTopology("((((((t2,#H25:::0.3))#H22:::0.8,#H22),(t1)#H25:::0.7))#H10:::0.6,#H10);") -a = biconnectedComponents(net,true); +net = readnewick("((((((t2,#H25:::0.3))#H22:::0.8,#H22),(t1)#H25:::0.7))#H10:::0.6,#H10);") +a = biconnectedcomponents(net,true); [[e.number for e in b] for b in a] == [ [5,8,2,3,4,6], [11,10]] aentry = PhyloNetworks.biconnectedcomponent_entrynodes(net, a) @@ -67,11 +67,11 @@ aexit = PhyloNetworks.biconnectedcomponent_exitnodes(net, a) @test [[n.number for n in ae] for ae in aexit] == [[2,-7],[5]] # balanced tree + extra root edge -net = readTopology("((((t1,t2),(t3,t4))));") +net = readnewick("((((t1,t2),(t3,t4))));") _, lsaindex = PhyloNetworks.leaststableancestor(net) -@test net.nodes_changed[lsaindex].number == -4 +@test net.vec_node[lsaindex].number == -4 # LSA = root & entry to non-trivial blob -lsa, _ = PhyloNetworks.leaststableancestor(readTopology("(#H2:::0.2,((b)#H2,a));")) +lsa, _ = PhyloNetworks.leaststableancestor(readnewick("(#H2:::0.2,((b)#H2,a));")) @test lsa.number == -2 end @@ -79,16 +79,16 @@ end @testset "tree component" begin treestr = "(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);" - tree = readTopology(treestr) - for e in tree.edge e.containRoot=false; end # wrong, on purpose + tree = readnewick(treestr) + for e in tree.edge e.containroot=false; end # wrong, on purpose @test collect(values(treeedgecomponents(tree))) == repeat([1], inner=7) rcomp = checkroot!(tree) @test rcomp == 1 - @test all([e.containRoot for e = tree.edge]) + @test all([e.containroot for e = tree.edge]) netstr = "(#H1:::0.1,#H2:::0.2,(((b)#H1)#H2,a));" - net = readTopology(netstr) - for e in net.edge e.containRoot=false; end # wrong, on purpose + net = readnewick(netstr) + for e in net.edge e.containroot=false; end # wrong, on purpose node2comp = treeedgecomponents(net) # e.g. [1,1,1,2,2,3] or [2,2,2,1,1,3] compsize = [count(isequal(i), values(node2comp)) for i in 1:3] @test sort(compsize) == [1,2,3] @@ -96,21 +96,21 @@ end @test compsize[rcompID] == 3 rcomp = keys(filter(p -> p.second == rcompID, node2comp)) @test Set(n.number for n in rcomp) == Set([-2 -3 4]) - @test Set(e.number for e in net.edge if e.containRoot) == Set([7 6 5 2 1]) - for e in net.edge e.containRoot=true; end # wrong, on purpose - net.root = 2 # node number 1, also H1: not in the root component on purpose + @test Set(e.number for e in net.edge if e.containroot) == Set([7 6 5 2 1]) + for e in net.edge e.containroot=true; end # wrong, on purpose + net.rooti = 2 # node number 1, also H1: not in the root component on purpose checkroot!(net) - @test [e.number for e in net.edge if e.containRoot] == [1,2,5,6,7] - @test net.root == 5 # i.e. node number -3. only 1 other option: 6, i.e. nn -2 + @test [e.number for e in net.edge if e.containroot] == [1,2,5,6,7] + @test net.rooti == 5 # i.e. node number -3. only 1 other option: 6, i.e. nn -2 # test semidirected cycle case - net.edge[1].isChild1 = !net.edge[1].isChild1 - net.edge[7].isChild1 = !net.edge[7].isChild1 + net.edge[1].ischild1 = !net.edge[1].ischild1 + net.edge[7].ischild1 = !net.edge[7].ischild1 net.edge[7].hybrid = true net.edge[7].gamma = net.edge[4].gamma net.edge[4].gamma = 1.0 net.edge[4].hybrid = false - net.root = 5 + net.rooti = 5 net.node[6].hybrid = true net.node[6].name = "H3" net.node[2].hybrid = false @@ -128,7 +128,7 @@ end # test multiple entry points case str_level1 = "(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" - netl1 = readTopology(str_level1) + netl1 = readnewick(str_level1) P = PhyloNetworks # binding P: local to test set root = netl1.node[19] # 19 = findfirst(n -> n.number == -2, netl1.node) e1 = netl1.edge[20] # 20 = findfirst(e -> e.number == 20, netl1.edge) @@ -147,7 +147,7 @@ end end # test undirected cycle case - netl1 = readTopology(str_level1) + netl1 = readnewick(str_level1) n1 = netl1.node[14] # 14 = P.getIndexNode(-6, netl1) n2 = netl1.node[6] # 6 = P.getIndexNode(-8, netl1) e = P.Edge(21,1.0,false,1.0) # 21 = length(netl1.edge) + 1 diff --git a/test/test_hasEdge.jl b/test/test_hasEdge.jl deleted file mode 100644 index da78283df..000000000 --- a/test/test_hasEdge.jl +++ /dev/null @@ -1,135 +0,0 @@ -# test for hasEdge of a QuartetNetwork -# Claudia January 2015 -# Also, tests for net.ht, net.numht, qnet.indexht - -#println("----- Case G ------") -include("../examples/case_g_example.jl"); -# include(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","case_g_example.jl")) - -q1 = Quartet(1,["6","7","4","8"],[0.5,0.4,0.1]); -q2 = Quartet(2,["6","7","10","8"],[0.5,0.4,0.1]); -q3 = Quartet(3,["10","7","4","8"],[0.5,0.4,0.1]); -q4 = Quartet(4,["6","10","4","8"],[0.5,0.4,0.1]); -q5 = Quartet(5,["6","7","4","10"],[0.5,0.4,0.1]); - -d = DataCF([q1,q2,q3,q4,q5]); -#parameters!(net) - -extractQuartet!(net,d) -error1 = false -try - q1.qnet.hasEdge == [true,true,true,true] ? nothing : error("q1 wrong hasEdge") - q2.qnet.hasEdge == [true,false,true,true] ? nothing : error("q2 wrong hasEdge") - q3.qnet.hasEdge == [true,false,true,true] ? nothing : error("q3 wrong hasEdge") - q4.qnet.hasEdge == [false,true,true,false] ? nothing : error("q4 wrong hasEdge") - q5.qnet.hasEdge == [true, true,true,false] ? nothing : error("q5 wrong hasEdge") - - - net.ht == [0.1,0.2,0.1,1.0] ? nothing : error("net.ht not correct") - net.numht == [7,3,6,9] ? nothing : error("net.numth not correct") - - q1.qnet.indexht == [1,2,3,4] ? nothing : error("q1.qnet.indexht not correct") - q2.qnet.indexht == [1,3,4] ? nothing : error("q2.qnet.indexht not correct") - q3.qnet.indexht == [1,3,4] ? nothing : error("q3.qnet.indexht not correct") - q4.qnet.indexht == [2,3] ? nothing : error("q4.qnet.indexht not correct") - q5.qnet.indexht == [1,2,3] ? nothing : error("q5.qnet.indexht not correct") - - q1.qnet.index == [7,3,6,9] ? nothing : error("q1.qnet.index not correct") - q2.qnet.index == [5,4,7] ? nothing : error("q2.qnet.index not correct") - q3.qnet.index == [5,4,7] ? nothing : error("q3.qnet.index not correct") - q4.qnet.index == [3,4] ? nothing : error("q4.qnet.index not correct") - q5.qnet.index == [7,3,6] ? nothing : error("q5.qnet.index not correct") -catch - println("---- error in case G -----") - global error1 = true -end - - -#println("----- Case F: bad diamond ------") -include("../examples/case_f_example.jl"); -# include(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","case_f_example.jl")) - -q1 = Quartet(1,["6","7","4","8"],[0.5,0.4,0.1]); -q2 = Quartet(2,["6","7","10","8"],[0.5,0.4,0.1]); -q3 = Quartet(3,["10","7","4","8"],[0.5,0.4,0.1]); -q4 = Quartet(4,["6","10","4","8"],[0.5,0.4,0.1]); -q5 = Quartet(5,["6","7","4","10"],[0.5,0.4,0.1]); - -d = DataCF([q1,q2,q3,q4,q5]); -parameters!(net) - -extractQuartet!(net,d) -error1 = false -try - q1.qnet.hasEdge == [false,true,true] ? nothing : error("q1 wrong hasEdge") - q2.qnet.hasEdge == [true,false,false] ? nothing : error("q2 wrong hasEdge") - q3.qnet.hasEdge == [true,false,true] ? nothing : error("q3 wrong hasEdge") - q4.qnet.hasEdge == [true,true,false] ? nothing : error("q4 wrong hasEdge") - q5.qnet.hasEdge == [false, true,true] ? nothing : error("q5 wrong hasEdge") - - - all(map(approxEq,net.ht,[0.1,0.7*(1-exp(-0.2)),0.3*(1-exp(-0.1))])) ? nothing : error("net.ht not correct") - net.numht == [9,21,22] ? nothing : error("net.numth not correct") - - q1.qnet.indexht == [2,3] ? nothing : error("q1.qnet.indexht not correct") - q2.qnet.indexht == [1] ? nothing : error("q2.qnet.indexht not correct") - q3.qnet.indexht == [1,3] ? nothing : error("q3.qnet.indexht not correct") - q4.qnet.indexht == [1,2] ? nothing : error("q4.qnet.indexht not correct") - q5.qnet.indexht == [2,3] ? nothing : error("q5.qnet.indexht not correct") - - q1.qnet.index == [1,3] ? nothing : error("q1.qnet.index not correct") - q2.qnet.index == [4] ? nothing : error("q2.qnet.index not correct") - q3.qnet.index == [5,3] ? nothing : error("q3.qnet.index not correct") - q4.qnet.index == [5,3] ? nothing : error("q4.qnet.index not correct") - q5.qnet.index == [1,3] ? nothing : error("q5.qnet.index not correct") -catch - println("---- error in case F -----") - global error1 = true -end - -#println("----- Case I: bad diamondII ------") -include("../examples/case_i_example.jl"); - -q1 = Quartet(1,["6","7","4","8"],[0.5,0.4,0.1]); -q2 = Quartet(2,["6","7","10","8"],[0.5,0.4,0.1]); -q3 = Quartet(3,["10","7","4","8"],[0.5,0.4,0.1]); -q4 = Quartet(4,["6","10","4","8"],[0.5,0.4,0.1]); -q5 = Quartet(5,["6","7","4","10"],[0.5,0.4,0.1]); - -d = DataCF([q1,q2,q3,q4,q5]); - -extractQuartet!(net,d) -error1 = false -try - q1.qnet.hasEdge == [true,false,true,false,true] ? nothing : error("q1 wrong hasEdge") - q2.qnet.hasEdge == [true,true,true,true,true] ? nothing : error("q2 wrong hasEdge") - q3.qnet.hasEdge == [true,true,true,true,true] ? nothing : error("q3 wrong hasEdge") - q4.qnet.hasEdge == [true,true,true,true,true] ? nothing : error("q4 wrong hasEdge") - q5.qnet.hasEdge == [true,false,true,false,true] ? nothing : error("q5 wrong hasEdge") - - - net.ht == [0.1,2.,1.,1.,1.] ? nothing : error("net.ht not correct") - net.numht == [9,4,6,9,10] ? nothing : error("net.numth not correct") - - q1.qnet.indexht == [1,3,5] ? nothing : error("q1.qnet.indexht not correct") - q2.qnet.indexht == [1,2,3,4,5] ? nothing : error("q2.qnet.indexht not correct") - q3.qnet.indexht == [1,2,3,4,5] ? nothing : error("q3.qnet.indexht not correct") - q4.qnet.indexht == [1,2,3,4,5] ? nothing : error("q4.qnet.indexht not correct") - q5.qnet.indexht == [1,3,5] ? nothing : error("q5.qnet.indexht not correct") - - q1.qnet.index == [7,4,8] ? nothing : error("q1.qnet.index not correct") - q2.qnet.index == [8,4,6,8,9] ? nothing : error("q2.qnet.index not correct") - q3.qnet.index == [8,4,6,8,9] ? nothing : error("q3.qnet.index not correct") - q4.qnet.index == [8,4,5,8,9] ? nothing : error("q4.qnet.index not correct") - q5.qnet.index == [7,4,8] ? nothing : error("q5.qnet.index not correct") - -catch - println("---- error in case I -----") - global error1 = true -end - -if error1 - throw("errors in has edge") -end - - diff --git a/test/test_interop.jl b/test/test_interop.jl index ae86a9b60..7c31e8f6e 100644 --- a/test/test_interop.jl +++ b/test/test_interop.jl @@ -1,10 +1,10 @@ @testset "testing interoperability, matrix-based net" begin # tree, some edge lengths missing -tree1 = readTopology("(A,(B:1.0,(C:1.0,D:1.0):1.0):1.0);"); -@test_logs PhyloNetworks.resetNodeNumbers!(tree1); +tree1 = readnewick("(A,(B:1.0,(C:1.0,D:1.0):1.0):1.0);"); +@test_logs PhyloNetworks.resetnodenumbers!(tree1); tree1.edge[3].number = 50 -@test_logs (:warn, r"^resetting edge numbers") PhyloNetworks.resetEdgeNumbers!(tree1); +@test_logs (:warn, r"^resetting edge numbers") PhyloNetworks.resetedgenumbers!(tree1); @test tree1.edge[3].number == 3 @test PhyloNetworks.majoredgematrix(tree1) == [5 1; 5 6; 6 2; 6 7; 7 3; 7 4] @test all(PhyloNetworks.majoredgelength(tree1) .=== [missing, 1.0,1.0,1.0,1.0,1.0]) @@ -13,8 +13,8 @@ tree1.edge[3].number = 50 @test size(PhyloNetworks.minorreticulationgamma(tree1)) == (0,) # network, h=1, some missing gamma values -net1 = (@test_logs (:warn, r"^third colon : without gamma value") readTopology("(((A:4.0,(B:1.0)#H1:1.1::):0.5,(C:0.6,#H1:1.0):1.0):3.0,D:5.0);")); -@test_logs PhyloNetworks.resetNodeNumbers!(net1); +net1 = (@test_logs (:warn, r"^third colon : without gamma value") readnewick("(((A:4.0,(B:1.0)#H1:1.1::):0.5,(C:0.6,#H1:1.0):1.0):3.0,D:5.0);")); +@test_logs PhyloNetworks.resetnodenumbers!(net1); @test PhyloNetworks.majoredgematrix(net1) == [5 6; 5 4; 6 8; 6 7; 7 3; 8 1; 8 9; 9 2] @test PhyloNetworks.majoredgelength(net1) == [3.,5.,.5,1.,.6,4.,1.1,1.] @test PhyloNetworks.minorreticulationmatrix(net1) == [7 9] @@ -24,8 +24,8 @@ net1 = (@test_logs (:warn, r"^third colon : without gamma value") readTopology(" # network, h=2 hybridizations s = "(((Ag,(#H1:7.159::0.056,((Ak,(E:0.08,#H2:0.0::0.004):0.023):0.078,(M:0.0)#H2:::0.996):2.49):2.214):0.026, (((((Az:0.002,Ag2:0.023):2.11,As:2.027):1.697)#H1:0.0::0.944,Ap):0.187,Ar):0.723):5.943,(P,20):1.863,165);"; -net2 = readTopology(s); -@test_logs PhyloNetworks.resetNodeNumbers!(net2); +net2 = readnewick(s); +@test_logs PhyloNetworks.resetnodenumbers!(net2); @test PhyloNetworks.majoredgematrix(net2) == [13 15; 13 14; 13 12; 14 10; 14 11; 15 18; 15 16; 16 17; 16 9; 17 24; 17 8; 18 1; 18 19; 19 20; 20 21; 20 23; 21 2; 21 22; 22 3; 23 4; 24 25; 25 26; 25 7; 26 5; 26 6] diff --git a/test/test_isMajor.jl b/test/test_isMajor.jl index ed0937b9b..8702e9292 100644 --- a/test/test_isMajor.jl +++ b/test/test_isMajor.jl @@ -1,35 +1,35 @@ -@testset "readTopology Hybrid Node isMajor Tests" begin +@testset "readnewick Hybrid Node ismajor Tests" begin global n1, n2, n3 - # n1: see issue #44, both hybrid parent edges were minor - n1 = readTopology("(A,((B,#H1),(C,(D)#H1:::0.2)));") - @test writeTopology(n1) == "(A,((B,(D)#H1:::0.8),(C,#H1:::0.2)));" - hybridParents = [x for x in n1.hybrid[1].edge if x.hybrid] - # Exclusive or to check exactly one parent edge is major - @test hybridParents[1].isMajor ⊻ hybridParents[2].isMajor - # Gammas must sum to 1 and be non-negative for hybrids - @test hybridParents[1].gamma + hybridParents[2].gamma == 1.0 - @test hybridParents[1].gamma >= 0.0 - @test hybridParents[2].gamma >= 0.0 - # n2 previously failed: both hybrid parent edges were major - n2 = readTopology("(A,((B,#H1:::0.5),(C,(D)#H1:::0.5)));") - @test writeTopology(n2) == "(A,((B,#H1:::0.5),(C,(D)#H1:::0.5)));" - hybridParents = [x for x in n2.hybrid[1].edge if x.hybrid] - # Exclusive or to check exactly one parent edge is major - @test hybridParents[1].isMajor ⊻ hybridParents[2].isMajor - # Gammas must sum to 1 and be non-negative for hybrids - @test hybridParents[1].gamma + hybridParents[2].gamma == 1.0 - @test hybridParents[1].gamma >= 0.0 - @test hybridParents[2].gamma >= 0.0 - n3 = readTopology("(A,((C,(D)#H1:::0.5),(B,#H1:::0.5)));") - @test writeTopology(n3) =="(A,((C,(D)#H1:::0.5),(B,#H1:::0.5)));" + # n1: see issue #44, both hybrid parent edges were minor + n1 = readnewick("(A,((B,#H1),(C,(D)#H1:::0.2)));") + @test writenewick(n1) == "(A,((B,(D)#H1:::0.8),(C,#H1:::0.2)));" + hybridParents = [x for x in n1.hybrid[1].edge if x.hybrid] + # Exclusive or to check exactly one parent edge is major + @test hybridParents[1].ismajor ⊻ hybridParents[2].ismajor + # Gammas must sum to 1 and be non-negative for hybrids + @test hybridParents[1].gamma + hybridParents[2].gamma == 1.0 + @test hybridParents[1].gamma >= 0.0 + @test hybridParents[2].gamma >= 0.0 + # n2 previously failed: both hybrid parent edges were major + n2 = readnewick("(A,((B,#H1:::0.5),(C,(D)#H1:::0.5)));") + @test writenewick(n2) == "(A,((B,#H1:::0.5),(C,(D)#H1:::0.5)));" + hybridParents = [x for x in n2.hybrid[1].edge if x.hybrid] + # Exclusive or to check exactly one parent edge is major + @test hybridParents[1].ismajor ⊻ hybridParents[2].ismajor + # Gammas must sum to 1 and be non-negative for hybrids + @test hybridParents[1].gamma + hybridParents[2].gamma == 1.0 + @test hybridParents[1].gamma >= 0.0 + @test hybridParents[2].gamma >= 0.0 + n3 = readnewick("(A,((C,(D)#H1:::0.5),(B,#H1:::0.5)));") + @test writenewick(n3) =="(A,((C,(D)#H1:::0.5),(B,#H1:::0.5)));" end @testset "parsing extended newick" begin # second reticulation has minor before major, issue #70: -net1 = (@test_logs readTopology("(((lo,#H3),#H4),((sp)#H3,(mu)#H4));")); -net3 = (@test_logs readTopology("(((sp)#H3,(mu)#H4),((lo,#H3),#H4));")); -@test hardwiredClusterDistance(net1, net3, true) == 0 -@test_logs readTopology("((((((((((((((Ae_ca1,Ae_ca2),Ae_ca3))#H1,#H2),(((Ae_um1,Ae_um2),Ae_um3),#H1)),((Ae_co1,Ae_co),(((Ae_un1,Ae_un2),Ae_un3),Ae_un4))),(((Ae_ta1,Ae_ta2),(Ae_ta3,Ae_ta4)),((((((((Ae_lo1,Ae_lo2),Ae_lo3),(Ae_sh1,Ae_sh2)),((Ae_bi1,Ae_bi2),Ae_bi3)),((Ae_se1,Ae_se2),Ae_se3)))#H2,#H3),#H4))),(((T_bo1,(T_bo2,T_bo3)),T_bo4),((T_ur1,T_ur2),(T_ur3,T_ur4)))),(((((Ae_sp1,Ae_sp2),Ae_sp3),Ae_sp4))#H3,((((Ae_mu1,Ae_mu2),Ae_mu3),Ae_mu4))#H4))),Ta_ca),S_va),Er_bo),H_vu);"); -@test_throws ErrorException readTopology("(((lo,#H3),#H4);") # "Tree ended while reading in subtree ..." -@test_throws ErrorException readTopology("((lo,#H3),);") # "Expected beginning of subtree but read ..." +net1 = (@test_logs readnewick("(((lo,#H3),#H4),((sp)#H3,(mu)#H4));")); +net3 = (@test_logs readnewick("(((sp)#H3,(mu)#H4),((lo,#H3),#H4));")); +@test hardwiredclusterdistance(net1, net3, true) == 0 +@test_logs readnewick("((((((((((((((Ae_ca1,Ae_ca2),Ae_ca3))#H1,#H2),(((Ae_um1,Ae_um2),Ae_um3),#H1)),((Ae_co1,Ae_co),(((Ae_un1,Ae_un2),Ae_un3),Ae_un4))),(((Ae_ta1,Ae_ta2),(Ae_ta3,Ae_ta4)),((((((((Ae_lo1,Ae_lo2),Ae_lo3),(Ae_sh1,Ae_sh2)),((Ae_bi1,Ae_bi2),Ae_bi3)),((Ae_se1,Ae_se2),Ae_se3)))#H2,#H3),#H4))),(((T_bo1,(T_bo2,T_bo3)),T_bo4),((T_ur1,T_ur2),(T_ur3,T_ur4)))),(((((Ae_sp1,Ae_sp2),Ae_sp3),Ae_sp4))#H3,((((Ae_mu1,Ae_mu2),Ae_mu3),Ae_mu4))#H4))),Ta_ca),S_va),Er_bo),H_vu);"); +@test_throws ErrorException readnewick("(((lo,#H3),#H4);") # "Tree ended while reading in subtree ..." +@test_throws ErrorException readnewick("((lo,#H3),);") # "Expected beginning of subtree but read ..." end diff --git a/test/test_lm.jl b/test/test_lm.jl deleted file mode 100644 index 7c7d49551..000000000 --- a/test/test_lm.jl +++ /dev/null @@ -1,737 +0,0 @@ -## tests of phylolm - -@testset "phylolm on small network" begin -global net - -tree_str= "(A:2.5,((B:1,#H1:0.5::0.1):1,(C:1,(D:0.5)#H1:0.5::0.9):1):0.5);" -net = readTopology(tree_str) -preorder!(net) - -# Rk: Is there a way to check that the branch length are coherent with -# one another (Especialy for hybrids) ? -# see QuartetNetworkGoodnessFit.ultrametrize! which can detect if the network is -# time-consistent: all paths from the root to a given node have the same length -# https://github.com/juliaphylo/QuartetNetworkGoodnessFit.jl - -# Ancestral state reconstruction with ready-made matrices -params = ParamsBM(10, 1) -Random.seed!(2468); # simulates the Y values below under julia v1.6 -sim = simulate(net, params) # tests that the simulation runs, but results not used -Y = [11.239539657364706,8.600423079191044,10.559841251147608,9.965748423156297] # sim[:Tips] -X = ones(4, 1) -phynetlm = phylolm(X, Y, net; reml=false) -@test_logs show(devnull, phynetlm) -# Naive version (GLS) -ntaxa = length(Y) -Vy = phynetlm.Vy -Vyinv = inv(Vy) -XtVyinv = X' * Vyinv -logdetVy = logdet(Vy) -betahat = inv(XtVyinv * X) * XtVyinv * Y -fittedValues = X * betahat -resids = Y - fittedValues -sigma2hat = 1/ntaxa * (resids' * Vyinv * resids) -# log likelihood -loglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(sigma2hat) + logdetVy) -# null version -nullX = ones(ntaxa, 1) -nullXtVyinv = nullX' * Vyinv -nullresids = Y - nullX * inv(nullXtVyinv * nullX) * nullXtVyinv * Y -nullsigma2hat = 1/ntaxa * (nullresids' * Vyinv * nullresids) -nullloglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(nullsigma2hat) + logdetVy) - - -@test coef(phynetlm) ≈ betahat -@test nobs(phynetlm) ≈ ntaxa -@test residuals(phynetlm) ≈ resids -@test response(phynetlm) ≈ Y -@test predict(phynetlm) ≈ fittedValues -@test dof_residual(phynetlm) ≈ ntaxa-length(betahat) -@test sigma2_phylo(phynetlm) ≈ sigma2hat -@test loglikelihood(phynetlm) ≈ loglik -@test vcov(phynetlm) ≈ sigma2hat*ntaxa/(ntaxa-length(betahat))*inv(XtVyinv * X) -@test stderror(phynetlm) ≈ sqrt.(diag(sigma2hat*ntaxa/(ntaxa-length(betahat))*inv(XtVyinv * X))) -@test dof(phynetlm) ≈ length(betahat)+1 -@test deviance(phynetlm, Val(true)) ≈ sigma2hat * ntaxa -@test nulldeviance(phynetlm) ≈ nullsigma2hat * ntaxa -@test nullloglikelihood(phynetlm) ≈ nullloglik -@test loglikelihood(phynetlm) ≈ nullloglikelihood(phynetlm) -@test deviance(phynetlm, Val(true)) ≈ nulldeviance(phynetlm) -@test r2(phynetlm) ≈ 1-sigma2hat / nullsigma2hat atol=1e-15 -@test adjr2(phynetlm) ≈ 1 - (1 - (1-sigma2hat/nullsigma2hat))*(ntaxa-1)/(ntaxa-length(betahat)) atol=1e-15 -@test aic(phynetlm) ≈ -2*loglik+2*(length(betahat)+1) -@test aicc(phynetlm) ≈ -2*loglik+2*(length(betahat)+1)+2(length(betahat)+1)*((length(betahat)+1)+1)/(ntaxa-(length(betahat)+1)-1) -@test bic(phynetlm) ≈ -2*loglik+(length(betahat)+1)*log(ntaxa) -@test hasintercept(phynetlm) - -# with data frames -dfr = DataFrame(trait = Y, tipNames = ["A","B","C","D"]) # sim.M.tipNames -fitbis = phylolm(@formula(trait ~ 1), dfr, net; reml=false) -#@show fitbis - -@test coef(phynetlm) ≈ coef(fitbis) -@test vcov(phynetlm) ≈ vcov(fitbis) -@test nobs(phynetlm) ≈ nobs(fitbis) -@test residuals(phynetlm)[fitbis.ind] ≈ residuals(fitbis) -@test response(phynetlm)[fitbis.ind] ≈ response(fitbis) -@test predict(phynetlm)[fitbis.ind] ≈ predict(fitbis) -@test dof_residual(phynetlm) ≈ dof_residual(fitbis) -@test sigma2_phylo(phynetlm) ≈ sigma2_phylo(fitbis) -@test stderror(phynetlm) ≈ stderror(fitbis) -@test confint(phynetlm) ≈ confint(fitbis) -@test loglikelihood(phynetlm) ≈ loglikelihood(fitbis) -@test dof(phynetlm) ≈ dof(fitbis) -@test deviance(phynetlm, Val(true)) ≈ deviance(fitbis, Val(true)) -@test nulldeviance(phynetlm) ≈ nulldeviance(fitbis) -@test nullloglikelihood(phynetlm) ≈ nullloglikelihood(fitbis) -@test r2(phynetlm) ≈ r2(fitbis) atol=1e-15 -@test adjr2(phynetlm) ≈ adjr2(fitbis) atol=1e-15 -@test aic(phynetlm) ≈ aic(fitbis) -@test aicc(phynetlm) ≈ aicc(fitbis) -@test bic(phynetlm) ≈ bic(fitbis) -tmp = (@test_logs (:warn, r"^You fitted the data against a custom matrix") mu_phylo(phynetlm)) -@test tmp ≈ mu_phylo(fitbis) -@test hasintercept(phynetlm) - -## fixed values parameters -fitlam = phylolm(@formula(trait ~ 1), dfr, net, model = "lambda", fixedValue=1.0, reml=false) -@test_logs show(devnull, fitlam) - -@test lambda_estim(fitlam) ≈ 1.0 -@test coef(fitlam) ≈ coef(fitbis) -@test vcov(fitlam) ≈ vcov(fitbis) -@test nobs(fitlam) ≈ nobs(fitbis) -@test residuals(fitlam)[fitbis.ind] ≈ residuals(fitbis) -@test response(fitlam)[fitbis.ind] ≈ response(fitbis) -@test predict(fitlam)[fitbis.ind] ≈ predict(fitbis) -@test dof_residual(fitlam) ≈ dof_residual(fitbis) -@test sigma2_phylo(fitlam) ≈ sigma2_phylo(fitbis) -@test stderror(fitlam) ≈ stderror(fitbis) -@test confint(fitlam) ≈ confint(fitbis) -@test loglikelihood(fitlam) ≈ loglikelihood(fitbis) -@test dof(fitlam) ≈ dof(fitbis) + 1 -@test deviance(fitlam, Val(true)) ≈ deviance(fitbis, Val(true)) -@test nulldeviance(fitlam) ≈ nulldeviance(fitbis) -@test nullloglikelihood(fitlam) ≈ nullloglikelihood(fitbis) -@test r2(fitlam) ≈ r2(fitbis) atol=1e-15 -@test adjr2(fitlam) ≈ adjr2(fitbis) - 0.5 atol=1e-15 -@test aic(fitlam) ≈ aic(fitbis) + 2 -#@test aicc(fitlam) ≈ aicc(fitbis) -@test bic(fitlam) ≈ bic(fitbis) + log(nobs(fitbis)) -@test mu_phylo(fitlam) ≈ mu_phylo(fitbis) -@test hasintercept(fitlam) - -fitSH = phylolm(@formula(trait ~ 1), dfr, net, model="scalingHybrid", fixedValue=1.0, reml=false) -@test loglikelihood(fitlam) ≈ loglikelihood(fitSH) -@test aic(fitlam) ≈ aic(fitSH) - -@test modelmatrix(fitlam) == reshape(ones(4), (4,1)) -s = IOBuffer(); show(s, formula(fitlam)) -@test String(take!(s)) == "trait ~ 1" -PhyloNetworks.lambda!(fitlam, 0.5) -@test PhyloNetworks.lambda(fitlam) == 0.5 - -## Pagel's Lambda -fitlam = (@test_logs (:info, r"^Maximum lambda value") match_mode=:any phylolm(@formula(trait ~ 1), dfr, net, model="lambda", reml=false)) -@test lambda_estim(fitlam) ≈ 1.24875 - -## Scaling Hybrid -fitSH = phylolm(@formula(trait ~ 1), dfr, net, model="scalingHybrid", reml=false) -@test lambda_estim(fitSH) ≈ 4.057891910001937 atol=1e-5 - -end - -############################################################################### -### With shifts -############################################################################### -@testset "Shifts and Transgressive Evolution" begin -global net -net = readTopology("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); -preorder!(net) - -## Simulate -params = ParamsBM(10, 0.1, shiftHybrid([3.0, -3.0], net)) -Random.seed!(2468); # sets the seed for reproducibility, to debug potential error -sim = simulate(net, params) # checks for no error, but not used. -# values simulated using julia v1.6.4's RNG hardcoded below. -# Y = sim[:Tips] -Y = [11.640085037749985, 9.498284887480622, 9.568813792749083, 13.036916724865296, 6.873936265709946, 6.536647349405742, 5.95771939864956, 10.517318306450647, 9.34927049737206, 10.176238483133424, 10.760099940744308, 8.955543827353837] - -## Construct regression matrix -dfr_shift = regressorShift(net.edge[[8,17]], net) -dfr_shift[!,:sum] = vec(sum(Matrix(dfr_shift[:,findall(DataFrames.propertynames(dfr_shift) .!= :tipNames)]), dims=2)) -dfr_hybrid = regressorHybrid(net) - -@test dfr_shift[!,:shift_8] ≈ dfr_hybrid[!,:shift_8] -@test dfr_shift[!,:shift_17] ≈ dfr_hybrid[!,:shift_17] -@test dfr_shift[!,:sum] ≈ dfr_hybrid[!,:sum] - -## Data -dfr = DataFrame(trait = Y, tipNames = ["Ag","Ak","E","M","Az","Ag2","As","Ap","Ar","P","20","165"]) # sim.M.tipNames -dfr = innerjoin(dfr, dfr_hybrid, on=:tipNames) - -## Simple BM -fitShift = phylolm(@formula(trait ~ shift_8 + shift_17), dfr, net; reml=false) -@test_logs show(devnull, fitShift) - -## Test against fixed values lambda models -fitlam = phylolm(@formula(trait ~ shift_8 + shift_17), dfr, net, model="lambda", fixedValue=1.0, reml=false) - -@test lambda_estim(fitlam) ≈ 1.0 -@test coef(fitlam) ≈ coef(fitShift) -@test vcov(fitlam) ≈ vcov(fitShift) -@test nobs(fitlam) ≈ nobs(fitShift) -@test residuals(fitlam) ≈ residuals(fitShift) -@test response(fitlam) ≈ response(fitShift) -@test predict(fitlam) ≈ predict(fitShift) -@test dof_residual(fitlam) ≈ dof_residual(fitShift) -@test sigma2_phylo(fitlam) ≈ sigma2_phylo(fitShift) -@test stderror(fitlam) ≈ stderror(fitShift) -@test confint(fitlam) ≈ confint(fitShift) -@test loglikelihood(fitlam) ≈ loglikelihood(fitShift) -@test dof(fitlam) ≈ dof(fitShift) + 1 -@test deviance(fitlam, Val(true)) ≈ deviance(fitShift, Val(true)) -@test nulldeviance(fitlam) ≈ nulldeviance(fitShift) -@test nullloglikelihood(fitlam) ≈ nullloglikelihood(fitShift) -@test r2(fitlam) ≈ r2(fitShift) atol=1e-15 -#@test adjr2(fitlam) ≈ adjr2(fitShift) - 0.5 atol=1e-15 -@test aic(fitlam) ≈ aic(fitShift) + 2 -#@test aicc(fitlam) ≈ aicc(fitShift) -@test bic(fitlam) ≈ bic(fitShift) + log(nobs(fitShift)) -@test mu_phylo(fitlam) ≈ mu_phylo(fitShift) -@test hasintercept(fitlam) - -fitSH = phylolm(@formula(trait ~ shift_8 + shift_17), dfr, net, model="scalingHybrid", fixedValue=1.0, reml=false) -@test loglikelihood(fitlam) ≈ loglikelihood(fitSH) -@test aic(fitlam) ≈ aic(fitSH) - -## ftest against own naive implementation -modnull = phylolm(@formula(trait ~ 1), dfr, net) -@test sigma2_phylo(modnull) ≈ 0.6517876326943942 atol=1e-6 # using REML -modhom = phylolm(@formula(trait ~ sum), dfr, net) -modhet = phylolm(@formula(trait ~ sum + shift_8), dfr, net) -#= 3 warnings thrown by ftest, one for each model, because after transforming the - data to de-correlate the results, the intercept vector is not ∝ 1. - Keep the warnings: because incorrect R² values in the ftest output -=# -table1 = redirect_stdio(stderr=devnull) do # to avoid seeing the warnings - ftest(modhet, modhom, modnull) -end -table2 = PhyloNetworks.anova(modnull, modhom, modhet) - -@test table1.fstat[2] ≈ table2[2,:F] -@test table1.fstat[3] ≈ table2[1,:F] -@test table1.pval[2] ≈ table2[2,Symbol("Pr(>F)")] -@test table1.pval[3] ≈ table2[1,Symbol("Pr(>F)")] -@test hasintercept(modnull) && hasintercept(modhom) && hasintercept(modhet) -@test all(isapprox.(table1.r2, (0.8398130376214782, 0.006032952123011026, 0), atol=1e-15)) - -# Check that it is the same as doing shift_8 + shift_17 -modhetbis = phylolm(@formula(trait ~ shift_8 + shift_17), dfr, net) -table2bis = PhyloNetworks.anova(modnull, modhom, modhetbis) -@test table2[!,:F] ≈ table2bis[!,:F] -@test table2[!,Symbol("Pr(>F)")] ≈ table2bis[!,Symbol("Pr(>F)")] -@test table2[!,:dof_res] ≈ table2bis[!,:dof_res] -@test table2[!,:RSS] ≈ table2bis[!,:RSS] -@test table2[!,:dof] ≈ table2bis[!,:dof] -@test table2[!,:SS] ≈ table2bis[!,:SS] - -# re-fit with ML to do likelihood ratio test -modnull = phylolm(@formula(trait ~ 1), dfr, net; reml=false) -modhom = phylolm(@formula(trait ~ sum), dfr, net; reml=false) -modhet = phylolm(@formula(trait ~ sum + shift_8), dfr, net; reml=false) -table3 = (@test_logs lrtest(modhet, modhom, modnull)) -@test all(isapprox.(table3.deviance, (25.10067039653046,47.00501928245542,47.0776339693065), atol=1e-6)) -@test table3.dof == (4, 3, 2) -@test all(isapprox.(table3.pval[2:end], (2.865837220526082e-6,0.7875671600772386), atol=1e-6)) - -end - -################# -### No intercept -################# -@testset "No Intercept" begin -global net -net = readTopology("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); -preorder!(net) - -## data -Y = [11.640085037749985, 9.498284887480622, 9.568813792749083, 13.036916724865296, 6.873936265709946, 6.536647349405742, 5.95771939864956, 10.517318306450647, 9.34927049737206, 10.176238483133424, 10.760099940744308, 8.955543827353837] -X = [9.199418112245104, 8.641506886650749, 8.827105915999073, 11.198420342332025, 5.8212242346434655, 6.130520100788492, 5.846098148463377, 9.125593652542882, 10.575371612483897, 9.198463833849347, 9.090317561636194, 9.603570747653789] -dfr = DataFrame(trait = Y, reg = X, tipNames = ["Ag","Ak","E","M","Az","Ag2","As","Ap","Ar","P","20","165"]) # sim.M.tipNames -phynetlm = phylolm(@formula(trait ~ -1 + reg), dfr, net; reml=false) -# Naive version (GLS): most of it hard-coded, but code shown below -ntaxa = length(Y) -X = phynetlm.X -# Vy = phynetlm.Vy; Vyinv = inv(Vy); XtVyinv = X' * Vyinv; logdetVy = logdet(Vy) -betahat = [1.073805579608655] # inv(XtVyinv * X) * XtVyinv * Y -fittedValues = X * betahat -resids = Y - fittedValues -# sigma2hat = 1/ntaxa * (resids' * Vyinv * resids) -# loglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(sigma2hat) + logdetVy) -#= null model: no X, and not even an intercept -nullX = zeros(ntaxa, 1); nullresids = Y; nullXtVyinv = nullX' * Vyinv -nullsigma2hat = 1/ntaxa * (nullresids' * Vyinv * nullresids) # 6.666261935713196 -nullloglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(nullsigma2hat) + logdetVy) # -38.01145980802529 -=# -@test coef(phynetlm) ≈ betahat -@test nobs(phynetlm) ≈ 12 # ntaxa -@test residuals(phynetlm) ≈ resids -@test response(phynetlm) ≈ Y -@test predict(phynetlm) ≈ fittedValues -@test dof_residual(phynetlm) ≈ 11 # ntaxa-length(betahat) -@test sigma2_phylo(phynetlm) ≈ 0.1887449836519979 # sigma2hat -@test loglikelihood(phynetlm) ≈ -16.6249533603196 # loglik -@test vcov(phynetlm) ≈ [0.003054397019042955;;] # sigma2hat*ntaxa/(ntaxa-length(betahat))*inv(XtVyinv * X) -@test stderror(phynetlm) ≈ [0.05526659948868715] # sqrt.(diag(sigma2hat*ntaxa/(ntaxa-length(betahat))*inv(XtVyinv * X))) -@test dof(phynetlm) ≈ 2 # length(betahat)+1 -@test deviance(phynetlm, Val(true)) ≈ 2.264939803823975 # sigma2hat * ntaxa -@test nulldeviance(phynetlm) ≈ 79.99514322855836 # nullsigma2hat * ntaxa -@test nullloglikelihood(phynetlm) ≈ -38.01145980802529 # nullloglik -@test r2(phynetlm) ≈ 0.9716865335517596 # 1-sigma2hat / nullsigma2hat -@test adjr2(phynetlm) ≈ 0.9716865335517596 atol=1e-15 # 1 - (1 - (1-sigma2hat/nullsigma2hat))*(ntaxa-1)/(ntaxa-length(betahat)) -@test aic(phynetlm) ≈ 37.2499067206392 # -2*loglik+2*(length(betahat)+1) -@test aicc(phynetlm) ≈ 38.58324005397254 # -2*loglik+2*(length(betahat)+1)+2(length(betahat)+1)*((length(betahat)+1)+1)/(ntaxa-(length(betahat)+1)-1) -@test bic(phynetlm) ≈ 38.219720020215206 # -2*loglik+(length(betahat)+1)*log(ntaxa) -@test !hasintercept(phynetlm) - -end - -############################################################################### -#### Other Network -############################################################################### -@testset "phylolm and ancestralStateReconstruction" begin -global net -# originally: "(((Ag,(#H1:7.159::0.056,((Ak,(E:0.08,#H2:0.0::0.004):0.023):0.078,(M:0.0)#H2:::0.996):2.49):2.214):0.026,(((((Az:0.002,Ag2:0.023):2.11,As:2.027):1.697)#H1:0.0::0.944,Ap):0.187,Ar):0.723):5.943,(P,20):1.863,165);" -# followed by changes in net.edge[?].length values to make the network ultrametric -net = readTopology("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); - -#= Simulate correlated data in data frames -b0 = 1 -b1 = 10 -Random.seed!(5678) -sim = simulate(net, ParamsBM(1, 1)) -A = sim[:Tips] -B = b0 .+ b1 * A .+ simulate(net, ParamsBM(0, 0.1))[:Tips] -tipnam = sim.M.tipNames -=# -A = [2.626609842049044,0.6334773804400937,3.0577676668430476,0.8570052897626761,3.3415290038076875,2.7038939422417467,1.8694860778492748,3.354373836136418,7.436775409527188,2.6659127435884318,3.2298992674067417,-2.2323810599565013] -B = [27.60133970558981,8.228820310098914,32.42043423853238,10.249417359958978,33.52061781961048,27.008691929589997,19.11541648307886,35.38758567184537,75.04861071222199,27.68624399802581,33.03778377357321,-20.4001107607967] -tipnam = ["Ag","Ak","E","M","Az","Ag2","As","Ap","Ar","P","20","165"] - -# With Matrices -X = hcat(ones(12), A) -fit_mat = phylolm(X, B, net; reml=false) -#@show fit_mat - -# Naive version (GLS) -ntaxa = length(B) -Vy = fit_mat.Vy -Vyinv = inv(Vy) -XtVyinv = X' * Vyinv -logdetVy = logdet(Vy) -betahat = inv(XtVyinv * X) * XtVyinv * B -fittedValues = X * betahat -resids = B - fittedValues -sigma2hat = 1/ntaxa * (resids' * Vyinv * resids) -# log likelihood -loglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(sigma2hat) + logdetVy) -# null version -nullX = ones(ntaxa, 1) -nullXtVyinv = nullX' * Vyinv -nullresids = B - nullX * inv(nullXtVyinv * nullX) * nullXtVyinv * B -nullsigma2hat = 1/ntaxa * (nullresids' * Vyinv * nullresids) -nullloglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(nullsigma2hat) + logdetVy) -@test coef(fit_mat) ≈ betahat -@test nobs(fit_mat) ≈ ntaxa -@test residuals(fit_mat) ≈ resids -@test response(fit_mat) ≈ B -@test predict(fit_mat) ≈ fittedValues -@test dof_residual(fit_mat) ≈ ntaxa-length(betahat) -@test sigma2_phylo(fit_mat) ≈ sigma2hat -@test loglikelihood(fit_mat) ≈ loglik -@test vcov(fit_mat) ≈ sigma2hat*ntaxa/(ntaxa-length(betahat)).*inv(XtVyinv * X) -@test stderror(fit_mat) ≈ sqrt.(diag(sigma2hat*ntaxa/(ntaxa-length(betahat)).*inv(XtVyinv * X))) -@test dof(fit_mat) ≈ length(betahat)+1 -@test deviance(fit_mat, Val(true)) ≈ sigma2hat * ntaxa -@test nulldeviance(fit_mat) ≈ nullsigma2hat * ntaxa -@test nullloglikelihood(fit_mat) ≈ nullloglik -@test r2(fit_mat) ≈ 1-sigma2hat / nullsigma2hat atol=1e-15 -@test adjr2(fit_mat) ≈ 1 - (1 - (1-sigma2hat/nullsigma2hat))*(ntaxa-1)/(ntaxa-length(betahat)) atol=1e-15 -@test aic(fit_mat) ≈ -2*loglik+2*(length(betahat)+1) -@test aicc(fit_mat) ≈ -2*loglik+2*(length(betahat)+1)+2(length(betahat)+1)*((length(betahat)+1)+1)/(ntaxa-(length(betahat)+1)-1) -@test bic(fit_mat) ≈ -2*loglik+(length(betahat)+1)*log(ntaxa) - -## perfect user using right format and formula -dfr = DataFrame(trait=B, pred=A, tipNames=tipnam) -phynetlm = phylolm(@formula(trait ~ pred), dfr, net; reml=false) -#@show phynetlm - -@test coef(phynetlm) ≈ coef(fit_mat) -@test vcov(phynetlm) ≈ vcov(fit_mat) -@test nobs(phynetlm) ≈ nobs(fit_mat) -@test residuals(phynetlm) ≈ residuals(fit_mat) -@test response(phynetlm) ≈ response(fit_mat) -@test predict(phynetlm) ≈ predict(fit_mat) -@test dof_residual(phynetlm) ≈ dof_residual(fit_mat) -@test sigma2_phylo(phynetlm) ≈ sigma2_phylo(fit_mat) -@test stderror(phynetlm) ≈ stderror(fit_mat) -@test confint(phynetlm) ≈ confint(fit_mat) -@test loglikelihood(phynetlm) ≈ loglikelihood(fit_mat) -@test dof(phynetlm) ≈ dof(fit_mat) -@test deviance(phynetlm, Val(true)) ≈ deviance(fit_mat, Val(true)) -@test nulldeviance(phynetlm) ≈ nulldeviance(fit_mat) -@test nullloglikelihood(phynetlm) ≈ nullloglikelihood(fit_mat) -@test r2(phynetlm) ≈ r2(fit_mat) -@test adjr2(phynetlm) ≈ adjr2(fit_mat) -@test aic(phynetlm) ≈ aic(fit_mat) -@test aicc(phynetlm) ≈ aicc(fit_mat) -@test bic(phynetlm) ≈ bic(fit_mat) - -# Deprecated methods -@test (@test_logs (:warn,r"^accessing") phynetlm.model) === phynetlm -@test (@test_logs (:warn,r"^accessing") phynetlm.mf.f) == formula(phynetlm) -@test (@test_logs (:warn,r"^accessing") phynetlm.mm.m) == modelmatrix(phynetlm) - -# unordered data -dfr = dfr[[2,6,10,5,12,7,4,11,1,8,3,9], :] -fitbis = phylolm(@formula(trait ~ pred), dfr, net; reml=false) - -@test coef(phynetlm) ≈ coef(fitbis) -@test vcov(phynetlm) ≈ vcov(fitbis) -@test nobs(phynetlm) ≈ nobs(fitbis) -@test residuals(phynetlm)[fitbis.ind] ≈ residuals(fitbis) -@test response(phynetlm)[fitbis.ind] ≈ response(fitbis) -@test predict(phynetlm)[fitbis.ind] ≈ predict(fitbis) -@test dof_residual(phynetlm) ≈ dof_residual(fitbis) -@test sigma2_phylo(phynetlm) ≈ sigma2_phylo(fitbis) -@test stderror(phynetlm) ≈ stderror(fitbis) -@test confint(phynetlm) ≈ confint(fitbis) -@test loglikelihood(phynetlm) ≈ loglikelihood(fitbis) -@test dof(phynetlm) ≈ dof(fitbis) -@test deviance(phynetlm, Val(true)) ≈ deviance(fitbis, Val(true)) -@test nulldeviance(phynetlm) ≈ nulldeviance(fitbis) -@test nullloglikelihood(phynetlm) ≈ nullloglikelihood(fitbis) -@test r2(phynetlm) ≈ r2(fitbis) -@test adjr2(phynetlm) ≈ adjr2(fitbis) -@test aic(phynetlm) ≈ aic(fitbis) -@test aicc(phynetlm) ≈ aicc(fitbis) -@test bic(phynetlm) ≈ bic(fitbis) -@test mu_phylo(phynetlm) ≈ mu_phylo(fitbis) - -# unnamed ordered data -dfr = DataFrame(trait = B, pred = A) -fitter = (@test_logs (:info, r"^As requested \(no_names=true\)") match_mode=:any phylolm(@formula(trait ~ pred), dfr, net, no_names=true, reml=false)) - -@test coef(phynetlm) ≈ coef(fitter) -@test vcov(phynetlm) ≈ vcov(fitter) -@test nobs(phynetlm) ≈ nobs(fitter) -@test residuals(phynetlm) ≈ residuals(fitter) -@test response(phynetlm) ≈ response(fitter) -@test predict(phynetlm) ≈ predict(fitter) -@test dof_residual(phynetlm) ≈ dof_residual(fitter) -@test sigma2_phylo(phynetlm) ≈ sigma2_phylo(fitter) -@test stderror(phynetlm) ≈ stderror(fitter) -@test confint(phynetlm) ≈ confint(fitter) -@test loglikelihood(phynetlm) ≈ loglikelihood(fitter) -@test dof(phynetlm) ≈ dof(fitter) -@test deviance(phynetlm, Val(true)) ≈ deviance(fitter, Val(true)) -@test nulldeviance(phynetlm) ≈ nulldeviance(fitter) -@test nullloglikelihood(phynetlm) ≈ nullloglikelihood(fitter) -@test r2(phynetlm) ≈ r2(fitter) -@test adjr2(phynetlm) ≈ adjr2(fitter) -@test aic(phynetlm) ≈ aic(fitter) -@test aicc(phynetlm) ≈ aicc(fitter) -@test bic(phynetlm) ≈ bic(fitter) - -# unnamed un-ordered data -dfr = dfr[[9,6,5,10,1,11,12,7,2,3,8,4], :] -@test_throws ErrorException phylolm(@formula(trait ~ pred), dfr, net) # Wrong pred - -### Add NAs -dfr = DataFrame(trait=B, pred=A, tipNames=tipnam) -allowmissing!(dfr, :pred) -dfr[[2, 8, 11], :pred] .= missing -fitna = phylolm(@formula(trait ~ pred), dfr, net) -#@show fitna - -dfr = dfr[[8,2,3,4,6,10,9,1,11,12,7,5], :] -fitnabis = phylolm(@formula(trait ~ pred), dfr, net) -@test coef(fitna) ≈ coef(fitnabis) -@test vcov(fitna) ≈ vcov(fitnabis) -@test nobs(fitna) ≈ nobs(fitnabis) -@test sort(residuals(fitna)) ≈ sort(residuals(fitnabis)) -@test sort(response(fitna)) ≈ sort(response(fitnabis)) -@test sort(predict(fitna)) ≈ sort(predict(fitnabis)) -@test dof_residual(fitna) ≈ dof_residual(fitnabis) -@test sigma2_phylo(fitna) ≈ sigma2_phylo(fitnabis) -@test stderror(fitna) ≈ stderror(fitnabis) -@test confint(fitna) ≈ confint(fitnabis) -@test loglikelihood(fitna) ≈ loglikelihood(fitnabis) -@test dof(fitna) ≈ dof(fitnabis) -@test deviance(fitna, Val(true)) ≈ deviance(fitnabis, Val(true)) -@test nulldeviance(fitna) ≈ nulldeviance(fitnabis) -@test (@test_logs (:warn, r"^ML") nullloglikelihood(fitna)) ≈ (@test_logs (:warn, r"^ML") nullloglikelihood(fitnabis)) -@test r2(fitna) ≈ r2(fitnabis) -@test adjr2(fitna) ≈ adjr2(fitnabis) -@test aic(fitna) ≈ aic(fitnabis) -@test aicc(fitna) ≈ aicc(fitnabis) -@test bic(fitna) ≈ bic(fitnabis) - -## Tests against fixed values parameters -fitlam = phylolm(@formula(trait ~ pred), dfr, net, model="lambda", fixedValue=1.0) -#@show fitlam - -@test lambda_estim(fitlam) ≈ 1.0 -@test coef(fitlam) ≈ coef(fitnabis) -@test vcov(fitlam) ≈ vcov(fitnabis) -@test nobs(fitlam) ≈ nobs(fitnabis) -@test residuals(fitlam) ≈ residuals(fitnabis) -@test response(fitlam) ≈ response(fitnabis) -@test predict(fitlam) ≈ predict(fitnabis) -@test dof_residual(fitlam) ≈ dof_residual(fitnabis) -@test sigma2_phylo(fitlam) ≈ sigma2_phylo(fitnabis) -@test stderror(fitlam) ≈ stderror(fitnabis) -@test confint(fitlam) ≈ confint(fitnabis) -@test loglikelihood(fitlam) ≈ loglikelihood(fitnabis) -@test dof(fitlam) ≈ dof(fitnabis) + 1 -@test deviance(fitlam, Val(true)) ≈ deviance(fitnabis, Val(true)) -@test nulldeviance(fitlam) ≈ nulldeviance(fitnabis) -@test (@test_logs (:warn, r"^ML") nullloglikelihood(fitlam)) ≈ (@test_logs (:warn, r"^ML") nullloglikelihood(fitnabis)) -@test r2(fitlam) ≈ r2(fitnabis) atol=1e-15 -@test adjr2(fitlam)-1 ≈ (adjr2(fitnabis)-1)*(nobs(fitnabis)-dof(fitnabis)+1)/(nobs(fitnabis)-dof(fitlam)+1) atol=1e-15 -@test aic(fitlam) ≈ aic(fitnabis) + 2 -#@test aicc(fitlam) ≈ aicc(fitnabis) -@test bic(fitlam) ≈ bic(fitnabis) + log(nobs(fitnabis)) -@test mu_phylo(fitlam) ≈ mu_phylo(fitnabis) - -fitSH = phylolm(@formula(trait ~ pred), dfr, net, model="scalingHybrid", fixedValue=1.0) -@test loglikelihood(fitlam) ≈ loglikelihood(fitSH) -@test aic(fitlam) ≈ aic(fitSH) - -## Pagel's Lambda -fitlam = (@test_logs (:info, r"^Maximum lambda value") match_mode=:any phylolm(@formula(trait ~ pred), dfr, net, model="lambda", reml=false)) -#@show fitlam -@test lambda_estim(fitlam) ≈ 1.1135518305 atol=1e-6 - -## scaling Hybrid -fitSH = phylolm(@formula(trait ~ pred), dfr, net, model="scalingHybrid", reml=false) -@test_logs show(devnull, fitSH) -@test lambda_estim(fitSH) ≈ -52.81305448333567 atol=1e-6 - -### Ancestral State Reconstruction -params = ParamsBM(3, 1) -# sim = simulate(net, params); Y = sim[:Tips]; tipnam=tipLabels(sim) -Y = [7.49814057852738,7.713232061975018,7.4314117011628795,0.9850885689559203,4.970152778471174,5.384066549416034,4.326644522544125,0.6079385242666691,4.084254785718834,5.501648315448596,3.8732700346136597,4.790127215808698] -tipnam = ["Ag","Ak","E","M","Az","Ag2","As","Ap","Ar","P","20","165"] -# From known parameters -ancestral_traits = ancestralStateReconstruction(net, Y, params) -# BLUP -dfr = DataFrame(trait=Y, tipNames=tipnam) -phynetlm = phylolm(@formula(trait~1), dfr, net) -# prediction intervals larger with reml=true than with reml=false -blup = (@test_logs (:warn, r"^These prediction intervals show uncertainty in ancestral values") ancestralStateReconstruction(phynetlm)); -# plot(net, blup) -@test_logs show(devnull, blup) - -# BLUP same, using the function directly -blup_bis = (@test_logs (:warn, r"^These prediction intervals show uncertainty in ancestral values") match_mode=:any ancestralStateReconstruction(dfr, net)); - -@test expectations(blup)[!,:condExpectation] ≈ expectations(blup_bis)[!,:condExpectation] -@test expectations(blup)[!,:nodeNumber] ≈ expectations(blup_bis)[!,:nodeNumber] -@test blup.traits_tips ≈ blup_bis.traits_tips -@test blup.TipNumbers ≈ blup_bis.TipNumbers -@test predint(blup) ≈ predint(blup_bis) -@test predintPlot(blup)[!,:PredInt] == predintPlot(blup_bis)[!,:PredInt] -@test predintPlot(blup, withExp=true)[!,:PredInt] == predintPlot(blup_bis, withExp=true)[!,:PredInt] -@test expectationsPlot(blup)[!,:PredInt] == expectationsPlot(blup_bis)[!,:PredInt] - -dfr = DataFrame(trait=Y, tipNames=tipnam, reg=Y) -@test_throws ErrorException ancestralStateReconstruction(dfr, net) # cannot handle a predictor - -# Unordered -dfr2 = dfr[[5,4,9,2,6,12,8,11,7,1,3,10], :] -phynetlm = phylolm(@formula(trait~1), dfr2, net) -blup2 = (@test_logs (:warn, r"^These prediction intervals show uncertainty in ancestral values") ancestralStateReconstruction(phynetlm)) - -@test expectations(blup)[1:length(blup.NodeNumbers),:condExpectation] ≈ expectations(blup2)[1:length(blup.NodeNumbers),:condExpectation] -@test blup.traits_tips[phynetlm.ind] ≈ blup2.traits_tips -@test blup.TipNumbers[phynetlm.ind] ≈ blup2.TipNumbers -@test predint(blup)[1:length(blup.NodeNumbers), :] ≈ predint(blup2)[1:length(blup.NodeNumbers), :] - -# With unknown tips -allowmissing!(dfr, :trait) -dfr[[2, 4], :trait] .= missing -phynetlm = phylolm(@formula(trait~1), dfr, net) -blup = (@test_logs (:warn, r"^These prediction intervals show uncertainty in ancestral values") ancestralStateReconstruction(phynetlm)) -# plot(net, blup) - -# Unordered -dfr2 = dfr[[1, 2, 5, 3, 4, 6, 7, 8, 9, 10, 11, 12], :] -phynetlm = phylolm(@formula(trait~1), dfr, net) -blup2 = (@test_logs (:warn, r"^These prediction intervals show uncertainty in ancestral values") ancestralStateReconstruction(phynetlm)) - -@test expectations(blup)[!,:condExpectation] ≈ expectations(blup2)[!,:condExpectation] -@test predint(blup) ≈ predint(blup2) -@test predintPlot(blup)[!,:PredInt] == predintPlot(blup2)[!,:PredInt] -@test predintPlot(blup, withExp=true)[!,:PredInt] == predintPlot(blup2, withExp=true)[!,:PredInt] - -# Test mark on missing -ee = expectationsPlot(blup) -predMiss = ee[indexin([n.number for n in net.leaf][[2,4]], ee[!,:nodeNumber]),:PredInt] -for pp = predMiss - @test pp[end] == '*' -end - -end - -################# -## Data with no phylogenetic signal -################# -@testset "lambda when no signal" begin -global net -net = readTopology("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); - -#= Simulate correlated data in data frames -b0 = 1 -b1 = 10 -Random.seed!(5678); -A = randn(size(tipLabels(net), 1)) -B = b0 .+ (b1 .* A + randn(size(tipLabels(net), 1))) -=# -A = [-1.2217252038914663, 0.8431411538631137, 0.3847679754817904, 0.10277471357263539, 1.0944221266744778, 2.053347250198844, 1.4708882134841876, 1.1056475371071361, -0.94952153892202, -0.3477162381565148, -0.2742415177451819, 0.25034046948064764] -B = [-9.849415384443805, 10.765309004952346, 4.8269904926118565, 1.7279441642635127, 11.535570136728504, 20.16670120778599, 13.971404727143286, 13.019084912634444, -8.278125099304921, -4.784290010378141, -2.537139017477904, 2.9460706727827755] -dfr = DataFrame(trait = B, pred = A, tipNames = tipLabels(net)) - -## Network -phynetlm = (@test_logs (:info, r"^Maximum lambda value") match_mode=:any phylolm(@formula(trait ~ pred), dfr, net, model="lambda", reml=false)) -@test lambda_estim(phynetlm) ≈ 0.5894200143 atol=1e-8 -# using REML -phynetlm = (@test_logs (:info, r"^Max") phylolm(@formula(trait ~ pred), dfr, net, model="lambda")) -@test lambda_estim(phynetlm) ≈ 0.8356905283 atol=1e-8 - -## Major Tree -global tree -tree = majorTree(net) -phynetlm = (@test_logs (:info, r"^Maximum lambda value") match_mode=:any phylolm(@formula(trait ~ pred), dfr, tree, model="lambda", reml=false)) - -@test lambda_estim(phynetlm) ≈ 0.5903394415 atol=1e-6 - -## scaling Hybrid -lmtree = phylolm(@formula(trait ~ pred), dfr, tree, model = "BM") -lmnet = phylolm(@formula(trait ~ pred), dfr, net, model = "BM") -lmSHzero = phylolm(@formula(trait ~ pred), dfr, net, model = "scalingHybrid", fixedValue = 0.0) -lmSHone = phylolm(@formula(trait ~ pred), dfr, net, model = "scalingHybrid", fixedValue = 1.0) - -@test loglikelihood(lmtree) ≈ loglikelihood(lmSHzero) -@test loglikelihood(lmnet) ≈ loglikelihood(lmSHone) - -lmSH = phylolm(@formula(trait ~ pred), dfr, net, model="scalingHybrid", reml=false) -@test lambda_estim(lmSH) ≈ 23.46668204551696 atol=1e-5 -lmSH = phylolm(@formula(trait ~ pred), dfr, net, model="scalingHybrid") -@test lambda_estim(lmSH) ≈ 24.61373831478016 atol=1e-5 -# λ so large?? largest γ = 0.056, so λγ = 1.34 is > 1... -end - -############################################################################### -### Undefined branch lengths -############################################################################### -@testset "Undefined branch length" begin - ## No branch length - net = readTopology("(A:2.5,((B,#H1:1::0.1):1,(C:1,(D:1)#H1:1::0.9):1):0.5);"); - dfr = DataFrame(trait = [11.6,8.1,10.3,9.1], tipNames = ["A","B","C","D"]); - @test_throws ErrorException("""Branch(es) number 2 have no length. - The variance-covariance matrix of the network is not defined. - A phylogenetic regression cannot be done.""") phylolm(@formula(trait ~ 1), dfr, net); - ## Negative branch length - net.edge[2].length = -0.5; - @test_throws ErrorException("""Branch(es) number 2 have negative length. - The variance-covariance matrix of the network is not defined. - A phylogenetic regression cannot be done.""") phylolm(@formula(trait ~ 1), dfr, net); - ## Zero branch length: allowed - net.edge[2].length = 0.0; - fit = phylolm(@formula(trait ~ 1), dfr, net); - @test loglikelihood(fit) ≈ -6.245746681512051 - net.edge[2].length = 0.1; # back to non-zero - ## Illicit zero length for 1st edge: from root to single "outgroup" taxon - net.edge[1].length = 0.0; - @test_throws PosDefException phylolm(@formula(trait ~ 1), dfr, net); -end - -############################ -## Against no regressor -########################### -#= fixit: passes with GML up to v1.3, fails with GLM v1.4. `lm()` has by default -# `allowrankdeficient=false` in v1.3, but `dropcollinear=true` in v1.4 -# We would need `dropcollinear=false` in this test. fixit later: pass kwargs... ? -# no predictors, so REML = ML in this case -@testset "phylolm with no regressor" begin -global net -net = readTopology("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); - -params = ParamsBM(10, 1) -Random.seed!(2468) # sets the seed for reproducibility, to debug potential error -sim = simulate(net, params) -Y = sim[:Tips] -phynetlm = phylolm(zeros(length(Y),0), Y, net) -#@show phynetlm -# Naive version (GLS) -ntaxa = length(Y) -Vy = phynetlm.Vy -Vyinv = inv(Vy) -logdetVy = logdet(Vy) -fittedValues = zeros(length(Y)) -resids = Y - fittedValues -sigma2hat = 1/ntaxa * (resids' * Vyinv * resids) -# log likelihood -loglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(sigma2hat) + logdetVy) -# null version -nullX = ones(ntaxa, 1) -nullXtVyinv = nullX' * Vyinv -nullresids = Y - nullX * inv(nullXtVyinv * nullX) * nullXtVyinv * Y -nullsigma2hat = 1/ntaxa * (nullresids' * Vyinv * nullresids) -nullloglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(nullsigma2hat) + logdetVy) - -@test nobs(phynetlm) ≈ ntaxa -@test residuals(phynetlm) ≈ resids -@test response(phynetlm) ≈ Y -@test predict(phynetlm) ≈ fittedValues -@test dof_residual(phynetlm) ≈ ntaxa -@test sigma2_phylo(phynetlm) ≈ sigma2hat -@test loglikelihood(phynetlm) ≈ loglik -@test deviance(phynetlm, Val(true)) ≈ sigma2hat * ntaxa -@test nulldeviance(phynetlm) ≈ nullsigma2hat * ntaxa -@test nullloglikelihood(phynetlm) ≈ nullloglik -@test r2(phynetlm) ≈ 1-sigma2hat / nullsigma2hat atol=1e-14 -@test adjr2(phynetlm) ≈ 1 - (1 - (1-sigma2hat/nullsigma2hat))*(ntaxa-1)/(ntaxa) atol=1e-14 -@test aic(phynetlm) ≈ -2*loglik+2*(1) -@test aicc(phynetlm) ≈ -2*loglik+2*(1)+2(1)*((1)+1)/(ntaxa-(1)-1) -@test bic(phynetlm) ≈ -2*loglik+(1)*log(ntaxa) - -# with data frames -dfr = DataFrame(trait = Y, tipNames = sim.M.tipNames) -fitbis = phylolm(@formula(trait ~ -1), dfr, net) -@test_logs show(devnull, fitbis) -#@test coef(phynetlm) ≈ coef(fitbis) -#@test vcov(phynetlm) ≈ vcov(fitbis) -@test nobs(phynetlm) ≈ nobs(fitbis) -@test residuals(phynetlm)[fitbis.ind] ≈ residuals(fitbis) -@test response(phynetlm)[fitbis.ind] ≈ response(fitbis) -@test predict(phynetlm)[fitbis.ind] ≈ predict(fitbis) -@test dof_residual(phynetlm) ≈ dof_residual(fitbis) -@test sigma2_phylo(phynetlm) ≈ sigma2_phylo(fitbis) -#@test stderror(phynetlm) ≈ stderror(fitbis) -#@test confint(phynetlm) ≈ confint(fitbis) -@test loglikelihood(phynetlm) ≈ loglikelihood(fitbis) -#@test dof(phynetlm) ≈ dof(fitbis) -@test deviance(phynetlm, Val(true)) ≈ deviance(fitbis, Val(true)) -@test nulldeviance(phynetlm) ≈ nulldeviance(fitbis) -@test nullloglikelihood(phynetlm) ≈ nullloglikelihood(fitbis) -@test r2(phynetlm) ≈ r2(fitbis) atol=1e-15 -@test adjr2(phynetlm) ≈ adjr2(fitbis) atol=1e-15 -@test aic(phynetlm) ≈ aic(fitbis) -@test aicc(phynetlm) ≈ aicc(fitbis) -@test bic(phynetlm) ≈ bic(fitbis) -#@test mu_phylo(phynetlm) mu_phylo(fitbis) -end -=# diff --git a/test/test_lm_tree.jl b/test/test_lm_tree.jl deleted file mode 100644 index 1ea1d54c4..000000000 --- a/test/test_lm_tree.jl +++ /dev/null @@ -1,502 +0,0 @@ -# Test of phylolm on trees - -############################################################################### -## Caudata dataset - shared paths matrix -############################################################################### -@testset "phylolm: Caudata Dataset" begin -## Export "caudata" dataset (from geiger) -phy = readTopology(joinpath(@__DIR__, "..", "examples", "caudata_tree.txt")); - -V = sharedPathMatrix(phy); -VR = DataFrame(CSV.File(joinpath(@__DIR__,"..","examples","caudata_shared_paths.txt")); copycols=false) -VR = Matrix(VR); - -# Tips -@test V[:Tips] ≈ VR[1:197, 1:197] - -# Internal nodes -intnodes_in_VR = -V.internalNodeNumbers .+ 196 -@test V[:InternalNodes] ≈ VR[intnodes_in_VR, intnodes_in_VR] -# tips in rows, internal nodes in columns -@test V[:TipsNodes] ≈ VR[1:197, intnodes_in_VR] - -### R Code to get those results -# library(geiger) -# ## Load data caudata (salamanders) -# data("caudata") -# ## Save tree -# write.tree(caudata$phy, file = "caudata_tree.txt", append = FALSE, -# digits = 10, tree.names = FALSE) -# -# ## Times shared -# V <- node.depth.edgelength(caudata$phy) -# prac <- mrca(caudata$phy, full = TRUE) -# V <- matrix(V[prac], dim(prac)) -# write.table(V, -# file = "caudata_shared_paths.txt", -# sep = ",", row.names = FALSE, -# col.names = TRUE) - -############################################################################### -## Caudata dataset - BM -############################################################################### - -## Export "caudata" dataset (from geiger) -phy = readTopology(joinpath(@__DIR__, "..", "examples", "caudata_tree.txt")); -dat = DataFrame(CSV.File(joinpath(@__DIR__,"..","examples","caudata_trait.txt")); copycols=false); - -## Fit a BM -fitBM = phylolm(@formula(trait ~ 1), dat, phy; reml=false) - -# Tests against results obtained with geiger::fitContinuous or phylolm::phylolm -@test loglikelihood(fitBM) ≈ -78.9611507833 atol=1e-10 -@test dof(fitBM) ≈ 2.0 atol=1e-10 -@test aic(fitBM) ≈ 161.9223015666 atol=1e-10 -@test aicc(fitBM) ≈ 161.9841572367 atol=1e-10 -@test coef(fitBM) ≈ [4.6789989001] atol=1e-8 -@test vcov(fitBM) ≈ [0.1093144100] atol=1e-10 -@test nobs(fitBM) ≈ 197.0 atol=1e-10 -@test sum(residuals(fitBM)) ≈ -115.5767321312 atol=1e-8 -@test dof_residual(fitBM) ≈ 196.0 atol=1e-10 -@test sigma2_phylo(fitBM) ≈ 0.0029452097 atol=1e-10 -@test stderror(fitBM) ≈ [0.3306272978] atol=1e-10 -@test confint(fitBM)[1] ≈ 4.0269551772 atol=1e-10 -@test confint(fitBM)[2] ≈ 5.3310426231 atol=1e-10 -@test predict(fitBM) ≈ [4.6789989001 for i in 1:197] atol=1e-8 - -### Ancestral state reconstruction (with Rphylopars) -anc = (@test_logs (:warn, r"^These prediction intervals show uncertainty in ancestral values") ancestralStateReconstruction(fitBM)); -ancR = DataFrame(CSV.File(joinpath(@__DIR__,"..","examples","caudata_Rphylopars.txt")); copycols=false) - -## Expectations -expe = expectations(anc) -expeR = ancR[!,:trait] -# Matching tips ? -tipsR = expeR[expe[197:393, :nodeNumber]] -tipsJulia = expe[197:393, :condExpectation] -@test tipsR ≈ tipsJulia -# Matching nodes ? -nodesR = expeR[-expe[1:196, :nodeNumber] .+ 196] -nodesJulia = expe[1:196, :condExpectation] -# below: print for when the test was broken -#@show nodesR[1:6], nodesR[190:end] -#@show nodesJulia[1:6],nodesJulia[190:end] -@test isapprox(nodesR, nodesJulia) - -## Variances -vars = diag(anc.variances_nodes) -# Rphylopars -varsR = ancR[!,:var] -# Matching nodes ? -nodesR = varsR[-expe[1:196, :nodeNumber] .+ 196] -@test nodesR ≈ vars atol=1e-3 ## RK: Small tol !! - -### Ancestral state reconstruction (with Phytools) -ancRt = DataFrame(CSV.File(joinpath(@__DIR__,"..","examples","caudata_Phytools.txt")); copycols=false); - -## Expectations -expe = expectations(anc) -expeRt = ancRt[!,:trait] -# Matching nodes ? -nodesRt = expeRt[-expe[1:196, :nodeNumber] .+ (196 - 197)] -nodesJulia = expe[1:196, :condExpectation] -# below: print for when the test was broken -#@show nodesRt[1:6], nodesRt[190:end] -#@show nodesJulia[1:6],nodesJulia[190:end] -@test isapprox(nodesRt, nodesJulia) - -## Variances -vars = diag(anc.variances_nodes) -# Rphylopars -varsRt = ancRt[!,:var] -# Matching nodes ? -nodesRt = varsRt[-expe[1:196, :nodeNumber] .+ (196 - 197)] -@test nodesRt ≈ vars atol=2e-3 ## RK: Small tol !! - -### Comparison between Rphylopars and Phytools: -@test nodesRt ≈ nodesR atol=0.003 ## RK: Small tol !! - -### R script to get the above values: -# library(geiger) -# -# ## Load data caudata (salamanders) -# data("caudata") -# -# ## Save tree and data -# write.tree(caudata$phy, file = "caudata_tree.txt", append = FALSE, -# digits = 10, tree.names = FALSE) -# -# write.table(data.frame(tipsNames = names(caudata$dat), -# trait = unname(caudata$dat)), -# file = "caudata_trait.txt", -# sep = ",", row.names = FALSE) -# -# ## Fit using Geiger -# fitgeiger <- fitContinuous(caudata$phy, caudata$dat, model = "BM") -# -# ## Fit using phylolm -# library(phylolm) -# fitphylolm <- phylolm(trait ~ 1, -# data.frame(trait = caudata$dat), -# caudata$phy, model = "BM") -# -# ## Fit using Rphylopars -# library(Rphylopars) -# fitphylopars <- phylopars(data.frame(species = names(caudata$dat), -# trait = unname(caudata$dat)), -# caudata$phy, -# pheno_error = FALSE, -# pheno_correlated = FALSE, -# REML = FALSE) -# -# # Save results of Rphylopars for ancestral trait reconstruction -# write.table(data.frame(trait = unname(fitphylopars$anc_recon), -# var = unname(fitphylopars$anc_var)), -# file = "caudata_Rphylopars.txt", -# sep = ",", row.names = FALSE) -# -# ## Ancestral State reconstruction using phytools -# library(phytools) -# fitphytools <- fastAnc(caudata$phy, caudata$dat, vars = TRUE) -# -# # Save results of Rphylopars for ancestral trait reconstruction -# write.table(data.frame(trait = unname(fitphytools$ace), -# var = unname(fitphytools$var)), -# file = "caudata_Phytools.txt", -# sep = ",", row.names = FALSE) -# -# ## Quantities to compare -# sprintf("%.10f", fitgeiger$opt$ln) # log likelihood -# sprintf("%.10f", fitphylolm$logLik) -# sprintf("%.10f", fitphylopars$logLik) -# sprintf("%.10f", fitgeiger$opt$aic) # aic -# sprintf("%.10f", fitphylolm$aic) -# sprintf("%.10f", fitgeiger$opt$aicc) # aicc -# sprintf("%.10f", fitphylolm$coefficients) # coef -# sprintf("%.10f", fitgeiger$opt$z0) -# sprintf("%.10f", fitphylopars$mu) -# sprintf("%.10f", fitphylolm$vcov) # vcov -# sprintf("%.10f", fitphylolm$n) # nobs -# sprintf("%.10f", sum(fitphylolm$residuals)) # residuals (sum) -# sprintf("%.10f", fitphylolm$n - fitphylolm$d) # df residuals -# sprintf("%.10f", fitphylolm$sigma2) # sigma 2 -# sprintf("%.10f", fitgeiger$opt$sigsq) -# sprintf("%.10f", fitphylopars$pars$phylocov) -# sprintf("%.10f", summary(fitphylolm)$coefficients[2]) # std error -# sprintf("%.10f", summary(fitphylolm)$df) # df -# sprintf("%.10f", fitgeiger$opt$k) -# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[2] * qt(0.025, 196)) -# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[2] * qt(0.975, 196)) -# sprintf("%.10f", predict(fitphylolm)) # df - -############################################################################### -## Caudata dataset - Pagel's lambda -############################################################################### - -## Fit Pagel's lambda -fitLambda = (@test_logs (:info, r"^Maximum lambda value") match_mode=:any phylolm(@formula(trait ~ 1), dat, phy, model = "lambda", reml=false)); - -@test lambda_estim(fitLambda) ≈ 0.9193 atol=1e-4 # Due to convergence issues, tolerance is lower. -@test loglikelihood(fitLambda) ≈ -51.684379 atol=1e-6 -@test dof(fitLambda) ≈ 3.0 atol=1e-10 -@test aic(fitLambda) ≈ 109.368759 atol=1e-6 -@test aicc(fitLambda) ≈ 109.493111 atol=1e-6 -@test coef(fitLambda) ≈ [4.66893] atol=1e-5 -@test vcov(fitLambda) ≈ [0.05111] atol=1e-5 -@test nobs(fitLambda) ≈ 197.0 atol=1e-10 -# below: print for when the test was broken -#@show sum(residuals(fitLambda)) # locally: -115.91591040367894 -#println("is this -113.594?") -@test isapprox(sum(residuals(fitLambda)), -113.594, atol=1e-2) ## Low Tolerance !! -@test dof_residual(fitLambda) ≈ 196.0 atol=1e-10 ## Correct Definition ? -@test sigma2_phylo(fitLambda) ≈ 0.0014756 atol=1e-7 -@test stderror(fitLambda) ≈ [0.22608] atol=1e-5 -@test confint(fitLambda)[1] ≈ 4.2230 atol=1e-4 -@test confint(fitLambda)[2] ≈ 5.114 atol=1e-3 -tmp = predict(fitLambda); -# below: print for when the test was broken -#@show length(tmp) -#@show tmp[1:6], tmp[190:end] # all 4.66893 except for last 5: 8.42676, 8.44585, etc. -#println("are they all 4.66893?") -# next: looks random. sometimes passes, most times fails -@test predict(fitLambda) ≈ [4.66893 for i in 1:197] atol=1e-5 norm=x->norm(x,Inf) - -### R script to get the above values: -# library(geiger) -# -# ## Load data caudata (salamanders) -# data("caudata") -# -# ## Fit using Geiger -# fitgeiger <- fitContinuous(caudata$phy, caudata$dat, model = "lambda") -# -# ## Fit using phylolm -# library(phylolm) -# fitphylolm <- phylolm(trait ~ 1, -# data.frame(trait = caudata$dat), -# caudata$phy, model = "lambda", -# starting.value = 0.9) -# -# ## Fit using Rphylopars -# library(Rphylopars) -# fitphylopars <- phylopars(data.frame(species = names(caudata$dat), -# trait = unname(caudata$dat)), -# caudata$phy, -# model = "lambda", -# model_par_start = 0.9, -# pheno_error = FALSE, -# pheno_correlated = FALSE, -# REML = FALSE) -# -# ## Quantities to compare -# sprintf("%.10f", fitgeiger$opt$ln) # log likelihood -# sprintf("%.10f", fitphylolm$logLik) -# sprintf("%.10f", fitphylopars$logLik) -# sprintf("%.10f", fitgeiger$opt$aic) # aic -# sprintf("%.10f", fitphylolm$aic) -# sprintf("%.10f", fitgeiger$opt$aicc) # aicc -# sprintf("%.10f", fitphylolm$coefficients) # coef -# sprintf("%.10f", fitgeiger$opt$z0) -# sprintf("%.10f", fitphylopars$mu) -# sprintf("%.10f", fitphylolm$vcov) # vcov -# sprintf("%.10f", fitphylolm$n) # nobs -# sprintf("%.10f", sum(fitphylolm$residuals)) # residuals (sum) -# sprintf("%.10f", fitphylolm$n - fitphylolm$d) # df residuals -# sprintf("%.10f", fitphylolm$sigma2) # sigma 2 -# sprintf("%.10f", fitgeiger$opt$sigsq) -# sprintf("%.10f", fitphylopars$pars$phylocov) -# sprintf("%.10f", summary(fitphylolm)$coefficients[2]) # std error -# sprintf("%.10f", summary(fitphylolm)$df) # df -# sprintf("%.10f", fitgeiger$opt$k) -# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[2] * qt(0.025, 196)) -# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[2] * qt(0.975, 196)) -# sprintf("%.10f", predict(fitphylolm)) # df - -############################################################################### -## Caudata dataset - BM with shifts -############################################################################### - -## Export "caudata" dataset (from geiger) -phy = readTopology(joinpath(@__DIR__, "..", "examples", "caudata_tree.txt")); -dat = DataFrame(CSV.File(joinpath(@__DIR__,"..","examples","caudata_trait.txt")); copycols=false); - -## Add some shifts in the model -df_shift = regressorShift(phy.edge[[98, 326, 287]], phy) -dat = innerjoin(dat, df_shift, on=:tipNames) -## Fit a BM -fitBM = phylolm(@formula(trait ~ shift_98 + shift_326 + shift_287), dat, phy; reml=false) - -# Tests against results obtained with geiger::fitContinuous or phylolm::phylolm -@test loglikelihood(fitBM) ≈ -76.1541605207 atol=1e-10 -@test dof(fitBM) ≈ 5.0 atol=1e-10 -@test aic(fitBM) ≈ 162.3083210414 atol=1e-10 -@test coef(fitBM) ≈ [4.8773804547 -0.6664678924 -1.0692950215 -0.0159349201]' atol=1e-10 -vcovR = [ 0.1165148753 -0.0431446679 -0.0305707092 0.0000000000 - -0.0431446679 0.3212796435 0.0340202694 -0.0000000000 - -0.0305707092 0.0340202694 0.2472613252 -0.0236868278 - 0.0000000000 -0.0000000000 -0.0236868278 0.1263794810] -@test vcov(fitBM) ≈ vcovR atol=1e-8 -@test nobs(fitBM) ≈ 197.0 atol=1e-10 -@test sum(residuals(fitBM)) ≈ -10.1752334428 atol=1e-10 -@test dof_residual(fitBM) ≈ 193.0 atol=1e-10 -@test sigma2_phylo(fitBM) ≈ 0.0028624636 atol=1e-10 -@test stderror(fitBM) ≈ [0.3413427535 0.5668153522 0.4972537835 0.3554989184]' atol=1e-10 -@test confint(fitBM)[:,1] ≈ [4.2041393297 -1.7844157659 -2.0500444097 -0.7170966977]' atol=1e-10 -@test confint(fitBM)[:,2] ≈ [5.5506215797 0.4514799811 -0.0885456333 0.6852268574]' atol=1e-10 -predictR = [4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547] -tmp = predict(fitBM) -tmp2 = predictR[fitBM.ind] -# below: print for when the test was broken -#@show tmp[1:6], tmp[190:end] -#@show tmp2[1:6],tmp2[190:end] # the last 5 values are different -@test isapprox(predict(fitBM), predictR[fitBM.ind], atol=1e-8) - -# ## R code to get those results -# library(geiger) -# ## Load data caudata (salamanders) -# data("caudata") -# ## Re-order with the tree -# dat <- caudata$dat[match(caudata$phy$tip.label, names(caudata$dat))] -# ## Incidence matrix -# Tm = PhylogeneticEM::incidence.matrix(caudata$phy) + 0 -# ## Fit using phylolm -# library(phylolm) -# fitphylolm <- phylolm(trait ~ shift_37 + shift_105 + shift_222, -# data.frame(trait = dat, -# shift_37 = Tm[, 37], -# shift_105 = Tm[, 105], -# shift_222 = Tm[, 222]), -# caudata$phy, model = "BM") -# ## Quantities to compare -# sprintf("%.10f", fitphylolm$logLik) -# sprintf("%.10f", fitphylolm$aic) -# sprintf("%.10f", fitphylolm$coefficients) # coef -# sprintf("%.10f", fitphylolm$vcov) # vcov -# sprintf("%.10f", fitphylolm$n) # nobs -# sprintf("%.10f", sum(fitphylolm$residuals)) # residuals (sum) -# sprintf("%.10f", fitphylolm$n - fitphylolm$d) # df residuals -# sprintf("%.10f", fitphylolm$sigma2) # sigma 2 -# sprintf("%.10f", summary(fitphylolm)$coefficients[,2]) # std error -# sprintf("%.10f", summary(fitphylolm)$df) # df -# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[,2] * qt(0.025, 193)) -# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[,2] * qt(0.975, 193)) -# sprintf("%.10f", predict(fitphylolm)) - -end - -############################################################################### -## Lizard dataset - BM -############################################################################### - -@testset "phylolm: Lizard Dataset" begin - -## Export "lizard" dataset (Mahler et al 2013) -phy = readTopology(joinpath(@__DIR__, "..", "examples", "lizard_tree.txt")); -dat = DataFrame(CSV.File(joinpath(@__DIR__,"..","examples","lizard_trait.txt")); copycols=false); -dat[!,:region] = string.(dat[:,:region]) # avoid CategoricalArrays.categorical dependency - -## Fit a BM -fitBM = phylolm(@formula(AVG_SVL ~ AVG_ltoe_IV + AVG_lfing_IV * region), dat, phy; reml=false) - -# Tests against results obtained with geiger::fitContinuous or phylolm::phylolm -@test loglikelihood(fitBM) ≈ 105.17337853473711 atol=1e-10 -@test dof(fitBM) ≈ 10.0 atol=1e-10 -@test aic(fitBM) ≈ -190.3467570695 atol=1e-10 -# @test aicc(fitBM) -@test coef(fitBM) ≈ [2.7925712673 -0.2010704391 0.9832555589 -0.1021226296 -0.3703658712 0.1557471731 0.0374549036 0.1805667675 -0.0495767233]' atol=1e-10 -vcovR = [0.0200086273 -0.0136717540 0.0084815090 -0.0093192029 -0.0114417825 -0.0113346813 0.0041102304 0.0053787287 0.0050521693 - -0.0136717540 0.0185396965 -0.0169114682 0.0020645005 0.0036352899 0.0026227856 -0.0012281620 -0.0018838231 -0.0014800242 - 0.0084815090 -0.0169114682 0.0174647413 0.0016403871 0.0005624488 0.0015003301 -0.0005714235 -0.0003201257 -0.0005423354 - -0.0093192029 0.0020645005 0.0016403871 0.0167953394 0.0078012534 0.0086329399 -0.0080782771 -0.0037333495 -0.0039327836 - -0.0114417825 0.0036352899 0.0005624488 0.0078012534 0.0490482083 0.0092203882 -0.0033670465 -0.0191567265 -0.0040068947 - -0.0113346813 0.0026227856 0.0015003301 0.0086329399 0.0092203882 0.0331395502 -0.0037513830 -0.0041592743 -0.0146108207 - 0.0041102304 -0.0012281620 -0.0005714235 -0.0080782771 -0.0033670465 -0.0037513830 0.0045172675 0.0018165174 0.0020857846 - 0.0053787287 -0.0018838231 -0.0003201257 -0.0037333495 -0.0191567265 -0.0041592743 0.0018165174 0.0093292284 0.0020427637 - 0.0050521693 -0.0014800242 -0.0005423354 -0.0039327836 -0.0040068947 -0.0146108207 0.0020857846 0.0020427637 0.0074817942] -@test vcov(fitBM) ≈ vcovR atol=1e-8 -@test nobs(fitBM) ≈ 100.0 atol=1e-10 -# below: print for when the test was broken (with @test_skip) -#@show sum(residuals(fitBM)) # looks random, e.g. 1.6091413520064477, or 0.8338189090359597 -#println("is this equal to 0.6352899255?") # sometimes NO, yet the test passes below!! -@test sum(residuals(fitBM)) ≈ 0.6352899255 atol=1e-10 -@test dof_residual(fitBM) ≈ 91.0 atol=1e-10 -@test sigma2_phylo(fitBM) ≈ 0.0003025014 atol=1e-10 -@test stderror(fitBM) ≈ [0.1414518551,0.1361605540,0.1321542330,0.1295968341,0.2214683008,0.1820427154,0.0672106202,0.0965879311,0.0864973651] atol=1e-10 -@test confint(fitBM)[:,1] ≈ [2.5115945339,-0.4715366529,0.7207474097,-0.3595508202,-0.8102854443,-0.2058583178,-0.0960507369,-0.0112932922,-0.2213931131] atol=1e-10 norm=x->norm(x,Inf) -@test confint(fitBM)[:,2] ≈ [3.0735480006,0.0693957746,1.2457637082,0.1553055609,0.0695537019,0.5173526640,0.1709605441,0.3724268272,0.1222396666] atol=1e-10 - - -### R script to get the above values -# ## Data -# dat <- read.csv(file = "GA_Anolis_traits.csv") -# geo <- read.csv(file = "GA_Anolis_biogeography.csv") -# -# dat <- merge(dat, geo, by = "species") -# # keep only toe and hand length -# dat <- dat[, c("species", "AVG.SVL", "AVG.ltoe.IV", "AVG.lfing.IV", "region")] -# colnames(dat)[1] <- "tipsNames" -# -# write.table(dat, -# file = "lizard_trait.txt", -# sep = ",", row.names = FALSE) -# -# ## Tree -# phy <- read.tree(file = "GA_Anolis_MCC.tre") -# -# write.tree(phy, file = "lizards_tree.txt", append = FALSE, -# digits = 10, tree.names = FALSE) -# -# rownames(dat) <- dat$tipsNames -# dat <- dat[, -1] -# dat$region <- as.factor(dat$region) -# -# ## Fit -# fitphylolm <- phylolm(AVG.SVL ~ 1 + AVG.ltoe.IV + AVG.lfing.IV * region, dat, phy, model = "BM") -# ## Quantities to compare -# sprintf("%.10f", fitphylolm$logLik) -# sprintf("%.10f", summary(fitphylolm)$df) # df -# sprintf("%.10f", fitphylolm$aic) -# sprintf("%.10f", fitphylolm$coefficients) # coef -# matrix(sprintf("%.10f", fitphylolm$vcov), 9, 9) # vcov -# sprintf("%.10f", fitphylolm$n) # nobs -# sprintf("%.10f", sum(fitphylolm$residuals)) # residuals (sum) -# sprintf("%.10f", fitphylolm$n - fitphylolm$d) # df residuals -# sprintf("%.10f", fitphylolm$sigma2) # sigma 2 -# sprintf("%.10f", summary(fitphylolm)$coefficients[,2]) # std error -# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[, 2] * qt(0.025, 91)) -# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[, 2] * qt(0.975, 91)) - -############################################################################### -## Lizard dataset - lambda -############################################################################### - -## Fit lambda -fitLambda = (@test_logs (:info, r"^Maximum lambda value") match_mode=:any phylolm(@formula(AVG_SVL ~ AVG_ltoe_IV + AVG_lfing_IV * region), dat, phy, model = "lambda", reml=false)) - -# Tests against results obtained with geiger::fitContinuous or phylolm::phylolm -@test lambda_estim(fitLambda) ≈ 0.9982715594 atol=1e-5 -@test loglikelihood(fitLambda) ≈ 105.1769275564 atol=1e-8 -@test dof(fitLambda) ≈ 11.0 atol=1e-10 -@test aic(fitLambda) ≈ -188.3538551128 atol=1e-8 -# @test aicc(fitBM) -@test coef(fitLambda) ≈ [2.7940573420 -0.2066584606 0.9897083949 -0.1004840950 -0.3677991157 0.1576743022 0.0367633665 0.1792502383 -0.0505291142]' atol=1e-5 -vcovR = [0.0200251600 -0.0137474015 0.0085637021 -0.0092973836 -0.0114259722 -0.0113056243 0.0041037877 0.0053740100 0.0050429112 - -0.0137474015 0.0186885224 -0.0170645512 0.0020509207 0.0036334103 0.0026066694 -0.0012237488 -0.0018826836 -0.0014743137 - 0.0085637021 -0.0170645512 0.0176200143 0.0016494733 0.0005604169 0.0015116125 -0.0005735573 -0.0003192320 -0.0005457420 - -0.0092973836 0.0020509207 0.0016494733 0.0167461876 0.0077885115 0.0086173037 -0.0080563819 -0.0037287856 -0.0039275469 - -0.0114259722 0.0036334103 0.0005604169 0.0077885115 0.0490092393 0.0092036032 -0.0033631662 -0.0191657329 -0.0040017905 - -0.0113056243 0.0026066694 0.0015116125 0.0086173037 0.0092036032 0.0330248707 -0.0037465110 -0.0041543671 -0.0145663751 - 0.0041037877 -0.0012237488 -0.0005735573 -0.0080563819 -0.0033631662 -0.0037465110 0.0045042057 0.0018142470 0.0020823721 - 0.0053740100 -0.0018826836 -0.0003192320 -0.0037287856 -0.0191657329 -0.0041543671 0.0018142470 0.0093334212 0.0020404652 - 0.0050429112 -0.0014743137 -0.0005457420 -0.0039275469 -0.0040017905 -0.0145663751 0.0020823721 0.0020404652 0.0074600880] -@test vcov(fitLambda) ≈ vcovR atol=3e-7 -@test nobs(fitLambda) ≈ 100.0 atol=1e-10 -@test sum(residuals(fitLambda)) ≈ 0.6369008979 atol=1e-5 -@test dof_residual(fitLambda) ≈ 91.0 atol=1e-10 -@test sigma2_phylo(fitLambda) ≈ 0.0003009914 atol=1e-9 -@test stderror(fitLambda) ≈ [0.1415102824,0.1367059706,0.1327404019,0.1294070617,0.2213803048,0.1817274626,0.0671133793,0.0966096332,0.0863718011] atol=1e-6 -@test confint(fitLambda)[:,1] ≈ [2.5129645499,-0.4782080775,0.7260358930,-0.3575353260,-0.8075438955,-0.2033049779,-0.0965491169,-0.0126529301,-0.2220960868] atol=1e-5 -@test confint(fitLambda)[:,2] ≈ [3.0751501341,0.0648911562,1.2533808968,0.1565671360,0.0719456641,0.5186535822,0.1700758500,0.3711534067,0.1210378584] atol=1e-5 - - -### R script to get the above values -# ## Data -# dat <- read.csv(file = "GA_Anolis_traits.csv") -# geo <- read.csv(file = "GA_Anolis_biogeography.csv") -# -# dat <- merge(dat, geo, by = "species") -# # keep only toe and hand length -# dat <- dat[, c("species", "AVG.SVL", "AVG.ltoe.IV", "AVG.lfing.IV", "region")] -# colnames(dat)[1] <- "tipsNames" -# -# write.table(dat, -# file = "lizard_trait.txt", -# sep = ",", row.names = FALSE) -# -# ## Tree -# phy <- read.tree(file = "GA_Anolis_MCC.tre") -# -# write.tree(phy, file = "lizards_tree.txt", append = FALSE, -# digits = 10, tree.names = FALSE) -# -# rownames(dat) <- dat$tipsNames -# dat <- dat[, -1] -# dat$region <- as.factor(dat$region) -# -# ## Fit -# fitphylolm <- phylolm(AVG.SVL ~ 1 + AVG.ltoe.IV + AVG.lfing.IV * region, dat, phy, model = "lambda") -# ## Quantities to compare -# sprintf("%.10f", fitphylolm$logLik) -# sprintf("%.10f", summary(fitphylolm)$df) # df -# sprintf("%.10f", fitphylolm$aic) -# sprintf("%.10f", fitphylolm$coefficients) # coef -# matrix(sprintf("%.10f", fitphylolm$vcov), 9, 9) # vcov -# sprintf("%.10f", fitphylolm$n) # nobs -# sprintf("%.10f", sum(fitphylolm$residuals)) # residuals (sum) -# sprintf("%.10f", fitphylolm$n - fitphylolm$d) # df residuals -# sprintf("%.10f", fitphylolm$sigma2) # sigma 2 -# sprintf("%.10f", summary(fitphylolm)$coefficients[,2]) # std error -# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[, 2] * qt(0.025, 91)) -# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[, 2] * qt(0.975, 91)) - -end diff --git a/test/test_lm_withinspecies.jl b/test/test_lm_withinspecies.jl deleted file mode 100644 index 3a4aff584..000000000 --- a/test/test_lm_withinspecies.jl +++ /dev/null @@ -1,616 +0,0 @@ -## traits.jl : phylolm for within-species variation, continuous traits - -@testset "phylolm: within-species variation, star" begin - -#= simulation of data used below (test more reproducible when using fixed data) -# simulate traits at the species-level, then -# repeat identical trait values across m individuals -function simTraits(net, m, paramsprocess) - sim = simulate(net, paramsprocess) - trait = sim[:Tips] # simple vector now - return repeat(trait, inner=m) -end - -n = 4; m = 3 -starnet = readTopology(PhyloNetworks.startree_newick(n)) -Random.seed!(6591) -trait1 = simTraits(starnet, m, ParamsBM(2, 0.5)) # var: 0.5 -trait2 = simTraits(starnet, m, ParamsBM(-2, 1)) - -phylo_noise_var = 2; meas_noise_var = 1 -phylo_noise = simTraits(starnet, m, ParamsBM(0, phylo_noise_var)) -meas_noise = randn(n*m) * sqrt(meas_noise_var) -trait3 = 10 .+ 2*trait1 + phylo_noise + meas_noise -print(round.(trait1, digits=4)) # etc -labels = repeat(starnet.names, inner=m) -df = DataFrame(trait1=trait1, trait2=trait2, trait3=trait3,tipNames=labels) -=# - -n = 4; m = 3 -starnet = readTopology(PhyloNetworks.startree_newick(n)) -netnames = ["t1","t2","t3","t4"] # = tipLabels(starnet) # was generated to have length n -df = DataFrame( - species = repeat(netnames, inner=m), - trait1 = [2.8564, missing, 2.8564, 2.8457, 2.8457, 2.8457, 0.4197, 0.4197, 0.4197, 2.2359, 2.2359, 2.2359], - trait2 = [-2.0935, -2.0935, -2.0935, 0.4955, 0.4955, 0.4955, -2.1977, -2.1977, -2.1977, -2.618, -2.618, -2.618], - trait3 = [missing, 15.7869, 14.0615, 14.3547, 13.3721, 15.7062, 9.2764, 8.8553, 8.7627, 15.0298, 15.8258, 15.3248] - # missing replaced 14.0467 -) -Y = df[!,:trait3] # nm vector -X = fill(1.0, (n,2)); X[:,2] = df[1:m:n*m,:trait1] # nx2 matrix -#= reduced data: one row per species, extra columns for SD and n of trait 3 -gdf = groupby(df, :species) -df_r = combine(gdf, :trait1 => (x -> mean(skipmissing(x))) => :trait1, - :trait2 => (x -> mean(skipmissing(x))) => :trait2, - :trait3 => (x -> mean(skipmissing(x))) => :trait3, - :trait3 => (x -> std(skipmissing(x))) => :trait3_sd, - :trait3 => (x -> sum(.!ismissing.(x))) => :trait3_n) -=# -df_r = DataFrame( - species = ["t1","t2","t3","t4"], trait1 = [2.8564,2.8457,.4197,2.2359], - trait2 = [-2.0935,0.4955,-2.1977,-2.618], - trait3 = [14.0615, 14.477666666666666, 8.9648, 15.393466666666667], - # [14.9242,... if we include ind 2 - trait3_sd = [0,1.1718985891848046,.2737966581242371,.4024181076111425], - # [1.2200420402592675,... if we include ind 2 - trait3_n = [1,3,3,3]) # [2,3,3,3] - -#= star tree: R code to check -df = data.frame(species = rep(c("t1","t2","t3","t4"), each=3), - trait1 = c(2.8564,NA,2.8564,2.8457,2.8457,2.8457,.4197,.4197,.4197,2.2359,2.2359,2.2359), - trait2 = c(-2.0935,-2.0935,-2.0935,.4955,.4955,.4955,-2.1977,-2.1977,-2.1977, -2.618,-2.618,-2.618), - trait3 = c(NA,15.7869,14.0615,14.3547,13.3721,15.7062,9.2764,8.8553,8.7627,15.0298,15.8258,15.3248)) -mR = lmer(trait3 ~ trait1 + (1|species), df) -fixef(mR) # 8.457020 2.296978 -print(mR, digits=7, ranef.comp="Var") # variances: 2.1216068,0.5332865 -logLik(mR) # -13.37294 -logLik(mR, REML=FALSE) # -14.57265 -vcov(mR) # matrix(c(3.111307,-1.219935,-1.219935,0.5913808), nrow=2) -mR = lmer(trait3 ~ trait1 + (1|species), df, REML=FALSE) -fixef(mR) # 8.439909 2.318488 -print(mR, digits=7, ranef.comp="Var") # variances: 0.9470427,0.5299540 -logLik(mR) # -14.30235 -vcov(mR) # matrix(c(1.5237486,-0.6002803,-0.6002803,0.2941625), nrow=2) -=# - -#= Alternatively: Julia code to check -using MixedModels -mm1 = fit(MixedModel, @formula(trait3 ~ trait1 + (1|species)), df, REML=true) # compare with m1 -mm3 = fit(MixedModel, @formula(trait3 ~ trait1 + (1|species)), df) # compare with m3 -fixef(mm1) # fixed-effect param estimates: 8.45702,2.29698 -VarCorr(mm1) # estimated variance-components: species-variance=2.121607, residual-variance=0.533287 -# `objective(m)` returns -2 * (log-likelihood of model m) -objective(mm1)/(-2) # -13.3729434, `loglikelihood` not available for models fit by REML -loglikelihood(mm3) # -14.3023458 -vcov(mm1) # var-cov matrix for fixef coeffs: [3.11131 -1.21993; -1.21993 0.591381] -=# -m1 = phylolm(@formula(trait3 ~ trait1), df, starnet; reml=true, - tipnames=:species, withinspecies_var=true) -m2 = phylolm(@formula(trait3 ~ trait1), df_r, starnet; reml=true, - tipnames=:species, withinspecies_var=true, y_mean_std=true) -@test m1.reml && m2.reml -@test coef(m1) ≈ [8.457020,2.296978] rtol=1e-5 # fixef(mR) -@test coef(m2) ≈ [8.457020,2.296978] rtol=1e-5 -@test sigma2_phylo(m1) ≈ 2.1216068 rtol=1e-5 # print(mR, digits=7, ranef.comp="Var") -@test sigma2_phylo(m2) ≈ 2.1216068 rtol=1e-5 -@test sigma2_within(m1) ≈ 0.5332865 rtol=1e-5 -@test sigma2_within(m2) ≈ 0.5332865 rtol=1e-5 -@test loglikelihood(m1) ≈ -13.37294 rtol=1e-5 -@test loglikelihood(m2) ≈ -13.37294 rtol=1e-5 -@test vcov(m1) ≈ [3.111307 -1.219935; -1.219935 0.5913808] rtol=1e-5 -@test vcov(m2) ≈ [3.111307 -1.219935; -1.219935 0.5913808] rtol=1e-5 -m3 = phylolm(@formula(trait3 ~ trait1), df_r, starnet; reml=false, - tipnames=:species, withinspecies_var=true, y_mean_std=true) -@test !m3.reml -@test coef(m3) ≈ [8.439909,2.318488] rtol=1e-5 -@test sigma2_phylo(m3) ≈ 0.9470427 rtol=1e-5 -@test sigma2_within(m3) ≈ 0.5299540 rtol=1e-5 -@test loglikelihood(m3) ≈ -14.30235 rtol=1e-5 -@test vcov(m3) ≈ [1.5237486 -0.6002803; -0.6002803 0.2941625] rtol=1e-5 - -end - -@testset "phylolm: binary tree, no withinspecies var" begin - -#= Rcode to generate the newick string and dataset: -library(phytools) -set.seed(1) - -tree <- pbtree(n=5,scale=1) # topology and branch lengths -tree.newick <- write.tree(tree) # newick format -# tree.newick <- "((t1:0.8121974445,(t2:0.4806586387,t3:0.4806586387):0.3315388057):0.1878025555,(t4:0.1206907041,t5:0.1206907041):0.8793092959);" - -X <- fastBM(tree,sig2=2,nsim=2); colnames(X) <- c("x1","x2") # non-intercept predictors -# X <- matrix(c(-0.5503706,-0.7503593,-0.7599224,-0.4217977,-0.9839226,-1.3102488,0.4544195,0.2151272,1.0384023,1.3138847),nrow=5) -# colnames(X) <- c("x1","x2"); rownames(X) <- c("t1","t2","t3","t4","t5") - -bsperr <- fastBM(tree) # phylogenetic variation, true BM variance-rate is 1 -y <- cbind(rep(1,5),X)%*%(1:3)+bsperr # response, true beta vector is c(1,2,3) -# y <- matrix(c(-4.1836578,0.6258014,-0.3070109,2.6120026,2.2391044),nrow=5) -# rownames(y) <- c("t1","t2","t3","t4","t5") - -df <- data.frame(y,X,species=tree$tip.label) -=# -net = readTopology("((t1:0.8121974445,(t2:0.4806586387,t3:0.4806586387):0.3315388057):0.1878025555,(t4:0.1206907041,t5:0.1206907041):0.8793092959);") -df = DataFrame( - y = [-4.18366,0.625801,-0.307011,2.612,2.2391], - x1 = [-0.550371,-0.750359,-0.759922,-0.421798,-0.983923], - x2 = [-1.31025,0.45442,0.215127,1.0384,1.31388], - species = net.names # ["t1","t2","t3","t4","t5"] -) - -#= Rcode to check model fit: -library(nlme) -m1 <- gls(y~x1+x2,data=df, - correlation=corBrownian(1,tree,form=~species),method="REML") -coef(m1) # coefficients estimates: c(0.6469652,2.0420889,2.8285257) -sigma(m1)^2 # reml BM variance-rate estimate: 0.0438973 -logLik(m1) # restricted log-likelihood: -0.07529961 -vcov(m1) # cov mat for coef estimates -# matrix(c(0.030948901,0.024782246,0.003569513,0.024782246,0.039001092,0.009137043,0.003569513,0.009137043,0.013366014),nrow=3) -summary(m1)$tTable[,"t-value"] # t-values for coef estimates: c(3.677548,10.340374,24.465786) -summary(m1)$tTable[,"p-value"] # p-values for coef estimates: c(0.066635016,0.009223303,0.001666460) -coef(m1) + qt(p=0.025,df=5-3)*sqrt(diag(vcov(m1))) # lower limit 95%-CI: c(-0.1099703,1.1923712,2.3310897) -coef(m1) + qt(p=0.975,df=5-3)*sqrt(diag(vcov(m1))) # upper limit 95%-CI: c(1.403901,2.891807,3.325962) - -m2 <- gls(y~x1+x2,data=df, - correlation=corBrownian(1,tree,form=~species),method="ML") -coef(m2) # coefficients estimates: c(0.6469652,2.0420889,2.8285257) -sigma(m2)^2 # ml BM variance-rate estimate: 0.01755892 -logLik(m2) # log-likelihood: 3.933531 -vcov(m2) # cov mat for coef estimates, this evaluates to the same value as vcov(m1) -# Note: vcov(gls(...,method="REML)) == vcov(gls(...,method="ML")) -# The same holds for t/p-values and CIs for the coef estimates -summary(m2)$tTable[,"t-value"] # t-values for coef estimates: c(3.677548,10.340374,24.465786) -summary(m2)$tTable[,"p-value"] # p-values for coef estimates: c(0.066635016,0.009223303,0.001666460) -coef(m2) + qt(p=0.025,df=5-3)*sqrt(diag(vcov(m2))) # lower limit 95%-CI: c(-0.1099703,1.1923712,2.3310897) -coef(m2) + qt(p=0.975,df=5-3)*sqrt(diag(vcov(m2))) # upper limit 95%-CI: c(1.403901,2.891807,3.325962) -=# -m1 = phylolm(@formula(y~x1+x2),df,net; tipnames=:species, reml=true) -m2 = phylolm(@formula(y~x1+x2),df,net; tipnames=:species, reml=false) -@test m1.reml -@test coef(m1) ≈ [0.6469652,2.0420889,2.8285257] rtol=1e-5 -@test sigma2_phylo(m1) ≈ 0.0438973 rtol=1e-4 -@test isnothing(sigma2_within(m1)) -@test loglikelihood(m1) ≈ -0.07529961 rtol=1e-3 -@test vcov(m1) ≈ [0.030948901 0.024782246 0.003569513;0.024782246 0.039001092 0.009137043;0.003569513 0.009137043 0.013366014] rtol=1e-4 -@test coeftable(m1).cols[coeftable(m1).teststatcol] ≈ [3.677548,10.340374,24.465786] rtol=1e-4 -@test coeftable(m1).cols[coeftable(m1).pvalcol] ≈ [0.066635016,0.009223303,0.001666460] rtol=1e-4 -@test coeftable(m1).cols[findall(coeftable(m1).colnms .== "Lower 95%")[1]] ≈ [-0.1099703,1.1923712,2.3310897] rtol=1e-5 -@test coeftable(m1).cols[findall(coeftable(m1).colnms .== "Upper 95%")[1]] ≈ [1.403901,2.891807,3.325962] rtol=1e-5 -@test !m2.reml -@test coef(m2) ≈ [0.6469652,2.0420889,2.8285257] rtol=1e-5 -@test sigma2_phylo(m2) ≈ 0.01755892 rtol=1e-4 -@test isnothing(sigma2_within(m2)) -@test loglikelihood(m2) ≈ 3.933531 rtol=1e-4 -@test vcov(m2) ≈ [0.030948901 0.024782246 0.003569513;0.024782246 0.039001092 0.009137043;0.003569513 0.009137043 0.013366014] rtol=1e-4 -@test coeftable(m2).cols[coeftable(m2).teststatcol] ≈ [3.677548,10.340374,24.465786] rtol=1e-4 -@test coeftable(m2).cols[coeftable(m2).pvalcol] ≈ [0.066635016,0.009223303,0.001666460] rtol=1e-4 -@test coeftable(m2).cols[findall(coeftable(m2).colnms .== "Lower 95%")[1]] ≈ [-0.1099703,1.1923712,2.3310897] rtol=1e-5 -@test coeftable(m2).cols[findall(coeftable(m2).colnms .== "Upper 95%")[1]] ≈ [1.403901,2.891807,3.325962] rtol=1e-5 - -end - -@testset "phylolm: binary tree, withinspecies var" begin - -#= NOTE: -This testset DOES NOT check for similarity of the variance-components estimates -from 'pgls.SEy' (phytools) and 'phylolm' (PhyloNetworks). In fact, -'pgls.SEy' and 'phylolm' solve different problems! -ML/REML variance-component estimates are obtained by running 'phylolm'. -The code for 'pgls.SEy' is adapted to calculate coef estimates, cov matrix for -coef estimates, t/p-values for coef estimates, and full/restricted-loglikelihood, -given these variance-components estimates. These values are then compared against -those extracted from the output of 'phylolm'. -=# - -#= Rcode to generate the newick string and dataset: -library(phytools) -set.seed(2) -m <- 5 # sample-size per taxa -n <- 5 # no. of taxa -p <- 3 # no. of predictors (including intercept) - -tree <- pbtree(n=n,scale=1) # topology and branch lengths -tree.newick <- write.tree(tree) # newick format -# tree.newick <- "(((t4:0.2537636499,t5:0.2537636499):0.2103870459,t3:0.4641506959):0.5358493041,(t1:0.4807642475,t2:0.4807642475):0.5192357525);" - -X <- fastBM(tree,sig2=2,nsim=2); colnames(X) <- c("x1","x2") # non-intercept predictors -# X <- matrix(c(0.7894387,0.3285286,2.1495131,-1.4935665,-2.3199935,2.8184268,0.4740687,2.5801004,1.9967379,-0.4121874),nrow=5) -# colnames(X) <- c("x1","x2"); rownames(X) <- c("t4","t5","t3","t1","t2") - -bsperr <- fastBM(tree) # phylogenetic variation, true BM variance-rate is 1 -wspvar <- 0.1 # within-species variance is 0.1 -msrerr <- rnorm(n=n,sd=sqrt(wspvar/m)) # msr error in species-level mean responses -y_sd <- sqrt(wspvar*rchisq(n=n,df=m-1)/(m-1)) # sd in individual responses per species -# y_sd <- c(0.2463003,0.3236629,0.2458547,0.4866844,0.3434582); -y <- cbind(rep(1,5),X)%*%(1:3)+bsperr+msrerr # response, true beta vector is c(1,2,3) -# y <- matrix(c(11.399108,3.216645,13.648011,4.851454,-4.922803),nrow=5); rownames(y) <- c("t4","t5","t3","t1","t2") - -df <- data.frame(y,y_sd,X,species=tree$tip.label) -=# -net = readTopology("(((t4:0.2537636499,t5:0.2537636499):0.2103870459,t3:0.4641506959):0.5358493041,(t1:0.4807642475,t2:0.4807642475):0.5192357525);") -df = DataFrame( - y=[11.399108,3.216645,13.648011,4.851454,-4.922803], - y_sd=[0.2463003,0.3236629,0.2458547,0.4866844,0.3434582], - y_n=fill(5,5), - x1=[0.7894387,0.3285286,2.1495131,-1.4935665,-2.3199935], - x2=[2.8184268,0.4740687,2.5801004,1.9967379,-0.4121874], - species=net.names -) - -#= R/Julia code to check model fit: -(1) Julia code: -## To extract reml/ml msrerr variance estimates fitted by phylolm -m1 |> sigma2_within |> x -> round(x,sigdigits=6) # reml est msrerr var: 0.116721 -m2 |> sigma2_within |> x -> round(x,sigdigits=6) # ml est msrerr var: 0.125628 -m1 |> sigma2_phylo |> x -> round(x,sigdigits=6) # reml est BM var: 0.120746 -m2 |> sigma2_phylo |> x -> round(x,sigdigits=6) # ml est BM var: 0.000399783 - -(2) R code: -## To check phylolm REML fit -library(nlme) -T1 <- tree -wspvar1 <- 0.116721 # reml est msrerr var of indiv-lvl rsps -bspvar1 <- 0.120746 # reml est BM var -se1 <- setNames(rep(sqrt(wspvar1/m),n),T1$tip.label) # msrerr sd of species-lvl mean rsp -T1$edge.length <- T1$edge.length*bspvar1 # scale all edges by est BM var -ii <- sapply(1:Ntip(T1),function(x,e) which(e==x),e=T1$edge[,2]) # indices of pendant edges -# extend pendant edges by msrerr sd -T1$edge.length[ii] <- T1$edge.length[ii]+se1[T1$tip.label]^2 -covmat1 <- vcv(T1) # extract est vars of species-lvl mean rsp -m1 <- gls(y~x1+x2,data=cbind(df,vf=diag(covmat1)), - correlation=corBrownian(1,T1,form=~species), - method="REML", - weights=varFixed(~vf)) - -coef(m1) # reml coefficient estimates: c(1.079839,1.976719,3.217391) - -Xp <- model.matrix(m1,df) # predictor matrix -vcov1 <- solve(t(Xp)%*%solve(covmat1)%*%Xp) # cov mat for coef estimates -# matrix(c(0.09386431,0.02273458,-0.02602937,0.02273458,0.02172123,-0.01133032,-0.02602937,-0.01133032,0.01584198),nrow=3) - -teststat1 <- coef(m1)/sqrt(diag(vcov1)) # test stat for coef estimates: c(3.524591,13.412285,25.562252) -pval1 <- sapply(X=pt(teststat1,n-p),FUN=function(p) 2*min(p,1-p)) # pval for coef est: -# c(0.071921276,0.005513044,0.001526885) -lowerci1 <- coef(m1) + qt(p=0.025,df=n-p)*sqrt(diag(vcov1)) # lower limit 95%-CI: c(-0.2383769,1.3425890,2.6758379) -upperci1 <- coef(m1) + qt(p=0.975,df=n-p)*sqrt(diag(vcov1)) # upper limit 95%-CI: c(2.398055,2.610850,3.758944) - -RSS <- sum((m-1)*(df$y_sd^2)) # residual sum-of-squares wrt to the species means -logLik(m1) # species-lvl cond restricted-ll: -3.26788 -sigm1 <- sigma(m1) # this is not bspvar1!, but rather the best "scaling" for covmat1 -# indiv-lvl cond restricted ll -# "+ (n-p)*(2*log(sigm1)-sigm1^2+1)/2" un-scales the species-lvl rll returned by logLik -# "- n*(m-1)*(log(wspvar1)+log(2*pi))/2 - (n*log(m)+RSS/wspvar1)/2" corrects to indiv-lvl rll -rll.species <- logLik(m1) -rll.indiv <- (rll.species - + (n-p)*(2*log(sigm1)-sigm1^2+1)/2 - - n*(m-1)*(log(wspvar1)+log(2*pi))/2 - (n*log(m)+RSS/wspvar1)/2 - ) -round(rll.indiv,digits=6) # indiv-lvl rll of remles: -14.14184 - -## To check phylolm ML fit -T2 <- tree -wspvar2 <- 0.125628 # ml est msrerr var of indiv-lvl rsps -bspvar2 <- 0.000399783 # ml est BM var -se2 <- setNames(rep(sqrt(wspvar2/m),n),T2$tip.label) -T2$edge.length <- T2$edge.length*bspvar2 -ii <- sapply(1:Ntip(T2),function(x,e) which(e==x),e=T2$edge[,2]) -T2$edge.length[ii] <- T2$edge.length[ii]+se2[T2$tip.label]^2 -covmat2 <- vcv(T2) -m2 <- gls(y~x1+x2,data=cbind(df,vf=diag(covmat2)), - correlation=corBrownian(1,T2,form=~species), - method="ML", - weights=varFixed(~vf)) - -coef(m2) # ml coefficient estimates: c(0.9767352,1.9155142,3.2661862) - -Xp <- model.matrix(m2,df) # predictor matrix -vcov2 <- solve(t(Xp)%*%solve(covmat2)%*%Xp) # cov mat for coef estimates -# matrix(c(0.019118171,0.004924625,-0.008977541,0.004924625,0.003577654,-0.003028413,-0.008977541,-0.003028413,0.005793475),nrow=3) - -teststat2 <- coef(m2)/sqrt(diag(vcov2)) # test stat for coef est: c(7.064049,32.024784,42.911270) -pval2 <- sapply(X=pt(teststat2,n-p),FUN=function(p) 2*min(p,1-p)) # pval for coef est: -# c(0.0194568147,0.0009736278,0.0005426298) -lowerci2 <- coef(m2) + qt(p=0.025,df=n-p)*sqrt(diag(vcov2)) # lower limit 95%-CI: c(0.381814,1.658158,2.938690) -upperci2 <- coef(m2) + qt(p=0.975,df=n-p)*sqrt(diag(vcov2)) # upper limit 95%-CI: c(1.571656,2.172871,3.593682) - -ll.species <- logLik(m2) # species-lvl cond ll: 1.415653 -sigm2 <- sigma(m2) # this is not bspvar2!, but rather the best "scaling" for covmat2 -RSS <- sum((m-1)*(df$y_sd^2)) # residual sum-of-squares wrt to the species means -# indiv-lvl cond ll -# "+ n*(2*log(sigm2)-sigm2^2+1)/2" un-scales the species-lvl ll returned by logLik -# "- n*(m-1)*(log(wspvar2)+log(2*pi))/2 - (n*log(m)+RSS/wspvar2)/2" corrects to indiv-lvl ll -ll.indiv <- (ll.species - + n*(2*log(sigm2)-sigm2^2+1)/2 - - n*(m-1)*(log(wspvar2)+log(2*pi))/2 - (n*log(m)+RSS/wspvar2)/2 - ) -round(ll.indiv,digits=6) # indiv-lvl ll of mles: -9.582357 -=# -m1 = phylolm(@formula(y~x1+x2),df,net; - tipnames=:species, reml=true, withinspecies_var=true, y_mean_std=true) -m2 = phylolm(@formula(y~x1+x2),df,net; - tipnames=:species, reml=false, withinspecies_var=true, y_mean_std=true) - -@test coef(m1) ≈ [1.079839,1.976719,3.217391] rtol=1e-4 -@test coef(m2) ≈ [0.9767352,1.9155142,3.2661862] rtol=1e-4 -@test loglikelihood(m1) ≈ -14.14184 rtol=1e-4 -@test loglikelihood(m2) ≈ -9.582357 rtol=1e-4 -@test vcov(m1) ≈ [0.09386431 0.02273458 -0.02602937;0.02273458 0.02172123 -0.01133032;-0.02602937 -0.01133032 0.01584198] rtol=1e-3 -@test vcov(m2) ≈ [0.019118171 0.004924625 -0.008977541;0.004924625 0.003577654 -0.003028413;-0.008977541 -0.003028413 0.005793475] rtol=1e-3 -@test coeftable(m1).cols[coeftable(m1).teststatcol] ≈ [3.524591,13.412285,25.562252] rtol=1e-4 -@test coeftable(m2).cols[coeftable(m2).teststatcol] ≈ [7.064049,32.024784,42.911270] rtol=1e-4 -@test coeftable(m1).cols[coeftable(m1).pvalcol] ≈ [0.071921276,0.005513044,0.001526885] rtol=1e-3 -@test coeftable(m2).cols[coeftable(m2).pvalcol] ≈ [0.0194568147,0.0009736278,0.0005426298] rtol=1e-3 -@test coeftable(m1).cols[findall(coeftable(m1).colnms .== "Lower 95%")[1]] ≈ [-0.2383769,1.3425890,2.6758379] rtol=1e-4 -@test coeftable(m2).cols[findall(coeftable(m2).colnms .== "Lower 95%")[1]] ≈ [0.381814,1.658158,2.938690] rtol=1e-4 -@test coeftable(m1).cols[findall(coeftable(m1).colnms .== "Upper 95%")[1]] ≈ [2.398055,2.610850,3.758944] rtol=1e-4 -@test coeftable(m2).cols[findall(coeftable(m2).colnms .== "Upper 95%")[1]] ≈ [1.571656,2.172871,3.593682] rtol=1e-4 - -# missing y (but y_n/SD present); missing/infinite sample size; missing/infinite y_SD -df = df[[1,2,3,4],:] # delete t2 -allowmissing!(df, [:y,:y_n,:y_sd]) -# m0 = phylolm(@formula(y~1),df,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) -df1 = DataFrame(df) # makes a copy -push!(df1, (missing,0.,0,0.,0.,"t2")) -m1 = phylolm(@formula(y~1),df1,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) -@test coef(m1) ≈ [7.8116494901242195] atol=1e-6 # same as m0 -@test sigma2_within(m1) ≈ 0.11568962074173368 atol=1e-6 -@test nobs(m1) == 20 # 4 species x 5 indiv/species -@test dof_residual(m1) == 3 -# sample sizes y_n: 1, 0, infinite -@test dof(m1) == 3 # intercept, s2phylo, s2within -df1[5,:] .= (0.,0.,1,0.,0.,"t2") # then almost same within-sp variation -m1 = phylolm(@formula(y~1),df1,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) -@test sigma2_within(m1) ≈ 0.11569 atol=1e-4 -@test nobs(m1) == 21 -@test dof_residual(m1) == 4 -df1[5,:] .= (0.,0.,0,0.,0.,"t2") # some species have 0 or <0 num_individuals, column y_n -@test_throws ErrorException phylolm(@formula(y~1),df1,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) -df1[!,:y_n] = Float64.(df1[!,:y_n]) -df1[5,:] .= (0.,0.,Inf,0.,0.,"t2")#some species have infinite num_individuals, column y_n -@test_throws ErrorException phylolm(@formula(y~1),df1,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) -df1[5,:] .= (0.,missing,1,0.,0.,"t2") # some SD values are missing, column y_sd -@test_throws ErrorException phylolm(@formula(y~1),df1,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) -df1[5,:] .= (0.0,Inf,1,0.,0.,"t2") # some SD values are infinite, column y_sd -@test_throws ErrorException phylolm(@formula(y~1),df1,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) - -end - -@testset "phylolm: within-species var, network h=1" begin - -#= Simulation of data used below: -(1) Individual-level data -function simTraits(net, m, paramsprocess) - sim = simulate(net, paramsprocess) - trait = sim[:Tips] - return repeat(trait, inner=m) -end -n = 6; m = 3 # 6 species, 3 individuals per species -net = readTopology("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); -Random.seed!(18480224); -trait1 = simTraits(net, m, ParamsBM(2, 0.5)) # simulate a BM with mean 2 and variance 0.5 on net -trait2 = simTraits(net, m, ParamsBM(-2, 1.0)) # simulate a BM with mean -2 and variance 1.0 on net -phylo_noise_var = 0.1 # BM variance-rate -meas_noise_var = 0.01 # individual-level msrerr variance -phylo_noise = simTraits(net, m, ParamsBM(0, phylo_noise_var)) -meas_noise = randn(n*m)*sqrt(meas_noise_var) -trait3 = 10 .+ 2 * trait1 + phylo_noise + meas_noise -labels = repeat(names(vcv(net)), inner=m) -df = DataFrame(trait1=trait1, trait2=trait2, trait3=trait3, tipNames=labels) - -(2) Species-level data (extra columns for SD and n of trait3) -gdf = groupby(df, :species) -df_r = combine(gdf, :trait1 => (x -> mean(x)) => :trait1, - :trait2 => (x -> mean(x)) => :trait2, - :trait3 => (x -> mean(x)) => :trait3, - :trait3 => (x -> std(x)) => :trait3_sd, - :trait3 => (x -> length(x)) => :trait3_n) -=# -n = 6; m = 3 -net = readTopology("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); -df = DataFrame( - species = repeat(["D","C","A","B","E","O"],inner=m), - trait1 = [4.08298,4.08298,4.08298,3.10782,3.10782,3.10782,2.17078,2.17078,2.17078,1.87333,1.87333,1.87333,2.8445, - 2.8445,2.8445,5.88204,5.88204,5.88204], - trait2 = [-7.34186,-7.34186,-7.34186,-7.45085,-7.45085,-7.45085,-3.32538,-3.32538,-3.32538,-4.26472,-4.26472, - -4.26472,-5.96857,-5.96857,-5.96857,-1.99388,-1.99388,-1.99388], - trait3 = [18.8101,18.934,18.9438,17.0687,17.0639,17.0732,14.4818,14.1112,14.2817,13.0842,12.9562,12.9019,15.4373, - 15.4075,15.4317,24.2249,24.1449,24.1302] -) -df_r = DataFrame( - species = ["D","C","A","B","E","O"], - trait1 = [4.08298,3.10782,2.17078,1.87333,2.8445,5.88204], - trait2 = [-7.34186,-7.45085,-3.32538,-4.26472,-5.96857,-1.99388], - trait3 = [18.895966666666666,17.0686,14.291566666666668,12.980766666666666,15.4255,24.166666666666668], - trait3_sd = [0.07452397824414288,0.004650806381693211,0.18549690922851855,0.09360001780626576,0.01583792915756317,0.05096433393397276], - trait3_n = [3, 3, 3, 3, 3, 3] -) - -m1 = phylolm(@formula(trait3 ~ trait1), df, net; reml=true, - tipnames=:species, withinspecies_var=true) -m2 = phylolm(@formula(trait3 ~ trait1), df_r, net; reml=true, - tipnames=:species, withinspecies_var=true, y_mean_std=true) -m3 = phylolm(@formula(trait3 ~ trait1), df, net; reml=false, - tipnames=:species, withinspecies_var=true) -m4 = phylolm(@formula(trait3 ~ trait1), df_r, net; reml=false, - tipnames=:species, withinspecies_var=true, y_mean_std=true) - -@testset "agreement across data input" begin # nested test set -#= - individual-level data vs when the species-level data: see m1, m2, m3, m4 -- permuted data rows: see m1permute, m2permute -- w/o withinspecies var: when a species has missing entries vs when the species - is completely absent from the data (see m3missingentry, m4missingrow). =# -m1permute = phylolm(@formula(trait3 ~ trait1), df[[1,6,11,17,16,18,8,5,9,3,12,7,13,10,2,14,4,15],:], # permute predictor rows - net; reml=true,tipnames=:species, withinspecies_var=true) -m2permute = phylolm(@formula(trait3 ~ trait1), df_r[[5,2,3,1,6,4],:], net; reml=true, # permute predictor rows - tipnames=:species, withinspecies_var=true, y_mean_std=true) -@test coef(m1) ≈ [9.65347,2.30357] rtol=1e-4 -@test coef(m1permute) ≈ [9.65347,2.30357] rtol=1e-4 -@test coef(m2) ≈ [9.65347,2.30357] rtol=1e-4 -@test coef(m2permute) ≈ [9.65347,2.30357] rtol=1e-4 -@test sigma2_phylo(m1) ≈ 0.156188 rtol=1e-4 -@test sigma2_phylo(m1permute) ≈ 0.156188 rtol=1e-4 -@test sigma2_phylo(m2) ≈ 0.156188 rtol=1e-4 -@test sigma2_phylo(m2permute) ≈ 0.156188 rtol=1e-4 -@test sigma2_within(m1) ≈ 0.008634 rtol=1e-4 -@test sigma2_within(m1permute) ≈ 0.008634 rtol=1e-4 -@test sigma2_within(m2) ≈ 0.008634 rtol=1e-4 -@test sigma2_within(m2permute) ≈ 0.008634 rtol=1e-4 -@test loglikelihood(m1) ≈ 1.944626 rtol=1e-4 -@test loglikelihood(m1permute) ≈ 1.944626 rtol=1e-4 -@test loglikelihood(m2) ≈ 1.944626 rtol=1e-4 -@test loglikelihood(m2permute) ≈ 1.944626 rtol=1e-4 -@test stderror(m1) ≈ [1.3065987324433421,0.27616258597477233] atol=1e-6 -@test stderror(m1permute) ≈ [1.3065987324433421,0.27616258597477233] atol=1e-6 -@test stderror(m2) ≈ [1.3065987324433421,0.27616258597477233] atol=1e-6 -@test stderror(m2permute) ≈ [1.3065987324433421,0.27616258597477233] atol=1e-6 -@test nobs(m1) == 18 # 6 species, 18 ind -@test nobs(m1permute) == 18 -@test residuals(m1) ≈ [-0.16295769587309603,0.2560302141911026,-0.36246083625543507,-0.9880623366773218,-0.78049231427113,0.9634719640663754] atol=1e-6 -# indexin(df[[1,6,11,17,16,18,8,5,9,3,12,7,13,10,2,14,4,15],:].species |> unique, df.species |> unique) == [1,2,4,6,3,5] -@test residuals(m1permute) ≈ [-0.16295769587309603,0.2560302141911026,-0.36246083625543507, - -0.9880623366773218,-0.78049231427113,0.9634719640663754][[1,2,4,6,3,5]] atol=1e-6 -@test residuals(m2) ≈ [-0.16295769587309603,0.2560302141911026,-0.36246083625543507,-0.9880623366773218,-0.78049231427113,0.9634719640663754] atol=1e-6 -@test residuals(m2permute) ≈ [-0.16295769587309603,0.2560302141911026,-0.36246083625543507, - -0.9880623366773218,-0.78049231427113,0.9634719640663754][[5,2,3,1,6,4]] atol=1e-6 -@test dof_residual(m1) == 4 -@test dof_residual(m1permute) == 4 -@test dof(m1) == 4 - -dfmissingentry = allowmissing(df); dfmissingentry.trait1[1:3] .= missing # remove entire trait1 col for species D -m3missingentry = phylolm(@formula(trait3 ~ trait1), dfmissingentry, net; reml=false, # not using data from species D - tipnames=:species, withinspecies_var=true) -df_rmissingrow = copy(df_r); df_rmissingrow = df_rmissingrow[2:6,:] # remove entire row for species D -m4missingrow = phylolm(@formula(trait3 ~ trait1), df_rmissingrow, net; reml=false, # not using data from species D - tipnames=:species, withinspecies_var=true, y_mean_std=true) -@test coef(m3) ≈ [9.63523,2.30832] rtol=1e-4 -@test coef(m4) ≈ [9.63523,2.30832] rtol=1e-4 -@test coef(m3missingentry) ≈ coef(m4missingrow) rtol=1e-4 -@test sigma2_phylo(m3) ≈ 0.102255 rtol=1e-4 -@test sigma2_phylo(m4) ≈ 0.102255 rtol=1e-4 -@test sigma2_phylo(m3missingentry) ≈ sigma2_phylo(m4missingrow) rtol=1e-4 -@test sigma2_within(m3) ≈ 0.008677 rtol=1e-4 -@test sigma2_within(m4) ≈ 0.008677 rtol=1e-4 -@test sigma2_within(m3missingentry) ≈ sigma2_within(m4missingrow) rtol=1e-4 -@test loglikelihood(m3) ≈ 1.876606 rtol=1e-4 -@test loglikelihood(m4) ≈ 1.876606 rtol=1e-4 -@test loglikelihood(m3missingentry) ≈ loglikelihood(m4missingrow) rtol=1e-4 -@test stderror(m3) ≈ [1.0619360781577734, 0.22496955609230126] atol=1e-6 -@test stderror(m4) ≈ [1.0619360781577734, 0.22496955609230126] atol=1e-6 -@test stderror(m3missingentry) ≈ stderror(m4missingrow) atol=1e-6 -@test residuals(m3missingentry) ≈ residuals(m4missingrow) atol=1e-6 -end # agreement test subset - -@testset "model comparison & likelihood ratio test" begin -m3null = phylolm(@formula(trait3 ~ 1), df, net; reml=false, tipnames=:species, withinspecies_var=true) -m3full = phylolm(@formula(trait3 ~ trait1 + trait2), df, net; reml=false, tipnames=:species, withinspecies_var=true) -@test StatsModels.isnested(m3null, m3full) -tab = (@test_logs lrtest(m3null, m3, m3full)) -@test all(isapprox.(tab.deviance, (13.720216379785523,-3.75321128763398,-4.243488375445074), atol=1e-6)) -@test tab.dof == (3, 4, 5) -@test all(isapprox.(tab.pval[2:end], (2.9135155795020905e-5,0.4838037279625203), atol=1e-6)) -m1null = phylolm(@formula(trait3 ~ 1), df, net; tipnames=:species, withinspecies_var=true) # REML -@test !(@test_logs (:error, r"fitted with ML") StatsModels.isnested(m1null, m1)) # REML, different FEs -@test_logs (:error, r"same criterion") (@test_throws ArgumentError lrtest(m3null, m1)) # ML and REML -m2w = phylolm(@formula(trait3 ~ trait1), df_r, net; tipnames=:species) -m5w = phylolm(@formula(trait3 ~ trait1), df[[1,2,4,7,13,18],:], net; tipnames=:species, withinspecies_var=true) -@test !(@test_logs (:error, r"same number of obs") StatsModels.isnested(m2, m2w)) -@test !(@test_logs (:error, r"same response") StatsModels.isnested(m5w,m2w)) -m6w = (@test_logs (:info,r"^Maximum lambda") phylolm(@formula(trait3 ~ trait1), df_r, net; tipnames=:species, model="lambda")) -tab = lrtest(m2w, m6w) # both REML, but same predictors -@test tab.pval[2] ≈ 0.03928341265297505 atol=1e-6 -@test !PhyloNetworks.isnested(PhyloNetworks.PagelLambda(0.1),PhyloNetworks.BM()) -@test !PhyloNetworks.isnested(PhyloNetworks.PagelLambda(),PhyloNetworks.ScalingHybrid()) -@test !PhyloNetworks.isnested(PhyloNetworks.ScalingHybrid(2.0),PhyloNetworks.PagelLambda()) -@test_throws ArgumentError ftest(m3null, m3, m3full) # not the same Y after transformation -end # lrt test subset - -@testset "equivalence with Pagel's lambda on expanded net" begin -# find a given named tip or node -function getNode(name::String, net::HybridNetwork) - i = findfirst(n -> n.name == name, net.node) - isnothing(i) && error("Node $(name) was not found in the network.") - return net.node[i] -end -# new column with tip ids, initialized to species names -dfbig = deepcopy(df) -insertcols!(dfbig, 1, :speciesIds => dfbig[!,:species]) -# add tips with zero length branches on the network -netbig = deepcopy(net) -for i in 1:nrow(dfbig) - sp_name = dfbig[i, :species]; tip_name = sp_name * string(i) - PhyloNetworks.addleaf!(netbig, getNode(sp_name, netbig), tip_name, 0.0) - dfbig[i, :speciesIds] = tip_name -end -# (((((D1:0.0,D2:0.0,D3:0.0)D:0.4,(C4:0.0,C5:0.0,C6:0.0)C:0.4):4.8,(((A7:0.0,A8:0.0,A9:0.0)A:0.8,(B10:0.0,B11:0.0,B12:0.0)B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0.0::0.3,(E13:0.0,E14:0.0,E15:0.0)E:3.0):6.2):2.0,(O16:0.0,O17:0.0,O18:0.0)O:11.2); -# fit lambda on bigger network -m1big = (@test_logs (:info, r"^M") phylolm(@formula(trait3 ~ trait1), dfbig, netbig, model="lambda"; tipnames=:speciesIds)) -# equivalent phylo and within variances -net_height = maximum(PhyloNetworks.getHeights(net)); -sig_phy_2 = sigma2_phylo(m1big) * lambda_estim(m1big); -sig_err_2 = sigma2_phylo(m1big) * (1 - lambda_estim(m1big)) * net_height; -@test sigma2_phylo(m1) ≈ sig_phy_2 atol=1e-7 -@test sigma2_within(m1) ≈ sig_err_2 atol=1e-9 -# equivalent lambda value; equivalent coefficients and other -w_var_lambda = sigma2_phylo(m1) / (sigma2_within(m1) / net_height + sigma2_phylo(m1)); -@test w_var_lambda ≈ lambda_estim(m1big) atol=1e-8 -@test coef(m1) ≈ coef(m1big) atol=1e-7 -@test mu_phylo(m1) ≈ mu_phylo(m1big) atol=1e-7 -@test vcov(m1) ≈ vcov(m1big) atol=1e-6 -@test stderror(m1) ≈ stderror(m1big) atol=1e-6 -@test nobs(m1) ≈ nobs(m1big) atol=1e-10 -@test dof(m1) ≈ dof(m1big) atol=1e-10 -@test deviance(m1) ≈ deviance(m1big) atol=1e-10 -@test loglikelihood(m1) ≈ loglikelihood(m1big) atol=1e-10 -# what differs: residuals, response, predict (not same length) -# also differs: dof_residuals (18-2=16 vs 6-2=4), and so predint -end - -allowmissing!(df, [:trait3]); df[4:6,:trait3] .= missing # species C missing -allowmissing!(df_r,[:trait3]); df_r[2,:trait3] = missing # to check imputation - -@testset "ancestral state prediction, intercept only" begin -m1 = phylolm(@formula(trait3 ~ 1), df_r, net; tipnames=:species, withinspecies_var=true, y_mean_std=true) -ar1 = (@test_logs (:warn, r"^T") ancestralStateReconstruction(m1)) -# ar.NodeNumbers[8] == 2 (looking at node #2), m1.V.tipNames[indexin([2],m1.V.tipNumbers)[1]] == "C" (looking at tip "C") -@test ar1.traits_nodes[8] ≈ 18.74416393519304 rtol=1e-5 # masked sampled C_bar was 17.0686 -@test predint(ar1)[8,:] ≈ [15.24005506417728,22.2482728062088] rtol=1e-5 -# on dataframe with model passed as keyword args. must be individual data. -ar2 = (@test_logs (:warn, r"^T") ancestralStateReconstruction(df[!,[:species,:trait3]], net; tipnames=:species, withinspecies_var=true)) -@test ar2.traits_nodes ≈ ar1.traits_nodes rtol=1e-5 -@test predint(ar2) ≈ predint(ar1) rtol=1e-5 -# When withinspecies_var=true, predicted values at the tips are part of -# "traits_nodes", not "traits_tips", and differ from the observed sample means. -@test length(ar1.traits_tips) == 0 -@test length(ar2.traits_tips) == 0 -@test length(ar1.traits_nodes) == 13 -@test length(ar2.traits_nodes) == 13 -@test ar1.traits_nodes[9] ≈ 18.895327175656757 # for tip D: observed 18.896 -@test predint(ar1)[9,:] ≈ [18.73255168713768,19.058102664175834] # narrow -end - -@testset "ancestral state prediction, more than intercept" begin -m3 = phylolm(@formula(trait3 ~ trait1 + trait2), df[[1,6,11,17,16,18,8,5,9,3,12,7,13,10,2,14,4,15],:], net; tipnames=:species, withinspecies_var=true) -X_n = [m3.X;m3.X[1:3,:]] # 8x3 Array -ar3 = (@test_logs (:warn, r"^T") ancestralStateReconstruction(m3, X_n)) -m4 = phylolm(@formula(trait3 ~ trait1 + trait2), df_r[[1,4,6,3,2,5],:], net; tipnames=:species, withinspecies_var=true, y_mean_std=true) -ar4 = (@test_logs (:warn, r"^T") ancestralStateReconstruction(m4, X_n)) -@test ar3.NodeNumbers == ar4.NodeNumbers -@test ar3.traits_nodes ≈ ar4.traits_nodes rtol=1e-5 -@test ar3.variances_nodes ≈ ar4.variances_nodes rtol=1e-5 -@test size(expectations(ar4)) == (13, 2) -@test expectationsPlot(ar4)[8,2] == "24.84*" -@test expectationsPlot(ar3)[8,2] == "24.84*" -@test predint(ar3)[13,:] ≈ [15.173280800793783,15.677786825808212] rtol=1e-5 # narrow at tip with data -@test predint(ar3)[7,:] ≈ [10.668220499837211,15.322037065478693] rtol=1e-5 # wide at a root -p3 = predintPlot(ar3) -p4 = predintPlot(ar4) -@test p3[!,:nodeNumber] == p4[!,:nodeNumber] -@test p3[13,2] == "[15.17, 15.68]" -@test p4[13,2] == "[15.17, 15.68]" -@test p3[7,2] == "[10.67, 15.32]" -@test p4[7,2] == "[10.67, 15.32]" -end # test subset - -end # test set: withinspecies_var on network h=1 diff --git a/test/test_manipulateNet.jl b/test/test_manipulateNet.jl index baca3521c..294938921 100644 --- a/test/test_manipulateNet.jl +++ b/test/test_manipulateNet.jl @@ -4,48 +4,48 @@ if !(@isdefined doalltests) doalltests = false; end @testset "test: auxiliary" begin global net -net = readTopology("((((B:102.3456789)#H1)#H2,((D:0.00123456789,C,#H2:::0.123456789)S1,(#H1,A_coolname)S2)S3)S4);") +net = readnewick("((((B:102.3456789)#H1)#H2,((D:0.00123456789,C,#H2:::0.123456789)S1,(#H1,A_coolname)S2)S3)S4);") s = IOBuffer() -@test_logs printEdges(s, net) +@test_logs printedges(s, net) @test String(take!(s)) == """ -edge parent child length hybrid isMajor gamma containRoot inCycle istIdentitiable -1 2 1 102.346 false true 1 false -1 false -2 3 2 true true false -1 true -3 10 3 true true 0.8765 true -1 true -4 6 4 0.001 false true 1 true -1 false -5 6 5 false true 1 true -1 false -6 6 3 true false 0.1235 true -1 true -7 9 6 false true 1 true -1 true -8 8 2 true false true -1 true -9 8 7 false true 1 true -1 false -10 9 8 false true 1 true -1 true -11 10 9 false true 1 true -1 true +edge parent child length hybrid ismajor gamma containroot i_cycle +1 2 1 102.346 false true 1 false -1 +2 3 2 true true false -1 +3 10 3 true true 0.8765 true -1 +4 6 4 0.001 false true 1 true -1 +5 6 5 false true 1 true -1 +6 6 3 true false 0.1235 true -1 +7 9 6 false true 1 true -1 +8 8 2 true false true -1 +9 8 7 false true 1 true -1 +10 9 8 false true 1 true -1 +11 10 9 false true 1 true -1 """ close(s); s = IOBuffer() -@test_logs printNodes(s, net) +@test_logs printnodes(s, net) @test String(take!(s)) == """ -node leaf hybrid hasHybEdge name inCycle edges'numbers -1 true false false B -1 1 -2 false true true H1 -1 1 2 8 -3 false true true H2 -1 2 3 6 -4 true false false D -1 4 -5 true false false C -1 5 -6 false false true S1 -1 4 5 6 7 -7 true false false A_coolname -1 9 -8 false false true S2 -1 8 9 10 -9 false false false S3 -1 7 10 11 -10 false false true S4 -1 3 11 +node leaf hybrid name i_cycle edges'numbers +1 true false B -1 1 +2 false true H1 -1 1 2 8 +3 false true H2 -1 2 3 6 +4 true false D -1 4 +5 true false C -1 5 +6 false false S1 -1 4 5 6 7 +7 true false A_coolname -1 9 +8 false false S2 -1 8 9 10 +9 false false S3 -1 7 10 11 +10 false false S4 -1 3 11 """ close(s); originalstdout = stdout redirect_stdout(devnull) -printEdges(net) # method without io argument -printNodes(net) +printedges(net) # method without io argument +printnodes(net) redirect_stdout(originalstdout) -@test_throws ErrorException getparent(net.node[net.root]) -@test_throws ErrorException getparentedge(net.node[net.root]) -@test_throws ErrorException getparentedgeminor(net.node[net.root]) +@test_throws ErrorException getparent(net.node[net.rooti]) +@test_throws ErrorException getparentedge(net.node[net.rooti]) +@test_throws ErrorException getparentedgeminor(net.node[net.rooti]) @test_throws ErrorException getparentminor(net.node[1]) @test getparent(net.node[1]).number == 2 @test getparentminor(net.node[3]).number == 6 @@ -65,59 +65,95 @@ redirect_stdout(originalstdout) @test_throws ErrorException deleteleaf!(net, net.node[9]) n = deepcopy(net) @test_logs deleteleaf!(n, n.node[7]) -@test n.numNodes == 8; @test n.numEdges == 9; +@test n.numnodes == 8; @test n.numedges == 9; @test_logs deleteleaf!(net, net.node[7], simplify=false) deleteleaf!(net, 4, simplify=false); deleteleaf!(net, 5, simplify=false) -@test net.numNodes == 5; @test net.numEdges == 6; +@test net.numnodes == 5; @test net.numedges == 6; + +## test nodeheights functions +net = readnewick("(((C:1,(A:1)#H1:1.5::0.7):1,(#H1:0.3::0.3,E:2.0):2.2):1.0,O:5.2);") +nh0 = [0.0,5.2,1.0,3.2,5.2,2.0,3.5,4.5,3.0] +@test getnodeheights(net) == nh0 +@test getnodeheights_majortree(net) == nh0 +net.edge[5].length = -1 # remove edge length: make it missing +nh = (@test_logs (:warn,"some hybrid edge length is missing") getnodeheights(net)) +@test nh == nh0 +@test net.edge[5].length == -1 # Make sure we don't mutate the broken edge length +@test getnodeheights!(net, false) == nh0 # no warning, though not tested +(x->x.length=-1).(view(net.edge, [3,5])) # make both hybrid edges missing +nh0 = [0,5.2,1,3.2,5.2,2,3.2,4.2,3] +@test (@test_logs (:warn, r"missing$") getnodeheights_average(net, false)) == nh0 +getnodeheights!(net) == nh0 +@test net.edge[3].length ≈ 1.2 +@test net.edge[5].length ≈ 0.0 atol=1e-12 +@test_logs getnodeheights_average(net, false) == nh0 # no more warning +@test istimeconsistent(net, false) +net.edge[3].length = -1 # make major edge missing +net.edge[5].length = 0.5 +nh_major = [0.0,5.2,1.0,3.2,5.2,2.0,3.7,4.7,3.0] +@test (@test_logs (:warn, r"major hybrid edge missing a length") match_mode=:any getnodeheights_majortree(net))==nh_major +net.edge[3].length = 1.2 # make major known again for testing inconsistency +net.edge[5].length = 7 # time-*in*consistent +@test_throws "not time consistent" getnodeheights!(net, false) +@test !istimeconsistent(net, false) +nh = (@test_logs (:warn, r"not time consistent$") getnodeheights_average(net, false)) +@test all(nh .≈ [0,5.2,1,3.2,5.2,2, 5.3, 6.3,3]) +nh = (@test_logs getnodeheights_majortree(net, false, warn=false)) +@test all(nh .≈ [0,5.2,1,3.2,5.2,2, 3.2, 4.2,3]) +# re-assign lengths to switch candidate heights between major and minor +net.edge[3].length = 8.2 +net.edge[5].length = 0.0 +nh = (@test_logs getnodeheights_majortree(net, false, warn=false)) +@test all(nh .≈ [0,5.2,1,3.2,5.2,2,10.2,11.2,3]) # below: 3 taxa, h=2, hybrid ladder but no 2-cycle. pruning t9 removes both hybrids. nwkstring = "((t7:0.23,#H19:0.29::0.47):0.15,(((#H23:0.02::0.34)#H19:0.15::0.53,(t9:0.06)#H23:0.02::0.66):0.09,t6:0.17):0.21);" -net = readTopology(nwkstring) +net = readnewick(nwkstring) @test_throws Exception deleteleaf!(net, "t1") # no leaf named t1 net.node[1].name = "t9" @test_throws Exception deleteleaf!(net, "t9") # 2+ leaves named t1 @test_throws Exception deleteleaf!(net, 10, index=true) # <10 nodes net.node[1].name = "t7" # back to original name deleteleaf!(net, "t9", nofuse=true) -@test writeTopology(net) == "((t7:0.23):0.15,(t6:0.17):0.21);" +@test writenewick(net) == "((t7:0.23):0.15,(t6:0.17):0.21);" deleteleaf!(net, "t7") -@test writeTopology(net) == "(t6:0.17);" +@test writenewick(net) == "(t6:0.17);" @test_logs (:warn, r"^Only 1 node") deleteleaf!(net, "t6") @test isempty(net.edge) @test isempty(net.node) end -@testset "testing directEdges! and re-rootings" begin +@testset "testing directedges! and re-rootings" begin # on a tree, then on a network with h=2" if doalltests -tre = readTopology("(((((((1,2),3),4),5),(6,7)),(8,9)),10);"); -tre.edge[1].isChild1=false; tre.edge[17].isChild1=false -directEdges!(tre) -tre.edge[1].isChild1 || error("directEdges! didn't correct the direction of 1st edge") -tre.edge[17].isChild1 || error("directEdges! didn't correct the direction of 17th edge") -for i=1:18 tre.edge[i].containRoot=false; end; -tre.root = 9; -directEdges!(tre); -!tre.edge[9].isChild1 || error("directEdges! didn't correct the direction of 9th edge") +tre = readnewick("(((((((1,2),3),4),5),(6,7)),(8,9)),10);"); +tre.edge[1].ischild1=false; tre.edge[17].ischild1=false +directedges!(tre) +@test tre.edge[1].ischild1 +@test tre.edge[17].ischild1 +for i=1:18 tre.edge[i].containroot=false; end; +tre.rooti = 9; +directedges!(tre); +@test !tre.edge[9].ischild1 for i=1:18 - tre.edge[i].containRoot || error("directEdges! didn't correct containRoot of $(i)th edge.") + tre.edge[i].containroot || error("directedges! didn't correct containroot of $(i)th edge.") end -tre = readTopology("(((((((1,2),3),4),5),(6,7)),(8,9)),10);"); +tre = readnewick("(((((((1,2),3),4),5),(6,7)),(8,9)),10);"); rootatnode!(tre, -9); ## clau: previously -8 end global net -net = readTopology("(((Ag,(#H1:7.159::0.056,((Ak,(E:0.08,#H2:0.0::0.004):0.023):0.078,(M:0.0)#H2:::0.996):2.49):2.214):0.026,(((((Az:0.002,Ag2:0.023):2.11,As:2.027):1.697)#H1:0.0::0.944,Ap):0.187,Ar):0.723):5.943,(P,20):1.863,165);"); +net = readnewick("(((Ag,(#H1:7.159::0.056,((Ak,(E:0.08,#H2:0.0::0.004):0.023):0.078,(M:0.0)#H2:::0.996):2.49):2.214):0.026,(((((Az:0.002,Ag2:0.023):2.11,As:2.027):1.697)#H1:0.0::0.944,Ap):0.187,Ar):0.723):5.943,(P,20):1.863,165);"); # 5th node = node number -7 (clau: previously -6). -net.root = 5 -@test_logs directEdges!(net); -@test !net.edge[12].isChild1 # or: directEdges! didn't correct the direction of 12th edge -@test !net.edge[23].isChild1 # or: directEdges! didn't correct the direction of 23th edge" -@test [!net.edge[i].containRoot for i in [8;collect(13:17)]] == [true for i in 1:6] -# or: "directEdges! didn't correct containRoot below a hyb node, $(i)th edge." -@test [net.edge[i].containRoot for i in [9,5,18,2]] == [true for i in 1:4] -# or: "directEdges! didn't correct containRoot of hyb edges." +net.rooti = 5 +@test_logs directedges!(net) +@test !net.edge[12].ischild1 +@test !net.edge[23].ischild1 +@test [!net.edge[i].containroot for i in [8;collect(13:17)]] == [true for i in 1:6] +# or: "directedges! didn't correct containroot below a hyb node, $(i)th edge." +@test [net.edge[i].containroot for i in [9,5,18,2]] == [true for i in 1:4] +# or: "directedges! didn't correct containroot of hyb edges." @test_logs rootatnode!(net, -10); # or: rootatnode! complained, node -10 @test_throws PhyloNetworks.RootMismatch rootatnode!(net, "M"); # println("the rootmismatch about node 5 is good and expected.") @@ -136,20 +172,20 @@ net.root = 5 # example with one hybridization below another if doalltests -net = readTopology("((((((((1,2),3),4),(5)#H1),(#H1,(6,7))))#H2,(8,9)),(#H2,10));"); -# sum([!e.containRoot for e in net.edge]) # only 4. -directEdges!(net); # or error("directEdges! says that the root position is incompatible with hybrids") -sum([!e.containRoot for e in net.edge]) == 16 || - error("directEdges! wrong on net with 2 stacked hybrids"); +# net with 2 stacked hybrids +net = readnewick("((((((((1,2),3),4),(5)#H1),(#H1,(6,7))))#H2,(8,9)),(#H2,10));"); +# sum([!e.containroot for e in net.edge]) # only 4. +directedges!(net); # or error("directedges! says that the root position is incompatible with hybrids") +@test sum([!e.containroot for e in net.edge]) == 16 plot(net, showedgenumber=true, showedgelength=false, shownodenumber=true); -net = readTopology("((((((((1,2),3),4),(5)#H1),(#H1,(6,7))))#H2,(8,9)),(#H2,10));"); -net.root=19; # node number -13 (clau: previously -12) -directEdges!(net); # or error("directEdges! says that the root position is incompatible with hybrids"); +net = readnewick("((((((((1,2),3),4),(5)#H1),(#H1,(6,7))))#H2,(8,9)),(#H2,10));"); +net.rooti=19; # node number -13 (clau: previously -12) +directedges!(net) end -net = readTopology("((((((((1,2),3),4),(5)#H1),(#H1,(6,7))))#H2,(8,9)),(#H2,10));"); -net.root=15; # node number -5 (clau: previously -4) -@test_throws PhyloNetworks.RootMismatch directEdges!(net); +net = readnewick("((((((((1,2),3),4),(5)#H1),(#H1,(6,7))))#H2,(8,9)),(#H2,10));"); +net.rooti=15; # node number -5 (clau: previously -4) +@test_throws PhyloNetworks.RootMismatch directedges!(net); # occursin(r"non-leaf node 9 had 0 children",e.msg)) @test_logs rootatnode!(net, -13); # or: rootatnode complained... @test_throws PhyloNetworks.RootMismatch rootatnode!(net, -5); @@ -159,37 +195,37 @@ net.root=15; # node number -5 (clau: previously -4) # earlier: """node 12 is a leaf. Will create a new node if needed, to set taxon "10" as outgroup.""" @test_logs rootatnode!(net,"10"); -end # of testset for directEdges! and re-rootings +end # of testset for directedges! and re-rootings @testset "testing preorder!" begin # on a tree, then on a network with h=2 global net -tre = readTopology("(((((((1,2),3),4),5),(6,7)),(8,9)),10);"); -net = readTopology("(((Ag,(#H1:7.159::0.056,((Ak,(E:0.08,#H2:0.0::0.004):0.023):0.078,(M:0.0)#H2:::0.996):2.49):2.214):0.026,(((((Az:0.002,Ag2:0.023):2.11,As:2.027):1.697)#H1:0.0::0.944,Ap):0.187,Ar):0.723):5.943,(P,20):1.863,165);"); +tre = readnewick("(((((((1,2),3),4),5),(6,7)),(8,9)),10);"); +net = readnewick("(((Ag,(#H1:7.159::0.056,((Ak,(E:0.08,#H2:0.0::0.004):0.023):0.078,(M:0.0)#H2:::0.996):2.49):2.214):0.026,(((((Az:0.002,Ag2:0.023):2.11,As:2.027):1.697)#H1:0.0::0.944,Ap):0.187,Ar):0.723):5.943,(P,20):1.863,165);"); if doalltests preorder!(tre) ## clau: previously [-1,10,-2,-9,9,8,-3,-8,7,6,-4,5,-5,4,-6,3,-7,2,1]; nodeN = [-2,10,-3,-10,9,8,-4,-9,7,6,-5,5,-6,4,-7,3,-8,2,1]; for i=1:length(tre.node) - tre.nodes_changed[i].number==nodeN[i] || - error("node pre-ordered $i is node number $(tre.nodes_changed[i].number) instead of $(nodeN[i])") + tre.vec_node[i].number==nodeN[i] || + error("node pre-ordered $i is node number $(tre.vec_node[i].number) instead of $(nodeN[i])") end end @test_logs preorder!(net) ## clau previously: [-1,14,-14,13,12,-2,-9,11,-10,10,-3,-4,-5,-6,-7,5,6,4,3,2,-12,9,-13,8,7,1]; nodeN = [-2,14,-15,13,12,-3,-10,11,-11,10,-4,-5,-6,-7,-8,5,6,4,3,2,-13,9,-14,8,7,1]; -@test [n.number for n in net.nodes_changed] == nodeN +@test [n.number for n in net.vec_node] == nodeN cui3str = "(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.458,(((((Xmontezumae,(Xnezahuacoyotl)#H26:0.247::0.804):0.375,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.997,Xcortezi):0.455):0.63,(#H26:0.0::0.196,((Xcontinens,Xpygmaeus):1.932,(Xnigrensis,Xmultilineatus):1.401):0.042):2.439):2.0)#H7:0.787::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.563::0.165):1.409,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.263):3.532):0.642):0.411):0.295):0.468):0.654):1.022):0.788):1.917)#H27:0.149::0.572):0.668,Xalvarezi):0.257,(Xsignum,#H27:1.381::0.428):4.669);" -net3 = readTopology(cui3str); +net3 = readnewick(cui3str); deleteleaf!(net3,"Xhellerii"); deleteleaf!(net3,"Xsignum"); deleteleaf!(net3,"Xmayae", simplify=false, unroot=true); # now: net3 has a 2-cycle -directEdges!(net3) +directedges!(net3) preorder!(net3) -@test [n.number for n in net3.nodes_changed] == [-3,25,-6,-8,-20,-21,-22,-23,-25,-26,-27,-28,24,23,22,21,20,-24,15,-10,-16,-17,-19,14,13,-18,12,11,-11,-14,10,-15,9,8,-12,7,6,5,19,18,17,16,-7,4,3,26] +@test [n.number for n in net3.vec_node] == [-3,25,-6,-8,-20,-21,-22,-23,-25,-26,-27,-28,24,23,22,21,20,-24,15,-10,-16,-17,-19,14,13,-18,12,11,-11,-14,10,-15,9,8,-12,7,6,5,19,18,17,16,-7,4,3,26] end # of testset for preorder! @@ -200,28 +236,28 @@ if doalltests cladewiseorder!(tre) nodeN = collect(19:-1:1); for i=1:length(tre.node) - tre.cladewiseorder_nodeIndex[i]==nodeN[i] || - error("node clade-wise ordered $i is $(tre.cladewiseorder_nodeIndex[i])th node instead of $(nodeN[i])th") + tre.vec_int1[i]==nodeN[i] || + error("node clade-wise ordered $i is $(tre.vec_int1[i])th node instead of $(nodeN[i])th") end end @test_logs cladewiseorder!(net) nodeN = collect(26:-1:1); -@test net.cladewiseorder_nodeIndex == nodeN +@test net.vec_int1 == nodeN end # of testset for cladewiseorder! @testset "testing rotate!" begin # to change the order of children edges at a given node if doalltests -net = readTopology("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); +net = readnewick("(A:1.0,((B:1.1,#H1:0.2::0.2):1.2,(((C:0.52,(E:0.5)#H2:0.02::0.7):0.6,(#H2:0.01::0.3,F:0.7):0.8):0.9,(D:0.8)#H1:0.3::0.8):1.3):0.7):0.1;"); rotate!(net, -5) ## clau: previously -4 [e.number for e in net.node[13].edge] == [14,12,15] || error("rotate didn't work at node -5"); ## clau: previously -4 plot(net); # just to check no error. end global net -net=readTopology("(4,((1,(2)#H7:::0.864):2.069,(6,5):3.423):0.265,(3,#H7:::0.136):10.0);"); +net=readnewick("(4,((1,(2)#H7:::0.864):2.069,(6,5):3.423):0.265,(3,#H7:::0.136):10.0);"); @test_logs rotate!(net, -2, orderedEdgeNum=[1,12,9]) @test [e.number for e in net.node[12].edge] == [1,12,9] # or: rotate didn't work at node -2 @@ -229,35 +265,45 @@ end # of testset for rotate @testset "other in manipulateNet" begin -net0 = readTopology("((((C:0.9)I1:0.1)I3:0.1,((A:1.0)I2:0.4)I3:0.6):1.4,(((B:0.2)H1:0.6)I2:0.5)I3:2.1);"); +net0 = readnewick("((((C:0.9)I1:0.1)I3:0.1,((A:1.0)I2:0.4)I3:0.6):1.4,(((B:0.2)H1:0.6)I2:0.5)I3:2.1);"); removedegree2nodes!(net0, true) # true: to keep the root of degree-2 -@test writeTopology(net0, round=true) == "((C:1.1,A:2.0):1.4,B:3.4);" +@test writenewick(net0, round=true) == "((C:1.1,A:2.0):1.4,B:3.4);" #--- delete above least stable ancestor ---# # 3 blobs above LSA: cut edge + level-2 blob + cut edge. -net = readTopology("(((((#H25)#H22:::0.8,#H22),((t2:0.1,t1))#H25:::0.7)));") +net = readnewick("(((((#H25)#H22:::0.8,#H22),((t2:0.1,t1))#H25:::0.7)));") PhyloNetworks.deleteaboveLSA!(net) -@test writeTopology(net) == "(t2:0.1,t1);" +@test writenewick(net) == "(t2:0.1,t1);" # 2 separate non-trivial clades + root edge -net = readTopology("((((t1,t2):0.1,(t3:0.3,t4)):0.4));") +net = readnewick("((((t1,t2):0.1,(t3:0.3,t4)):0.4));") PhyloNetworks.deleteaboveLSA!(net) -@test writeTopology(net) == "((t1,t2):0.1,(t3:0.3,t4));" +@test writenewick(net) == "((t1,t2):0.1,(t3:0.3,t4));" # 1 tip + 2-cycle above it, no extra root edge above, hybrid LSA -net = readTopology("((t1)#H22:::0.8,#H22);") +net = readnewick("((t1)#H22:::0.8,#H22);") PhyloNetworks.deleteaboveLSA!(net) -@test writeTopology(net) == "(t1)H22;" +@test writenewick(net) == "(t1)H22;" @test isempty(net.hybrid) -@test [n.name for n in net.nodes_changed] == ["H22","t1"] +@test [n.name for n in net.vec_node] == ["H22","t1"] # deleteleaf! and removedegree2nodes! when the root starts a 2-cycle -net = readTopology("((a,(((b)#H1,#H1))#H2),(#H2));") +net = readnewick("((a,(((b)#H1,#H1))#H2),(#H2));") deleteleaf!(net, "a") -@test writeTopology(net) == "((#H2),(((b)#H1,#H1))#H2);" +@test writenewick(net) == "((#H2),(((b)#H1,#H1))#H2);" removedegree2nodes!(net) -@test writeTopology(net) == "((((b)#H1,#H1))#H2,#H2);" -net = readTopology("((a,(((b)#H1,#H1))#H2),#H2);") # no degree-2 node adjacent to root this time +@test writenewick(net) == "((((b)#H1,#H1))#H2,#H2);" +net = readnewick("((a,(((b)#H1,#H1))#H2),#H2);") # no degree-2 node adjacent to root this time deleteleaf!(net, "a", unroot=true) -@test writeTopology(net) == "(b)H1;" +@test writenewick(net) == "(b)H1;" + +# unzip_canonical! and rezip_canonical! +netstr = "(#H2:0.1::0.2,((C:0.2,((B:0.3)#H1:0.4)#H2:0.5::0.8):0.6,(#H1:0.7,((A1:0.8)#H3:0.01,(A2:0.9,#H3:0.02):0.03):1.0):1.1):1.2,O:1.3);" +net = readnewick(netstr) +# 2 reticulation in a hybrid ladder, and another isolated reticulation +undoinfo = PhyloNetworks.unzip_canonical!(net) +@test all(getchildedge(h).length == 0.0 for h in net.hybrid) # unzipped +@test writenewick(net, round=true) == "(#H2:0.8::0.2,((C:0.2,((B:0.0)#H1:0.0)#H2:1.2::0.8):0.6,(#H1:1.0,((A1:0.0)#H3:0.81,(A2:0.9,#H3:0.82):0.03):1.0):1.1):1.2,O:1.3);" +PhyloNetworks.rezip_canonical!(undoinfo...) +@test writenewick(net, round=true) == netstr end # of testset for other functions in manipulateNet diff --git a/test/test_moves_semidirected.jl b/test/test_moves_semidirected.jl index e1df91a9b..4a65d0cc2 100644 --- a/test/test_moves_semidirected.jl +++ b/test/test_moves_semidirected.jl @@ -4,31 +4,24 @@ using PhyloNetworks using Random =# -@testset "moveTargetUpdate! reject 2-cycle proposal" begin -net3c_newick = "(1,2,(((3,4))#H1:::0.6,(#H1:::0.4,(5,6))));" # 3-cycle adjacent to 3 cherries -net3 = readTopologyLevel1(net3c_newick) -# net3.node[6].isBadTriangle : not isVeryBadTriangle nor isExtBadTriangle -hn = net3.hybrid[1] # more robust than net3.node[6] -tmp = PhyloNetworks.moveTargetUpdate!(net3, hn, getparentedge(hn), net3.edge[11]) -@test !any(tmp) -end + @testset "unconstrained NNI moves" begin str_level1 = "(((S8,S9),(((((S1,S2,S3),S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" -net_level1 = readTopology(str_level1); # this network has a polytomy at node -9 +net_level1 = readnewick(str_level1); # this network has a polytomy at node -9 # same topology as: rootatnode!(net_level1, -3). edges 1:22 str_nontreechild = "((((Ag,E))#H3,(#H1:7.159::0.056,((M:0.0)#H2:::0.996,(Ak,(#H3:0.08,#H2:0.0::0.004):0.023):0.078):2.49):2.214):0.026,((Az:2.13,As:2.027):1.697)#H1:0.0::0.944,Ap);" -net_nontreechild = readTopology(str_nontreechild); +net_nontreechild = readnewick(str_nontreechild); # problem: the plot has an extra vertical segment, for a clade that's not in the major tree # --> fix that in PhyloPlots (fixit) str_hybridladder = "(#H2:::0.2,((C,((B)#H1)#H2:::0.8),(#H1,(A1,A2))),O);" -net_hybridladder = readTopology(str_hybridladder); +net_hybridladder = readnewick(str_hybridladder); -@test isnothing(nni!(net_level1, net_level1.edge[1], 0x01, true, true)) # external edge +@test isnothing(nni!(net_level1.edge[1], 0x01, true, true)) # external edge @testset "level1 edge 3: BB undirected move $move" for move in 0x01:0x08 - undoinfo = nni!(net_level1, net_level1.edge[3], move, true, true); + undoinfo = nni!(net_level1.edge[3], move, true, true); #location of v node (number -4) nodes = [n.number for n in net_level1.edge[20].node] #α's connections if move in [1, 2, 6, 8] #check that edge α connected to v @@ -46,34 +39,33 @@ net_hybridladder = readTopology(str_hybridladder); # check directionality if move in [3, 4, 5, 7] # keeping α, β or flipping uv keeps node -4 as child of edge 3 - @test PhyloNetworks.getchild(net_level1.edge[3]).number == -4 + @test getchild(net_level1.edge[3]).number == -4 else # switching α, β AND flipping uv or doing neither makes node -3 child of edge 3 - @test PhyloNetworks.getchild(net_level1.edge[3]).number == -3 + @test getchild(net_level1.edge[3]).number == -3 end - # undo move - nni!(undoinfo...); + nni!(undoinfo...); # undo the move # confirm we're back to original topology - @test writeTopology(net_level1) == str_level1 + @test writenewick(net_level1) == str_level1 end # of level1 edge 3: BB undirected @testset "level1 test edge 13: BR directed move $move" for move in 0x01:0x03 # e.hybrid and tree parent: BR case, 3 moves because e cannot contain the root # 3cycle test: α connected to γ so move 1 will create 3 cycles. if move == 0x01 - @test isnothing(nni!(net_level1, net_level1.edge[13], move, true, true)) # would create a 3cycle + @test isnothing(nni!(net_level1.edge[13], move, true, true)) # would create a 3cycle # move 1 would create a 3 cycle, but should work if we don't forbid 3cycles - undoinfo = nni!(net_level1, net_level1.edge[13], move, true, false); #no3cycle=false + undoinfo = nni!(net_level1.edge[13], move, true, false); # no3cycle=false nodes = [n.number for n in net_level1.edge[17].node] @test 8 in nodes # check that edge α connected to v nodes = [n.number for n in net_level1.edge[11].node] @test !(-11 in nodes) - @test PhyloNetworks.getchild(net_level1.edge[13]).number == -11 + @test getchild(net_level1.edge[13]).number == -11 nni!(undoinfo...); # undo move - @test writeTopology(net_level1) == "(((S8,S9),(((((S1,S2,S3),S4),(S5:0.0)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" + @test writenewick(net_level1) == "(((S8,S9),(((((S1,S2,S3),S4),(S5:0.0)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" # confirm we're back to original topology (but now with 0.0 branch lengths) else - undoinfo = nni!(net_level1, net_level1.edge[13], move, true, false); + undoinfo = nni!(net_level1.edge[13], move, true, false); # test that move was made nodes = [n.number for n in net_level1.edge[17].node] if move == 0x03 @@ -89,15 +81,15 @@ end # of level1 edge 3: BB undirected @test !(-11 in nodes) end # check directionality - @test PhyloNetworks.getchild(net_level1.edge[13]).number == 8 + @test getchild(net_level1.edge[13]).number == 8 nni!(undoinfo...); # undo move - @test writeTopology(net_level1) == "(((S8,S9),(((((S1,S2,S3),S4),(S5:0.0)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));"# confirm we're back to original topology + @test writenewick(net_level1) == "(((S8,S9),(((((S1,S2,S3),S4),(S5:0.0)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));"# confirm we're back to original topology end end # of level1 edge 13: BR directed @testset "level1 edge 16: BB directed move $move" for move in 0x01:0x02 # e not hybrid, tree parent: BB case, 2 NNIs if directed, 8 if undirected - undoinfo = nni!(net_level1, net_level1.edge[16], move, true, true); + undoinfo = nni!(net_level1.edge[16], move, true, true); nodes = [n.number for n in net_level1.edge[13].node] #β's connections @test -11 in nodes #check β connected to u node (number -11) nodes = [n.number for n in net_level1.edge[14].node] #γ's connections @@ -107,14 +99,14 @@ end # of level1 edge 13: BR directed @test -11 in nodes end # check directionality node -11 child of edge 16 in both cases - @test PhyloNetworks.getchild(net_level1.edge[16]).number == -11 + @test getchild(net_level1.edge[16]).number == -11 nni!(undoinfo...); # undo move - @test writeTopology(net_level1) == "(((S8,S9),(((((S1,S2,S3),S4),(S5:0.0)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" + @test writenewick(net_level1) == "(((S8,S9),(((((S1,S2,S3),S4),(S5:0.0)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" # confirm we're back to original topology end #of level1 edge 16: BB directed # BB directed has two allowed moves, so 0x03 should throw an exception -@test_throws Exception nni!(net_level1, net_level1.edge[16], 0x03); +@test_throws Exception nni!(net_level1.edge[16], 0x03); @testset "level1 edge 17: BB directed with 4cycle move $move" for move in 0x01:0x02 # no3cycle test @@ -122,34 +114,34 @@ end #of level1 edge 16: BB directed # β is connected in a 4 cycle with γ so a move that makes γ and β a pair # would create a 3 cycle if move == 0x01 - undoinfo = nni!(net_level1, net_level1.edge[17], move, true, true); + undoinfo = nni!(net_level1.edge[17], move, true, true); nodes = [n.number for n in net_level1.edge[12].node] #β's connections @test -6 in nodes #check β connected to u node (number -6) nodes = [n.number for n in net_level1.edge[13].node] #γ's connections #check that edge γ connected to v @test -11 in nodes # check directionality node -6 child of edge 17 in both cases - @test PhyloNetworks.getchild(net_level1.edge[17]).number == -6 + @test getchild(net_level1.edge[17]).number == -6 nni!(undoinfo...); # undo move - @test writeTopology(net_level1) == "(((S8,S9),(((((S1,S2,S3),S4),(S5:0.0)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" + @test writenewick(net_level1) == "(((S8,S9),(((((S1,S2,S3),S4),(S5:0.0)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" else - @test isnothing(nni!(net_level1, net_level1.edge[17], move, true, true)) - undoinfo = nni!(net_level1, net_level1.edge[17], move, true, false) #should work if we dont check for 3cycles + @test isnothing(nni!(net_level1.edge[17], move, true, true)) + undoinfo = nni!(net_level1.edge[17], move, true, false) # should work if we dont check for 3cycles nodes = [n.number for n in net_level1.edge[12].node] #β's connections @test -6 in nodes #check β connected to u node (number -6) nodes = [n.number for n in net_level1.edge[13].node] #γ's connections #check that edge γ connected to u @test -6 in nodes # check directionality node -11 child of edge 17 in both cases - @test PhyloNetworks.getchild(net_level1.edge[17]).number == -6 + @test getchild(net_level1.edge[17]).number == -6 nni!(undoinfo...); # undo move - @test writeTopology(net_level1) == "(((S8,S9),(((((S1,S2,S3),S4),(S5:0.0)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" + @test writenewick(net_level1) == "(((S8,S9),(((((S1,S2,S3),S4),(S5:0.0)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" end end # of level1 edge 17: BB directed @testset "level1 edge 18: RR (directed) move $move" for move in 0x01:0x04 # RB case, 4 moves. uv edge cannot contain the root (always directed) - undoinfo = nni!(net_level1, net_level1.edge[18], move, true, true); + undoinfo = nni!(net_level1.edge[18], move, true, true); #test that move was made nodes = [n.number for n in net_level1.edge[19].node] #α's connections if move in [0x01, 0x03] @@ -164,16 +156,15 @@ end # of level1 edge 17: BB directed @test !(11 in nodes) end #check directionality (should point toward u, node 11) - @test PhyloNetworks.getchild(net_level1.edge[18]).number == 11 + @test getchild(net_level1.edge[18]).number == 11 nni!(undoinfo...); - # edge constrained at 0.0 now - @test writeTopology(net_level1) == "(((S8,S9),(((((S1,S2,S3),S4),(S5:0.0)#H1),(#H1,(S6,S7))):0.0)#H2),(#H2,S10));" + # edge below hybrid of length 0.0 now + @test writenewick(net_level1) == "(((S8,S9),(((((S1,S2,S3),S4),(S5:0.0)#H1),(#H1,(S6,S7))):0.0)#H2),(#H2,S10));" end # of level1 edge 18: RR (directed) @testset "non tree child net edge 3: RB (directed) move $move" for move in 0x01:0x04 # RB case, 4 moves. uv edge cannot contain the root - undoinfo = nni!(net_nontreechild, net_nontreechild.edge[3], move, true, true); - #test that move was made + undoinfo = nni!(net_nontreechild.edge[3], move, true, true); #location of v node (node -5) nodes = [n.number for n in net_nontreechild.edge[4].node] #α's connections if move in [0x01, 0x03] @@ -190,11 +181,10 @@ end # of level1 edge 18: RR (directed) @test !(3 in nodes) end #check directionality (should point toward u, node 3) - @test PhyloNetworks.getchild(net_nontreechild.edge[3]).number == 3 - #undo move + @test getchild(net_nontreechild.edge[3]).number == 3 nni!(undoinfo...); - # keep constrained edges at 0.0, but otherwise topology completely restored - @test writeTopology(net_nontreechild) == "((((Ag,E):0.0)#H3,(#H1:7.159::0.056,((M:0.0)#H2:::0.996,(Ak,(#H3:0.08,#H2:0.0::0.004):0.023):0.078):2.49):2.214):0.026,((Az:2.13,As:2.027):1.697)#H1:0.0::0.944,Ap);" + # length 0.0 below hybrid, but otherwise topology completely restored + @test writenewick(net_nontreechild) == "((((Ag,E):0.0)#H3,(#H1:7.159::0.056,((M:0.0)#H2:::0.996,(Ak,(#H3:0.08,#H2:0.0::0.004):0.023):0.078):2.49):2.214):0.026,((Az:2.13,As:2.027):1.697)#H1:0.0::0.944,Ap);" end #of non tree child net edge 5: RB (directed) @testset "hybrid ladder net edge 1: BR undirected (u at root, potential nonDAG, 3cycle) move $move" for move in 0x01:0x06 @@ -204,37 +194,37 @@ end #of non tree child net edge 5: RB (directed) # moves 1 and 3 in the notes correspond to 1, 1' and 3, 3' (1, 4 and 3, 6) # 3cycle check: could create 3 cycle (α connected to γ) so moves 1 and 5 forbidden if move in [0x01, 0x03, 0x05, 0x06] # DAG check - @test isnothing(nni!(net_hybridladder, net_hybridladder.edge[1], move, false, true)) + @test isnothing(nni!(net_hybridladder.edge[1], move, false, true)) end if move in [0x01, 0x05] # 3cycle check - @test isnothing(nni!(net_hybridladder, net_hybridladder.edge[1], move, true, true)) + @test isnothing(nni!(net_hybridladder.edge[1], move, true, true)) end if move == 0x04 - undoinfo = nni!(net_hybridladder, net_hybridladder.edge[1], move, false, true); + undoinfo = nni!(net_hybridladder.edge[1], move, false, true); nodes = [n.number for n in net_hybridladder.edge[12].node] # α @test !(1 in nodes) # check that edge α is connected to v nodes = [n.number for n in net_hybridladder.edge[4].node] # δ's connections @test -2 in nodes # check that edge δ is connected to u # check directionality (edge should point toward u, node -2) - @test PhyloNetworks.getchild(net_hybridladder.edge[1]).number == 1 + @test getchild(net_hybridladder.edge[1]).number == 1 nni!(undoinfo...); - @test writeTopology(net_hybridladder)== "(#H2:::0.2,((C,((B)#H1:0.0)#H2:::0.8),(#H1,(A1,A2))),O);" # restored but edge below hybrid node constrained at 0.0 + @test writenewick(net_hybridladder)== "(#H2:::0.2,((C,((B)#H1:0.0)#H2:::0.8),(#H1,(A1,A2))),O);" # restored but edge below hybrid node constrained at 0.0 elseif move == 0x02 - undoinfo = nni!(net_hybridladder, net_hybridladder.edge[1], move, true, true); + undoinfo = nni!(net_hybridladder.edge[1], move, true, true); nodes = [n.number for n in net_hybridladder.edge[12].node] # α @test !(1 in nodes) # check that edge α not connected to v nodes = [n.number for n in net_hybridladder.edge[4].node] # δ's connections @test -2 in nodes # δ connected to u # check directionality (edge should point toward u, node -2) - @test PhyloNetworks.getchild(net_hybridladder.edge[1]).number == 1 + @test getchild(net_hybridladder.edge[1]).number == 1 nni!(undoinfo...); - @test writeTopology(net_hybridladder) == "(#H2:::0.2,((C,((B)#H1:0.0)#H2:::0.8),(#H1,(A1,A2))),O);" # restored but edge below hybrid node constrained at 0.0 + @test writenewick(net_hybridladder) == "(#H2:::0.2,((C,((B)#H1:0.0)#H2:::0.8),(#H1,(A1,A2))),O);" # restored but edge below hybrid node constrained at 0.0 end end # of hybrid ladder net edge 1: BR undirected @testset "hybrid ladder net edge 4: RR (directed) move $move" for move in 0x01:0x02 # RR case, 2 moves. uv edge cannot contain the root (always directed) - undoinfo = nni!(net_hybridladder, net_hybridladder.edge[4], move, false, true); + undoinfo = nni!(net_hybridladder.edge[4], move, false, true); #test that move was made nodes = [n.number for n in net_hybridladder.edge[5].node] #α's connections if move == 0x01 #check that edge α connected to v @@ -246,10 +236,9 @@ end # of hybrid ladder net edge 1: BR undirected nodes = [n.number for n in net_hybridladder.edge[3].node] @test 1 in nodes #check directionality (should point toward u, node 1) - @test PhyloNetworks.getchild(net_hybridladder.edge[4]).number == 1 - #undo move + @test getchild(net_hybridladder.edge[4]).number == 1 nni!(undoinfo...); - @test writeTopology(net_hybridladder) == "(#H2:::0.2,((C,((B)#H1:0.0)#H2:::0.8),(#H1,(A1,A2))),O);" # restored but edge below hybrid node constrained at 0.0 + @test writenewick(net_hybridladder) == "(#H2:::0.2,((C,((B)#H1:0.0)#H2:::0.8),(#H1,(A1,A2))),O);" # restored but edge below hybrid node constrained at 0.0 end #of hybrid ladder net edge 4: RR (directed) @testset "hybrid ladder net edge 5: BR undirected move $move" for move in 0x01:0x06 @@ -259,10 +248,10 @@ end #of hybrid ladder net edge 4: RR (directed) # DAG test: # no path from α -> γ or β -> γ so all moves should work if move in [0x01, 0x05] - @test isnothing(nni!(net_hybridladder, net_hybridladder.edge[5], move, false, true)) # 3-cycles forbidden - undoinfo = nni!(net_hybridladder, net_hybridladder.edge[5], move, false, false) # 3-cycles allowed + @test isnothing(nni!(net_hybridladder.edge[5], move, false, true)) # 3-cycles forbidden + undoinfo = nni!(net_hybridladder.edge[5], move, false, false) # 3-cycles allowed else - undoinfo = nni!(net_hybridladder, net_hybridladder.edge[5], move, false, true); + undoinfo = nni!(net_hybridladder.edge[5], move, false, true); end #tests for all moves: nodes = [n.number for n in net_hybridladder.edge[6].node] #α @@ -280,23 +269,22 @@ end #of hybrid ladder net edge 4: RR (directed) #check directionality if move in [0x01, 0x05] #(edge should point toward u, node -4) - @test PhyloNetworks.getchild(net_hybridladder.edge[5]).number == -4 + @test getchild(net_hybridladder.edge[5]).number == -4 else - @test PhyloNetworks.getchild(net_hybridladder.edge[5]).number == 1 + @test getchild(net_hybridladder.edge[5]).number == 1 end - #undo move nni!(undoinfo...); - @test writeTopology(net_hybridladder) == "(#H2:::0.2,((C,((B)#H1:0.0)#H2:::0.8),(#H1,(A1,A2))),O);" # restored but edge below hybrid node constrained at 0.0 + @test writenewick(net_hybridladder) == "(#H2:::0.2,((C,((B)#H1:0.0)#H2:::0.8),(#H1,(A1,A2))),O);" # restored but edge below hybrid node constrained at 0.0 end #of hybrid ladder net edge 5: BR undirected @testset "hybrid ladder net edge 12: BB undirected (edge below root) move $move" for move in 0x01:0x08 # BB case, 8 moves. uv edge can contain the root. no flip. # no3cycle: moves 1, 4, 5, 8 would create a 3 cycle because α is connected to γ if move in [0x01, 0x04, 0x05, 0x08] - @test isnothing(nni!(net_hybridladder, net_hybridladder.edge[12], move, true, true)) - undoinfo = nni!(net_hybridladder, net_hybridladder.edge[12], move, true, false); + @test isnothing(nni!(net_hybridladder.edge[12], move, true, true)) + undoinfo = nni!(net_hybridladder.edge[12], move, true, false); else - undoinfo = nni!(net_hybridladder, net_hybridladder.edge[12], move, true, true); + undoinfo = nni!(net_hybridladder.edge[12], move, true, true); end nodes = [n.number for n in net_hybridladder.edge[1].node] #α if move in [0x01, 0x02, 0x06, 0x08] @@ -311,14 +299,13 @@ end #of hybrid ladder net edge 5: BR undirected @test !(-2 in nodes) end #check directionality - @test PhyloNetworks.getchild(net_hybridladder.edge[12]).number == -3 - #undo move + @test getchild(net_hybridladder.edge[12]).number == -3 nni!(undoinfo...); - @test writeTopology(net_hybridladder) == "(#H2:::0.2,((C,((B)#H1:0.0)#H2:::0.8),(#H1,(A1,A2))),O);" # restored but edge below hybrid node constrained at 0.0 + @test writenewick(net_hybridladder) == "(#H2:::0.2,((C,((B)#H1:0.0)#H2:::0.8),(#H1,(A1,A2))),O);" # restored but edge below hybrid node constrained at 0.0 end # of hybrid ladder net edge 12: BB undirected (edge below root) @testset "test isdescendant and isconnected functions" begin - net_level1 = readTopology(str_level1); + net_level1 = readnewick(str_level1); @test PhyloNetworks.isdescendant(net_level1.node[7], net_level1.node[17]) # nodes -9, -6 @test !PhyloNetworks.isdescendant(net_level1.node[7], net_level1.node[3]) # nodes -9, -4 @test PhyloNetworks.isdescendant(net_level1.node[15], net_level1.node[17]) # nodes -12, -6 @@ -326,7 +313,7 @@ end # of hybrid ladder net edge 12: BB undirected (edge below root) @test PhyloNetworks.isconnected(net_level1.node[12], net_level1.node[17]) # nodes -7, -6 @test !PhyloNetworks.isconnected(net_level1.node[12], net_level1.node[19]) # nodes -7, -3 # mess up the direction of some tree edges, then check descendence relationships with isdescendant_undirected - for i in [4,5,6,7,9,10,12,17,3,20] net_level1.edge[i].isChild1 = !net_level1.edge[i].isChild1; end + for i in [4,5,6,7,9,10,12,17,3,20] net_level1.edge[i].ischild1 = !net_level1.edge[i].ischild1; end @test PhyloNetworks.isdescendant_undirected(net_level1.node[7], net_level1.node[17], net_level1.edge[18]) @test !PhyloNetworks.isdescendant_undirected(net_level1.node[7], net_level1.node[3], net_level1.edge[3]) @test PhyloNetworks.isdescendant_undirected(net_level1.node[15], net_level1.node[17], net_level1.edge[18]) @@ -341,7 +328,7 @@ end # of testset on unconstrained NNIs @testset "species constraints" begin # multiple individuals from each species str_level1_s = "(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" # indviduals S1A S1B S1C go on leaf 1 -net_level1_s = readTopology(str_level1_s) +net_level1_s = readnewick(str_level1_s) # test breakedge! function newnode, newedge = PhyloNetworks.breakedge!(net_level1_s.edge[4], net_level1_s); @@ -350,37 +337,37 @@ newnode, newedge = PhyloNetworks.breakedge!(net_level1_s.edge[4], net_level1_s); @test newnode.edge[1].number == 4 @test newnode.edge[2].number == 21 @test PhyloNetworks.getparent(net_level1_s.edge[4]) === newnode -@test PhyloNetworks.getchild(newedge) === newnode +@test getchild(newedge) === newnode # test addleaf! function -net_level1_s = readTopology(str_level1_s) +net_level1_s = readnewick(str_level1_s) PhyloNetworks.addleaf!(net_level1_s, net_level1_s.node[4], "S1A"); @test !net_level1_s.node[findfirst([n.number == 3 for n in net_level1_s.node])].leaf PhyloNetworks.addleaf!(net_level1_s, net_level1_s.node[4], "S1B"); PhyloNetworks.addleaf!(net_level1_s, net_level1_s.node[4], "S1C"); -@test net_level1_s.edge[21].containRoot == false # check containRoot on edge 4 and exterior edges -@test net_level1_s.edge[22].containRoot == false -@test PhyloNetworks.getchild(net_level1_s.edge[21]).name == "S1A" -@test PhyloNetworks.getchild(net_level1_s.edge[22]).name == "S1B" +@test net_level1_s.edge[21].containroot == false # check containroot on edge 4 and exterior edges +@test net_level1_s.edge[22].containroot == false +@test getchild(net_level1_s.edge[21]).name == "S1A" +@test getchild(net_level1_s.edge[22]).name == "S1B" # test addleaf! on edge -net_level1_s = readTopology(str_level1_s) +net_level1_s = readnewick(str_level1_s) PhyloNetworks.addleaf!(net_level1_s, net_level1_s.edge[4], "S1A"); @test length(net_level1_s.node) == 21 @test net_level1_s.node[21].leaf # test addindividuals! function -net_level1_s = readTopology(str_level1_s) +net_level1_s = readnewick(str_level1_s) PhyloNetworks.addindividuals!(net_level1_s, "S1", ["S1A", "S1B", "S1C"]) @test !net_level1_s.node[findfirst([n.number == 3 for n in net_level1_s.node])].leaf @test length(net_level1_s.node[findfirst([n.number == 3 for n in net_level1_s.node])].edge) == 4 # spaces in name -net_level1_s = readTopology(str_level1_s) +net_level1_s = readnewick(str_level1_s) @test_logs (:warn, r"^species S 1 not") PhyloNetworks.addindividuals!(net_level1_s, "S 1", ["S1A", "S1B", "S1C"]) -@test writeTopology(net_level1_s) == str_level1_s # network unchanged +@test writenewick(net_level1_s) == str_level1_s # network unchanged @test_logs (:warn, r"^Spaces in \"S1 A\" may cause errors") PhyloNetworks.addindividuals!(net_level1_s, "S1", ["S1 A", "S1B", "S1C"]) -@test writeTopology(net_level1_s) == "(((S8,S9),(((((S1_A,S1B,S1C)S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" +@test writenewick(net_level1_s) == "(((S8,S9),(((((S1_A,S1B,S1C)S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" # test mapindividuals function -net_level1_s = readTopology(str_level1_s) +net_level1_s = readnewick(str_level1_s) # in net env filename = joinpath(@__DIR__, "..","examples","mappingIndividuals.csv") # filename = abspath(joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "mappingIndividuals.csv")) @@ -388,9 +375,19 @@ net_level1_i, c_species = PhyloNetworks.mapindividuals(net_level1_s, filename) @test string(c_species[1]) == "Species constraint, on tips: S1A, S1B, S1C\n stem edge number 4\n crown node number 3" @test c_species[1].taxonnames == ["S1A","S1B","S1C"] @test c_species[1].taxonnums == Set([11,12,13]) -@test writeTopology(net_level1_i) == "(((S8,S9),(((((S1A,S1B,S1C)S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" +@test c_species[1].node.number == 3 +@test writenewick(net_level1_i) == "(((S8,S9),(((((S1A,S1B,S1C)S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" + +# updateconstraints! +PhyloNetworks.resetnodenumbers!(net_level1_i) +net_level1_i.node[22].number = 100 # S1C +PhyloNetworks.updateconstraints!(c_species, net_level1_i) +@test c_species[1].taxonnums == Set([8,9,100]) +@test c_species[1].node.number == 21 # S1, now internal node +@test getparent(net_level1_i.node[22]).number == 21 # test clade constraint contructor +net_level1_i, c_species = PhyloNetworks.mapindividuals(net_level1_s, filename) c_clade = PhyloNetworks.TopologyConstraint(0x02, ["S1A","S1B","S1C","S4"], net_level1_i) @test string(c_clade) == "Clade constraint, on tips: S1A, S1B, S1C, S4\n stem edge number 6\n crown node number -8" @@ -400,59 +397,61 @@ c_clade = PhyloNetworks.TopologyConstraint(0x02, ["S1A","S1B","S1C","S4"], net_l @test_throws ErrorException PhyloNetworks.TopologyConstraint(0x02, ["S1A", "S8"], net_level1_i) # not a clade # NNIs under species constraints -Random.seed!(1234); +str_level1_i = "(((S8,S9),(((((S1A,S1B,S1C)S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" +str_0belowH1 = "(((S8,S9),(((((S1A,S1B,S1C)S1,S4),(S5:0.0)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" +# tests pass under julia v1.10 with `Random.seed!(1234)` but fail under julia v1.11 RNG +rng = StableRNG(222) # to propose these moves: 1,2,... (ei=8), 6,... (ei=3), 1,2 (ei=9) # no nni on stem edge for species example -@test isnothing(nni!(net_level1_i , net_level1_i.edge[4], true, true, c_species)) +@test isnothing(nni!(rng, net_level1_i , net_level1_i.edge[4], true, true, c_species)) @testset "NNI, 1 species constraint, net level 1, edge $ei" for ei in [8,3,9] # 8: BR directed, 3: BB undirected, 9: BB directed, 15: RB directed # note: there are no cases of RR directed in net_level1_i - undoinfo = nni!(net_level1_i , net_level1_i.edge[ei], true, true, c_species); + undoinfo = nni!(rng, net_level1_i , net_level1_i.edge[ei], true, true, c_species); @test undoinfo !== nothing - nni!(undoinfo...); - # restored to original network, except that edges below hybrid nodes will now have length 0.0 - @test writeTopology(net_level1_i) == "(((S8,S9),(((((S1A,S1B,S1C)S1,S4),(S5:0.0)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" + nni!(undoinfo...); # orignal net restored, except when ei=8 move 2: length 0 below H1 + @test writenewick(net_level1_i) == (ei==8 ? str_0belowH1 : str_level1_i) + net_level1_i.edge[7].length = -1 # reset to missing edge length end -# TODO: BR case edge 8: nni move 3 causes problems. hybrid node 6 has 0 or 2+ major hybrid parents end # of species constraints @testset "test move root & constraint checking under species & clade constraints" begin # "(((S8,S9),(((((S1A,S1B,S1C)S1,S4),#H1),((S5)#H1,(S6,S7))))#H2),(#H2,S10));" -netl1_i = readTopology("(((((S1A,S1B,S1C)S1,S4),#H1),((S5)#H1,(S6,S7))));") +netl1_i = readnewick("(((((S1A,S1B,S1C)S1,S4),#H1),((S5)#H1,(S6,S7))));") con = [PhyloNetworks.TopologyConstraint(0x01, ["S1A","S1B","S1C"], netl1_i), PhyloNetworks.TopologyConstraint(0x02, ["S5","S6","S7"], netl1_i)] Random.seed!(765); @test PhyloNetworks.moveroot!(netl1_i, con) # only 2 options -writeTopology(netl1_i) == "(((S1A,S1B,S1C)S1,S4),#H1,(((S5)#H1,(S6,S7))));" # now unrooted +writenewick(netl1_i) == "(((S1A,S1B,S1C)S1,S4),#H1,(((S5)#H1,(S6,S7))));" # now unrooted @test PhyloNetworks.moveroot!(netl1_i, con) # only 1 option -writeTopology(netl1_i) == "((S1A,S1B,S1C)S1,S4,(#H1,(((S5)#H1,(S6,S7)))));" -netl1_i.root = 14 # back to original rooted network. This node is still of degree 2 +writenewick(netl1_i) == "((S1A,S1B,S1C)S1,S4,(#H1,(((S5)#H1,(S6,S7)))));" +netl1_i.rooti = 14 # back to original rooted network. This node is still of degree 2 @test !PhyloNetworks.checkspeciesnetwork!(netl1_i, con) # false: root *at* clade crown -@test netl1_i.root == 13 # now unrooted (via removedegree2nodes!), root was moved, con[2] stem edge was deleted too... -netl1_i.root = 7; directEdges!(netl1_i) # move root strictly above clade crown +@test netl1_i.rooti == 13 # now unrooted (via removedegree2nodes!), root was moved, con[2] stem edge was deleted too... +netl1_i.rooti = 7; directedges!(netl1_i) # move root strictly above clade crown con[2] = PhyloNetworks.TopologyConstraint(0x02, ["S5","S6","S7"], netl1_i) @test PhyloNetworks.checkspeciesnetwork!(netl1_i, con) # now fine: root *above* clade crown -undoinfo = nni!(netl1_i,netl1_i.edge[8],0x01,false,false); +undoinfo = nni!(netl1_i.edge[8],0x01,false,false); @test !PhyloNetworks.checkspeciesnetwork!(netl1_i, con) nni!(undoinfo...); @test PhyloNetworks.checkspeciesnetwork!(netl1_i, con) -undoinfo = nni!(netl1_i,netl1_i.edge[8],0x03,false,false) # creates a 2-cycle -@test netl1_i.numEdges == 13 +undoinfo = nni!(netl1_i.edge[8],0x03,false,false) # creates a 2-cycle +@test netl1_i.numedges == 13 PhyloNetworks.deletehybridedge!(netl1_i, netl1_i.edge[10]) -@test netl1_i.numEdges == 10 # 2-cycle removed -netl1_i = readTopology("(((S1A,S1B,S1C),S4),#H1,((S5)#H1,(S6,S7)));") -undoinfo = nni!(netl1_i,netl1_i.edge[12],0x03,false,false) # 4-cycle now -@test nni!(netl1_i,netl1_i.edge[12],0x02,true,true) === nothing # would create a 3-cycle +@test netl1_i.numedges == 10 # 2-cycle removed +netl1_i = readnewick("(((S1A,S1B,S1C),S4),#H1,((S5)#H1,(S6,S7)));") +undoinfo = nni!(netl1_i.edge[12],0x03,false,false) # 4-cycle now +@test nni!(netl1_i.edge[12],0x02,true,true) === nothing # would create a 3-cycle end #= str_level1 = "(((S8,S9),(((((S1,S2,S3),S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" -net_level1 = readTopology(str_level1); #polytomy at node -9 for leaves 3, 4, 5 +net_level1 = readnewick(str_level1); #polytomy at node -9 for leaves 3, 4, 5 str_nontreechild = "((((Ag,E))#H3,(#H1:7.159::0.056,((M:0.0)#H2:::0.996,(Ak,(#H3:0.08,#H2:0.0::0.004):0.023):0.078):2.49):2.214):0.026,((Az:2.13,As:2.027):1.697)#H1:0.0::0.944,Ap);" -net_nontreechild = readTopology(str_nontreechild); +net_nontreechild = readnewick(str_nontreechild); str_polytomy_species = "(((S8,S9),(((((S1,S2,S3),S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));" -net_species = readTopology(str_polytomy_species); +net_species = readnewick(str_polytomy_species); =# #= @@ -479,18 +478,18 @@ end # of constrained NNI moves @testset "test fliphybrid!" begin # simple network -n6h1 = readTopology("((((1:0.2,2:0.2):2.4,((3:0.4,4:0.4):1.1)#H1:1.1):2.0,(#H1:0.0::0.3,5:1.5):3.1):1.0,6:5.6);") +n6h1 = readnewick("((((1:0.2,2:0.2):2.4,((3:0.4,4:0.4):1.1)#H1:1.1):2.0,(#H1:0.0::0.3,5:1.5):3.1):1.0,6:5.6);") n6h1d = deepcopy(n6h1) # hybrid node = node number 5 @test !isnothing(PhyloNetworks.fliphybrid!(n6h1, n6h1.hybrid[1])) # flips minor by default @test n6h1.hybrid[1].number == -8 @test !isnothing(PhyloNetworks.fliphybrid!(n6h1d, n6h1d.hybrid[1], false)) # flips major edge @test n6h1d.hybrid[1].number == -4 @test n6h1d.hybrid[1].name == "H1" -@test writeTopology(n6h1d) == "((#H1:2.0::0.3,(((3:0.4,4:0.4):1.1,((1:0.2,2:0.2):2.4)#H1:1.1::0.7):0.0,5:1.5):3.1):1.0,6:5.6);" +@test writenewick(n6h1d) == "((#H1:2.0::0.3,(((3:0.4,4:0.4):1.1,((1:0.2,2:0.2):2.4)#H1:1.1::0.7):0.0,5:1.5):3.1):1.0,6:5.6);" # hybrid ladder network hybridladderstring = "(#H2:::0.2,((C,((B)#H1)#H2:::0.8),(#H1,(A1,A2))),O);" -net_hl = readTopology(hybridladderstring); # hybrid 1 = H1, node number 4 +net_hl = readnewick(hybridladderstring); # hybrid 1 = H1, node number 4 # fails because newhybridnode is already a hybrid node @test isnothing(PhyloNetworks.fliphybrid!(net_hl, net_hl.hybrid[1], false, false)) @test net_hl.hybrid[1].number == 4 # unchanged @@ -499,69 +498,69 @@ net_hl = readTopology(hybridladderstring); # hybrid 1 = H1, node number 4 @test !isnothing(PhyloNetworks.fliphybrid!(net_hl, net_hl.hybrid[2], false, true)) @test net_hl.hybrid[2].number == -4 @test net_hl.hybrid[2].name == "H2" -@test writeTopology(net_hl) == "(((B)#H1,(C)#H2:::0.8),(#H2:::0.2,(#H1,(A1,A2))),O);" +@test writenewick(net_hl) == "(((B)#H1,(C)#H2:::0.8),(#H2:::0.2,(#H1,(A1,A2))),O);" # W structure network wstring = "(C:0.0262,(B:0.0)#H2:0.03::0.9756,(((D:0.1,A:0.1274):0.0)#H1:0.0::0.6,(#H2:0.0001::0.0244,#H1:0.151::0.4):0.0274):0.4812);" -net_W = readTopology(wstring) # hybrid 1: H2, node number 3, hybrid 2: H1, number 6 +net_W = readnewick(wstring) # hybrid 1: H2, node number 3, hybrid 2: H1, number 6 @test isnothing(PhyloNetworks.fliphybrid!(net_W, net_W.hybrid[1], true, true)) # not allowed, creates a hybrid ladder @test isnothing(PhyloNetworks.fliphybrid!(net_W, net_W.hybrid[2], true, true)) # same @test !isnothing(PhyloNetworks.fliphybrid!(net_W, net_W.hybrid[2])) # hybrid ladders allowed @test net_W.hybrid[2].number == -7 -@test writeTopology(net_W) == "(C:0.0262,(B:0.0)#H2:0.03::0.9756,(((D:0.1,A:0.1274):0.0,#H1:0.151::0.4):0.0,(#H2:0.0001::0.0244)#H1:0.0274::0.6):0.4812);" +@test writenewick(net_W) == "(C:0.0262,(B:0.0)#H2:0.03::0.9756,(((D:0.1,A:0.1274):0.0,#H1:0.151::0.4):0.0,(#H2:0.0001::0.0244)#H1:0.0274::0.6):0.4812);" ## cases when the root needs to be reset (to former hybrid node) # newhybridnode < current root -net_W = readTopology(wstring) +net_W = readnewick(wstring) @test !isnothing(PhyloNetworks.fliphybrid!(net_W, net_W.hybrid[2], false)) # root was reset -@test net_W.root == 7 -@test writeTopology(net_W) == "((D:0.1,A:0.1274):0.0,((C:0.0262,(B:0.0)#H2:0.03::0.9756):0.4812)#H1:0.0::0.6,(#H2:0.0001::0.0244,#H1:0.0274::0.4):0.151);" +@test net_W.rooti == 7 +@test writenewick(net_W) == "((D:0.1,A:0.1274):0.0,((C:0.0262,(B:0.0)#H2:0.03::0.9756):0.4812)#H1:0.0::0.6,(#H2:0.0001::0.0244,#H1:0.0274::0.4):0.151);" # newhybridnode = current root # new root will have 2 children hybrid edges, because of former hybrid ladder -net_hl = readTopology(hybridladderstring) # hybrid 2 = H2, node number 1 +net_hl = readnewick(hybridladderstring) # hybrid 2 = H2, node number 1 @test !isnothing(PhyloNetworks.fliphybrid!(net_hl, net_hl.hybrid[2], true, false)) @test net_hl.hybrid[2].number == -2 # this is the former root -@test net_hl.root == 4 # new root index is as expected -@test writeTopology(net_hl) == "((B)#H1,#H2:::0.2,(C,((#H1,(A1,A2)),(O)#H2:::0.8)));" +@test net_hl.rooti == 4 # new root index is as expected +@test writenewick(net_hl) == "((B)#H1,#H2:::0.2,(C,((#H1,(A1,A2)),(O)#H2:::0.8)));" #= other examples in which newhybridnode = current root -n6h1 = readTopology("((((1:0.2,2:0.2):2.4,((3:0.4,4:0.4):1.1)#H1:1.1):2.0,(#H1:0.0::0.3,5:1.5):3.1):1.0,6:5.6);") -n6h1.root = 10 -directEdges!(n6h1) +n6h1 = readnewick("((((1:0.2,2:0.2):2.4,((3:0.4,4:0.4):1.1)#H1:1.1):2.0,(#H1:0.0::0.3,5:1.5):3.1):1.0,6:5.6);") +n6h1.rooti = 10 +directedges!(n6h1) @test n6h1.hybrid[1].number == 5 @test !isnothing(PhyloNetworks.fliphybrid!(n6h1, n6h1.hybrid[1])) # flips minor by default @test n6h1.hybrid[1].number == -8 -@test writeTopology(n6h1) == "((3:0.4,4:0.4):1.1,((1:0.2,2:0.2):2.4,((5:1.5)#H1:3.1::0.7,(6:5.6):1.0):2.0):1.1,#H1:0.0::0.3);" +@test writenewick(n6h1) == "((3:0.4,4:0.4):1.1,((1:0.2,2:0.2):2.4,((5:1.5)#H1:3.1::0.7,(6:5.6):1.0):2.0):1.1,#H1:0.0::0.3);" -net_W = readTopology(wstring) +net_W = readnewick(wstring) @test !isnothing(PhyloNetworks.fliphybrid!(net_W, net_W.hybrid[1], false)) # move major edge # this moves root to node number -4 -@test net_W.root == 3 # index -@test writeTopology(net_W) == "(B:0.0,(C:0.0262)#H2:0.03::0.9756,(#H1:0.151::0.4,(((D:0.1,A:0.1274):0.0)#H1:0.0::0.6,#H2:0.4812::0.0244):0.0274):0.0001);" +@test net_W.rooti == 3 # index +@test writenewick(net_W) == "(B:0.0,(C:0.0262)#H2:0.03::0.9756,(#H1:0.151::0.4,(((D:0.1,A:0.1274):0.0)#H1:0.0::0.6,#H2:0.4812::0.0244):0.0274):0.0001);" =# # flip hybrid would create a directed cycle tangledstring = "((a:0.01,((b:0.01,(c:0.005)#H2:0.005):0.01)#H1:0.01::0.8):0.01,e:0.01,((#H1:0.01::0.2,d:0.01):0.005,#H2):0.005);" # untangledstring = "((a:0.01,((b:0.01,(c:0.005)#H2:0.005::0.8):0.01)#H1:0.01::0.8):0.01,((#H2:0.01::0.2,d:0.01):0.005,#H1:::0.2):0.005);" -netc = readTopology(tangledstring) # hybrid 1: H2, number 4 +netc = readnewick(tangledstring) # hybrid 1: H2, number 4 @test isnothing(PhyloNetworks.fliphybrid!(netc, netc.hybrid[1], true)) # would create cycle, away from root # flip edge cannot contain root, yet flip admissible, and has hybrid ladder: edgetoflip = bottom rung @test isnothing(PhyloNetworks.fliphybrid!(netc, netc.hybrid[1],false, true)) @test !isnothing(PhyloNetworks.fliphybrid!(netc, netc.hybrid[1],false)) -@test writeTopology(netc) == "((a:0.01,(#H2:0.01)#H1:0.01::0.8):0.01,e:0.01,((#H1:0.01::0.2,d:0.01):0.005,(c:0.005,(b:0.01)#H2:0.005)):0.005);" +@test writenewick(netc) == "((a:0.01,(#H2:0.01)#H1:0.01::0.8):0.01,e:0.01,((#H1:0.01::0.2,d:0.01):0.005,(c:0.005,(b:0.01)#H2:0.005)):0.005);" # case when the new hybrid edge = child edge of the new hybrid node -net_ex = readTopology("(((c:0.01,(a:0.005,#H1):0.005):0.01,(b:0.005)#H1:0.005):0.01,d:0.01);") +net_ex = readnewick("(((c:0.01,(a:0.005,#H1):0.005):0.01,(b:0.005)#H1:0.005):0.01,d:0.01);") @test !isnothing(PhyloNetworks.fliphybrid!(net_ex, net_ex.hybrid[1], false)) # flip major edge -@test net_ex.root == 6 # index +@test net_ex.rooti == 6 # index @test net_ex.hybrid[1].number == -3 -# @test writeTopology(net_ex) == "(b:0.005,(a:0.005,(c:0.01,#H1:0.01):0.005),((d:0.01):0.01)#H1:0.005);" +# @test writenewick(net_ex) == "(b:0.005,(a:0.005,(c:0.01,#H1:0.01):0.005),((d:0.01):0.01)#H1:0.005);" PhyloNetworks.fliphybrid!(net_ex, net_ex.hybrid[1], false) # undo: except that different root -@test writeTopology(net_ex) == "((c:0.01,(a:0.005,#H1):0.005):0.01,(b:0.005)#H1:0.005,(d:0.01):0.01);" +@test writenewick(net_ex) == "((c:0.01,(a:0.005,#H1):0.005):0.01,(b:0.005)#H1:0.005,(d:0.01):0.01);" # degree-2 node exists, but not rooted at that node # case when sum_isdesc is 1, but corresponds to a hybrid edge level3string = "(b,(((#H1:::0.01,#H2:::0.02))#H3,((a)#H1)#H2),#H3:::0.03);" -netl3 = readTopology(level3string) +netl3 = readnewick(level3string) # hybrid 2: H1. only has edge has isdesc = true, but hybrid edge @test isnothing(PhyloNetworks.fliphybrid!(netl3, netl3.hybrid[2])) # hybrid 3 = H2: can flip its minor parent but creates hybrid ladder @@ -570,12 +569,12 @@ end @testset "test fliphybrid! randomly choose node function" begin Random.seed!(123) -n6h1 = readTopology("((((1:0.2,2:0.2):2.4,((3:0.4,4:0.4):1.1)#H1:1.1):2.0,(#H1:0.0::0.3,5:1.5):3.1):1.0,6:5.6);") +n6h1 = readnewick("((((1:0.2,2:0.2):2.4,((3:0.4,4:0.4):1.1)#H1:1.1):2.0,(#H1:0.0::0.3,5:1.5):3.1):1.0,6:5.6);") @test n6h1.hybrid[1].number == 5 -@test !isnothing(PhyloNetworks.fliphybrid!(n6h1)) +@test !isnothing(PhyloNetworks.fliphybrid!(n6h1, true)) # true: to flip minor edge @test n6h1.hybrid[1].number == -8 -net_W = readTopology("(C:0.0262,(B:0.0)#H2:0.03::0.9756,(((D:0.1,A:0.1274):0.0)#H1:0.0::0.6,(#H2:0.0001::0.0244,#H1:0.151::0.4):0.0274):0.4812);") +net_W = readnewick("(C:0.0262,(B:0.0)#H2:0.03::0.9756,(((D:0.1,A:0.1274):0.0)#H1:0.0::0.6,(#H2:0.0001::0.0244,#H1:0.151::0.4):0.0274):0.4812);") @test isnothing(PhyloNetworks.fliphybrid!(net_W, true, true)) # all minor edge flips create a hybridladder @test net_W.hybrid[1].number == 3 # unchanged end diff --git a/test/test_multipleAlleles.jl b/test/test_multipleAlleles.jl deleted file mode 100644 index c2c565851..000000000 --- a/test/test_multipleAlleles.jl +++ /dev/null @@ -1,153 +0,0 @@ -@testset "multiple alleles" begin -global tree, df, d, net, currT - -@testset "test: map alleles to species" begin - tree = readTopology("(6,(5,(7,(3,4))));"); - PhyloNetworks.expandLeaves!(["7"],tree) - @test writeTopology(tree) == "(6,(5,((7:0.0,7__2:0.0):1.0,(3,4))));" - PhyloNetworks.mergeLeaves!(tree) - @test writeTopology(tree) == "(6,(5,(7:1.0,(3,4))));" - alleleDF=DataFrame(allele=["1","2"], species=["7","7"]) - CSV.write("tmp.csv", alleleDF); - df = (@test_logs (:warn, r"^not all alleles were mapped") mapAllelesCFtable("tmp.csv", - joinpath(@__DIR__, "..", "examples", "tableCFCI.csv"), - # joinpath(dirname(pathof(PhyloNetworks)), "..", "examples", "tableCFCI.csv"), - filename="CFmapped.csv")) - rm("CFmapped.csv") - rm("tmp.csv") - @test df[!,:t4] == ["4","7","3","7","3","3","7","3","3","3","7","3","3","3","3"] -end - -#----------------------------------------------------------# -# testing sorting of taxa and CFs # -#----------------------------------------------------------# -@testset "sorttaxa!" begin - -letters = ["a","b","c","d"]; cfvalues = [0.6, 0.39, 0.01] # for ab_cd, ac_bd, ad_bc -d = DataFrame(t1=Array{String}(undef,24),t2=Array{String}(undef,24),t3=Array{String}(undef,24),t4=Array{String}(undef,24), - CF12_34=Array{Float64}(undef,24), CF13_24=Array{Float64}(undef,24), CF14_23=Array{Float64}(undef,24)); -irow=1 # d will contain 6!=24 rows: for all permutations on 4 letters -for i1 in 1:4 - ind234 = deleteat!(collect(1:4),i1) - for i2 in ind234 - ind34 = deepcopy(ind234) - deleteat!(ind34, findfirst(isequal(i2), ind34)) - for j in 1:2 - i3=ind34[j]; i4=ind34[3-j] - d[irow,:t1]=letters[i1]; d[irow,:t2]=letters[i2]; d[irow,:t3]=letters[i3]; d[irow,:t4]=letters[i4] - # CF12_34 corresponds to CFi1i2_i3i4 - if (i1,i2)∈[(1,2),(2,1),(3,4),(4,3)] d[irow,:CF12_34] = cfvalues[1] - elseif (i1,i2)∈[(1,3),(3,1),(2,4),(4,2)] d[irow,:CF12_34] = cfvalues[2] - elseif (i1,i2)∈[(1,4),(4,1),(2,3),(3,2)] d[irow,:CF12_34] = cfvalues[3] - end # next: set CF13_24 - if (i1,i3)∈[(1,2),(2,1),(3,4),(4,3)] d[irow,:CF13_24] = cfvalues[1] - elseif (i1,i3)∈[(1,3),(3,1),(2,4),(4,2)] d[irow,:CF13_24] = cfvalues[2] - elseif (i1,i3)∈[(1,4),(4,1),(2,3),(3,2)] d[irow,:CF13_24] = cfvalues[3] - end # nest: set CF14_23 - if (i1,i4)∈[(1,2),(2,1),(3,4),(4,3)] d[irow,:CF14_23] = cfvalues[1] - elseif (i1,i4)∈[(1,3),(3,1),(2,4),(4,2)] d[irow,:CF14_23] = cfvalues[2] - elseif (i1,i4)∈[(1,4),(4,1),(2,3),(3,2)] d[irow,:CF14_23] = cfvalues[3] - end - irow += 1 - end - end -end -# d -d2 = deepcopy(d); -sorttaxa!(d2); -d3 = DataFrame(t1=repeat([letters[1]],outer=[24]),t2=repeat([letters[2]],outer=[24]), - t3=repeat([letters[3]],outer=[24]),t4=repeat([letters[4]],outer=[24]), - CF12_34=repeat([cfvalues[1]],outer=[24]),CF13_24=repeat([cfvalues[2]],outer=[24]),CF14_23=repeat([cfvalues[3]],outer=[24])); -@test d2==d3 - -dat = readTableCF(d); -net = (@test_logs readTopologyLevel1("(a,((b)#H1,((#H1,c),d)));")); -# earlier warning: "net does not have identifiable branch lengths" -@test_logs topologyQPseudolik!(net, dat); -sorttaxa!(dat) - -@test [q.obsCF for q in dat.quartet] == [[0.6,0.39,0.01] for i in 1:24] -@test [q.qnet.expCF for q in dat.quartet] == [[0.6915349833361827,0.12262648039048075,0.1858385362733365] for i in 1:24] -@test [q.taxon for q in dat.quartet] == [letters for i in 1:24] -@test [q.qnet.quartetTaxon for q in dat.quartet] == [letters for i in 1:24] - -end # of testset: sorttaxa! - -@testset "snaq on multiple alleles" begin - -df = DataFrame(t1=["6","7"], t2=["7","6"], t3=["4","4"], t4=["8","8"], - a=[true,true], # to test recognition of columns - CF12_34=[0.25, 0.15], ngenes=[10,20], - CF13_24=[0.3,0.55], b=[false,false], CF14_23=[0.45,0.3]) -@test length(readTableCF(df).quartet) == 2 -d = readTableCF(df, mergerows=true) -@test isempty(d.repSpecies) -@test length(d.quartet) == 1 -@test d.quartet[1].obsCF ≈ [0.3, 0.5, 0.2] -@test d.quartet[1].ngenes ≈ 15 -PhyloNetworks.descData(d, devnull) -PhyloNetworks.descData(d, "tmp.log") -summarizeDataCF(d, filename="tmp.log") -rm("tmp.log") - -df=DataFrame(t1=["6","6","10","6","6","7","7","7","7","7", "3", "7", "7"], # rows 11 & 13 (last & third to last): non-informative - t2=["7","7","7","10","7","7","7","7","7","7", "7", "7", "7"], - t3=["4","10","4","4","4","8","8","8","10","10","7", "6", "7"], - t4=["8","8","8","8","10","10","4","6","4","6", "7", "4", "4"], - CF1234=[0.2729102510259939, 0.3967750546426937, 0.30161247267865315, 0.24693940689390592, 0.2729102510259939, 0.155181, 0.792153, 0.486702, 0.962734, 0.202531, 0.3, 0.486886, 0.3], - CF1324=[0.45417949794801216, 0.30161247267865315, 0.30161247267865315, 0.5061211862121882, 0.45417949794801216, 0.673426 ,0.145408, 0.391103, 0.023078, 0.714826, 0.3, 0.419015, 0.3], - CF1423=[0.2729102510259939, 0.30161247267865315, 0.3967750546426937, 0.24693940689390592, 0.2729102510259939, 0.171393, 0.062439, 0.122195, 0.014188, 0.082643, 0.4, 0.094099, 0.4]) -d = readTableCF(df) -@test !isempty(d.repSpecies) -@test d.repSpecies == ["7"] - -tree = "((6,4),(7,8),10);" -currT = readTopology(tree); - -originalstdout = stdout -redirect_stdout(devnull) # requires julia v1.6 -estNet = snaq!(currT,d,hmax=1,seed=7, runs=1, filename="", Nfail=10) -redirect_stdout(originalstdout) -@test 180.0 < estNet.loglik < 185.29 -@test estNet.hybrid[1].k >= 4 -@test estNet.numTaxa == 5 -#= -redirect_stdout(devnull) # requires julia v1.6 -estNet = snaq!(currT,d,hmax=1,seed=8306, runs=1, filename="", Nfail=10, - ftolAbs=1e-6,ftolRel=1e-5,xtolAbs=1e-4,xtolRel=1e-3) -redirect_stdout(originalstdout) -@test estNet.hybrid[1].k == 5 # or: wrong k in hybrid -@test estNet.numTaxa == 5 # or: wrong # taxa -=# - -# net = snaq!(currT,d,hmax=1,seed=8378,filename="") -net = readTopology("(((4,#H7:::0.47411636966376686):0.6360197250223204,10):0.09464128563363322,(7:0.0,(6)#H7:::0.5258836303362331):0.36355727108454877,8);") -@test topologyQPseudolik!(net, d) ≈ 174.58674796123705 -@test net.loglik ≈ 174.58674796123705 -net = readTopology("(((4,#H1),10),(7,(6)#H1),8);") -net = topologyMaxQPseudolik!(net,d, # loose tolerance for faster test - ftolRel=1e-2,ftolAbs=1e-2,xtolAbs=1e-2,xtolRel=1e-2) -@test net.loglik > 174.5 - -# testing root checks at the end when outgroup!="none" -redirect_stdout(devnull) -estNet = snaq!(currT,d,hmax=1,seed=6355, runs=1, filename="", Nfail=10, - ftolAbs=1e-6,ftolRel=1e-5,xtolAbs=1e-4,xtolRel=1e-3, - outgroup="10") -redirect_stdout(originalstdout) -# below, mostly check for 1 reticulation and "10" as outgroup. exact net depends on RNG :( -netstring = writeTopology(estNet; round=true, digits=1) -@test occursin(r"^\(\(7:0.0,#H\d:::.*,10\);", netstring) || - occursin(r"^\(10,\(.*,#H\d:::0.\d\);", netstring) || - occursin(r",10,#H\d:::0.\d\);", netstring) -end # test of snaq on multiple alleles - -#----------------------------------------------------------# -# testing writeTopologyLevel1 with multiple alleles # -#----------------------------------------------------------# -@testset "writeTopologyLevel1 multiall=true" begin -net = readTopologyLevel1("(A,(((B,B__2),E),(C,D)));") -@test writeTopologyLevel1(net, false, true, true,"D", false, true, 2, true) == "(D:0.5,(C:1.0,((B:1.0,E:1.0):1.0,A:1.0):1.0):0.5);" -end # test of writeTopologyLevel1 - -end # overall multiple allele sets of testests diff --git a/test/test_nj.jl b/test/test_nj.jl index 998797f74..751bd804c 100644 --- a/test/test_nj.jl +++ b/test/test_nj.jl @@ -1,20 +1,19 @@ -@testset "Neighbour joining implementation" begin - - D = DataFrame(CSV.File(joinpath(@__DIR__,"..","examples","caudata_dist.txt")); copycols=false) +@testset "neighbour joining tree" begin + D = CSV.read(joinpath(@__DIR__,"..","examples","caudata_dist.txt"), DataFrame) tree = nj(D) # read results from ape implementation of nj - apetree = readTopology(joinpath(@__DIR__, "..", "examples", "caudata_dist_nj.txt")) - @test hardwiredClusterDistance(tree, apetree, false) == 0 + apetree = readnewick(joinpath(@__DIR__, "..", "examples", "caudata_dist_nj.txt")) + @test hardwiredclusterdistance(tree, apetree, false) == 0 # also check branch lengths (more or less) @test sort!([e.length for e in tree.edge]) ≈ sort!([e.length for e in apetree.edge]) # example where Ints are converted to Floats, and there's a < 0 edge length df = DataFrame(s1=[0, 5,9,9,5], s2=[5,0,10,10,6], s3=[9,10,0,8,4], s4=[9,10,8,0,0], s5=[5,6, 4, 0,0]) - tree = (@test_logs (:info, r"have negative lengths") nj(df)) - @test writeTopology(tree) == "(((s1:2.0,s2:3.0):3.0,s3:4.0):2.0,s4:2.0,s5:-2.0);" + tree = (@test_logs (:info, r"negative length") nj(df)) + @test writenewick(tree) == "(((s1:2.0,s2:3.0):3.0,s3:4.0):2.0,s5:-2.0,s4:2.0);" # example with no names argument, force_nonnegative_edges D = [0 5 9 9 6.5; 5 0 10 10 7.5; 9 10 0 8 5.5; 9 10 8 0 1.5; 6.5 7.5 5.5 1.5 0] tree = (@test_logs (:info, r"reset to 0") PhyloNetworks.nj!(D, force_nonnegative_edges=true)) - @test writeTopology(tree) == "(((1:2.0,2:3.0):3.0,3:4.0):2.0,4:2.0,5:0.0);" + @test writenewick(tree) == "(((1:2.0,2:3.0):3.0,3:4.0):2.0,5:0.0,4:2.0);" end diff --git a/test/test_optBLparts.jl b/test/test_optBLparts.jl deleted file mode 100644 index e13144b64..000000000 --- a/test/test_optBLparts.jl +++ /dev/null @@ -1,387 +0,0 @@ -# test the components in optBL separately -# Claudia January 2015 - -globalerror = false -#println("--------- Case G --------------") -include("../examples/case_g_example.jl"); - -q1 = Quartet(1,["6","7","4","8"],[0.5,0.4,0.1]); -q2 = Quartet(2,["6","7","10","8"],[0.5,0.4,0.1]); -q3 = Quartet(3,["10","7","4","8"],[0.5,0.4,0.1]); -q4 = Quartet(4,["6","10","4","8"],[0.5,0.4,0.1]); -q5 = Quartet(5,["6","7","4","10"],[0.5,0.4,0.1]); - -d = DataCF([q1,q2,q3,q4,q5]); -extractQuartet!(net,d) - -oldht = net.ht - -x = [0.3,1.0,1.5,2.0] -err = false - -#println("x is $(x) all changed-----------") - -try - update!(q1.qnet,x,net) - q1.qnet.edge[3].length !=x[2] || q1.qnet.edge[6].length !=x[3] || q1.qnet.edge[9].length !=x[4] ? error("qnet edges lengths not correct") : nothing - q1.qnet.edge[5].gamma !=1-x[1] || q1.qnet.edge[7].gamma !=x[1] ? error("qnet edges gammas not correct") : nothing - - update!(q2.qnet,x,net) - q2.qnet.edge[4].length !=x[3] || q2.qnet.edge[7].length !=x[4] ? error("qnet edges lengths not correct") : nothing - q2.qnet.edge[3].gamma !=1-x[1] || q2.qnet.edge[5].gamma !=x[1] ? error("qnet edges gammas not correct") : nothing - - update!(q3.qnet,x,net) - q3.qnet.edge[4].length !=x[3] || q3.qnet.edge[7].length !=x[4] ? error("qnet edges lengths not correct") : nothing - q3.qnet.edge[3].gamma !=1-x[1] || q3.qnet.edge[5].gamma !=x[1] ? error("qnet edges gammas not correct") : nothing - - update!(q4.qnet,x,net) - q4.qnet.edge[3].length !=x[2] || q4.qnet.edge[4].length !=x[3] ? error("qnet edges lengths not correct") : nothing - - update!(q5.qnet,x,net) - q5.qnet.edge[3].length !=x[2] || q5.qnet.edge[6].length !=x[3] ? error("qnet edges lengths not correct") : nothing - q5.qnet.edge[5].gamma !=1-x[1] || q5.qnet.edge[7].gamma !=x[1] ? error("qnet edges gammas not correct") : nothing - - reduce(&,[q.qnet.changed for q in d.quartet]) || error("all qnet should be changed") - - update!(net,x) - net.ht == x || ("net.ht not correctly changed to x with update") -catch - global err = true -end - -for q in d.quartet - update!(q.qnet,oldht,net) -end -update!(net,oldht) - - -x = [0.1,0.2,0.1,2.0] # changing t9 only -#println("x is $(x) changing t9 only-----------") - -try - update!(q1.qnet,x,net) - q1.qnet.edge[3].length !=x[2] || q1.qnet.edge[6].length !=x[3] || q1.qnet.edge[9].length !=x[4] ? error("qnet edges lengths not correct") : nothing - q1.qnet.edge[5].gamma !=1-x[1] || q1.qnet.edge[7].gamma !=x[1] ? error("qnet edges gammas not correct") : nothing - - update!(q2.qnet,x,net) - q2.qnet.edge[4].length !=x[3] || q2.qnet.edge[7].length !=x[4] ? error("qnet edges lengths not correct") : nothing - q2.qnet.edge[3].gamma !=1-x[1] || q2.qnet.edge[5].gamma !=x[1] ? error("qnet edges gammas not correct") : nothing - - update!(q3.qnet,x,net) - q3.qnet.edge[4].length !=x[3] || q3.qnet.edge[7].length !=x[4] ? error("qnet edges lengths not correct") : nothing - q3.qnet.edge[3].gamma !=1-x[1] || q3.qnet.edge[5].gamma !=x[1] ? error("qnet edges gammas not correct") : nothing - - update!(q4.qnet,x,net) - q4.qnet.edge[3].length !=x[2] || q4.qnet.edge[4].length !=x[3] ? error("qnet edges lengths not correct") : nothing - - update!(q5.qnet,x,net) - q5.qnet.edge[3].length !=x[2] || q5.qnet.edge[6].length !=x[3] ? error("qnet edges lengths not correct") : nothing - q5.qnet.edge[5].gamma !=1-x[1] || q5.qnet.edge[7].gamma !=x[1] ? error("qnet edges gammas not correct") : nothing - - [q.qnet.changed for q in d.quartet] == [true,true,true,false,false] || error("q.qnet.changed not correct for all quartets") - - update!(net,x) - net.ht == x || error("net.ht not correctly changed to x with update") -catch - global err = true -end - -for q in d.quartet - update!(q.qnet,oldht,net) -end -update!(net,oldht) - -x = [0.3,0.2,0.1,2.0] # changing gamma and t9 only -#println("x is $(x) changing gamma and t9 only-----------") - -try - update!(q1.qnet,x,net) - q1.qnet.edge[3].length !=x[2] || q1.qnet.edge[6].length !=x[3] || q1.qnet.edge[9].length !=x[4] ? error("qnet edges lengths not correct") : nothing - q1.qnet.edge[5].gamma !=1-x[1] || q1.qnet.edge[7].gamma !=x[1] ? error("qnet edges gammas not correct") : nothing - - update!(q2.qnet,x,net) - q2.qnet.edge[4].length !=x[3] || q2.qnet.edge[7].length !=x[4] ? error("qnet edges lengths not correct") : nothing - q2.qnet.edge[3].gamma !=1-x[1] || q2.qnet.edge[5].gamma !=x[1] ? error("qnet edges gammas not correct") : nothing - - update!(q3.qnet,x,net) - q3.qnet.edge[4].length !=x[3] || q3.qnet.edge[7].length !=x[4] ? error("qnet edges lengths not correct") : nothing - q3.qnet.edge[3].gamma !=1-x[1] || q3.qnet.edge[5].gamma !=x[1] ? error("qnet edges gammas not correct") : nothing - - update!(q4.qnet,x,net) - q4.qnet.edge[3].length !=x[2] || q4.qnet.edge[4].length !=x[3] ? error("qnet edges lengths not correct") : nothing - - update!(q5.qnet,x,net) - q5.qnet.edge[3].length !=x[2] || q5.qnet.edge[6].length !=x[3] ? error("qnet edges lengths not correct") : nothing - q5.qnet.edge[5].gamma !=1-x[1] || q5.qnet.edge[7].gamma !=x[1] ? error("qnet edges gammas not correct") : nothing - - [q.qnet.changed for q in d.quartet] == [true,true,true,false,true] || error("q.qnet.changed not correct for all quartets") - - update!(net,x) - net.ht == x || error("net.ht not correctly changed to x with update") -catch - global err = true -end - -for q in d.quartet - update!(q.qnet,oldht,net) -end -update!(net,oldht) - - -# ---- calculateExpCF -x = [0.3,0.2,0.1,2.0] # changing gamma and t9 only -#println("---- calculate expCF for $(x)") -try - calculateExpCFAll!(d,x,net) - reduce(&,map(approxEq,q1.qnet.expCF,[(1-x[1])/3*exp(-x[2])+x[1]/3*exp(-x[2]-x[3]-x[4]),(1-x[1])*(1-2/3*exp(-x[2]))+x[1]*(1-2/3*exp(-x[2]-x[3]-x[4])), - (1-x[1])/3*exp(-x[2])+x[1]/3*exp(-x[2]-x[3]-x[4])])) || error("q1 expCF wrong") - reduce(&,map(approxEq,q2.qnet.expCF, [(1-x[1])*(1-2/3*exp(-x[3]))+x[1]*(1/3*exp(-x[4])),(1-x[1])*(1/3*exp(-x[3]))+x[1]*(1-2/3*exp(-x[4])), - (1-x[1])/3*exp(-x[3])+x[1]/3*exp(-x[4])])) || error("q2 expCF wrong") - reduce(&,map(approxEq,q3.qnet.expCF, [(1-x[1])/3*exp(-x[3])+x[1]/3*exp(-x[4]),(1-x[1])*(1/3*exp(-x[3]))+x[1]*(1-2/3*exp(-x[4])),(1-x[1])*(1-2/3*exp(-x[3]))+x[1]*(1/3*exp(-x[4]))])) || error("q3 expCF wrong") - reduce(&,map(approxEq,q4.qnet.expCF,[1/3*exp(-x[2]-x[3]),1-2/3*exp(-x[2]-x[3]),1/3*exp(-x[2]-x[3])])) || error("q4 expCF wrong") - reduce(&,map(approxEq,q5.qnet.expCF,[(1-x[1])/3*exp(-x[2])+x[1]/3*exp(-x[2]-x[3]),(1-x[1])*(1-2/3*exp(-x[2]))+x[1]*(1-2/3*exp(-x[2]-x[3])), - (1-x[1])/3*exp(-x[2])+x[1]/3*exp(-x[2]-x[3])])) || error("q5 expCF wrong") -catch - global err = true -end - -#logPseudoLik(d) - -if !err - #println("-------------Case G: NO ERRORS!------------") -else - globalerror = true -end - -#println("--------- Case F Bad Diamond I --------------") -include("../examples/case_f_example.jl"); -parameters!(net) - -q1 = Quartet(1,["6","7","4","8"],[0.5,0.4,0.1]); -q2 = Quartet(2,["6","7","10","8"],[0.5,0.4,0.1]); -q3 = Quartet(3,["10","7","4","8"],[0.5,0.4,0.1]); -q4 = Quartet(4,["6","10","4","8"],[0.5,0.4,0.1]); -q5 = Quartet(5,["6","7","4","10"],[0.5,0.4,0.1]); - -d = DataCF([q1,q2,q3,q4,q5]); -extractQuartet!(net,d) - -oldht = net.ht - -x = [0.4,0.2,0.1] -err = false - -#println("x is $(x) all changed-----------") - -try - update!(q1.qnet,x,net) - q1.qnet.node[1].gammaz !=x[2] || q1.qnet.node[3].gammaz !=x[3] ? error("qnet gammaz not correct") : nothing - - update!(q2.qnet,x,net) - q2.qnet.edge[4].length !=x[1] ? error("qnet edges lengths not correct") : nothing - - update!(q3.qnet,x,net) - q3.qnet.edge[5].length !=x[1] ? error("qnet edges lengths not correct") : nothing - q3.qnet.edge[3].length !=-log(1-x[3]) ? error("qnet edges gammaz not correct") : nothing - - update!(q4.qnet,x,net) - q4.qnet.edge[5].length !=x[1] ? error("qnet edges lengths not correct") : nothing - q4.qnet.edge[3].length !=-log(1-x[2]) ? error("qnet edges gammaz not correct") : nothing - - update!(q5.qnet,x,net) - q1.qnet.node[1].gammaz !=x[2] || q1.qnet.node[3].gammaz !=x[3] ? error("qnet gammaz not correct") : nothing - - reduce(&,[q.qnet.changed for q in d.quartet]) || error("all qnet should be changed") - - update!(net,x) - net.ht == x || ("net.ht not correctly changed to x with update") -catch - global err = true -end - -for q in d.quartet - update!(q.qnet,oldht,net) -end -update!(net,oldht) - - -x = [0.1,0.2,0.1] # changing gammaz1, gammaz2 only -#println("x is $(x) changing gammaz1, gammaz2 only-----------") - -try - update!(q1.qnet,x,net) - q1.qnet.node[1].gammaz !=x[2] || q1.qnet.node[3].gammaz !=x[3] ? error("qnet gammaz not correct") : nothing - - update!(q2.qnet,x,net) - q2.qnet.edge[4].length !=x[1] ? error("qnet edges lengths not correct") : nothing - - update!(q3.qnet,x,net) - q3.qnet.edge[5].length !=x[1] ? error("qnet edges lengths not correct") : nothing - q3.qnet.edge[3].length !=-log(1-x[3]) ? error("qnet edges gammaz not correct") : nothing - - update!(q4.qnet,x,net) - q4.qnet.edge[5].length !=x[1] ? error("qnet edges lengths not correct") : nothing - q4.qnet.edge[3].length !=-log(1-x[2]) ? error("qnet edges gammaz not correct") : nothing - - update!(q5.qnet,x,net) - q1.qnet.node[1].gammaz !=x[2] || q1.qnet.node[3].gammaz !=x[3] ? error("qnet gammaz not correct") : nothing - - [q.qnet.changed for q in d.quartet] == [true,false,true,true,true] || error("q.qnet.changed not correct for all quartets") - - update!(net,x) - net.ht == x || error("net.ht not correctly changed to x with update") -catch - global err = true -end - -for q in d.quartet - update!(q.qnet,oldht,net) -end -update!(net,oldht) - - -# ---- calculateExpCF -x = [0.3,0.2,0.1] -#println("---- calculate expCF for $(x)") -try - calculateExpCFAll!(d,x,net) - reduce(&,map(approxEq,q1.qnet.expCF,[(1-x[2]-x[3])/3,(1+2*x[2]-x[3])/3,(1-x[2]+2*x[3])/3])) || error("q1 expCF wrong") - reduce(&,map(approxEq,q2.qnet.expCF, [1-2/3*exp(-x[1]),1/3*exp(-x[1]),1/3*exp(-x[1])])) || error("q2 expCF wrong") - reduce(&,map(approxEq,q3.qnet.expCF, [1/3*exp(-x[1]+log(1-x[3])),1/3*exp(-x[1]+log(1-x[3])),1-2/3*exp(-x[1]+log(1-x[3]))])) || error("q3 expCF wrong") - reduce(&,map(approxEq,q4.qnet.expCF,[1/3*exp(-x[1]+log(1-x[2])),1-2/3*exp(-x[1]+log(1-x[2])),1/3*exp(-x[1]+log(1-x[2]))])) || error("q4 expCF wrong") - reduce(&,map(approxEq,q5.qnet.expCF,[(1-x[2]-x[3])/3,(1+2*x[2]-x[3])/3,(1-x[2]+2*x[3])/3])) || error("q5 expCF wrong") - -catch - global err = true -end - -#logPseudoLik(d) - -if !err - #println("-------------Case F: NO ERRORS!------------") -else - globalerror = true -end - - -#println("--------- Case I Bad Diamond II --------------") -include("../examples/case_i_example.jl"); - -q1 = Quartet(1,["6","7","4","8"],[0.5,0.4,0.1]); -q2 = Quartet(2,["6","7","10","8"],[0.5,0.4,0.1]); -q3 = Quartet(3,["10","7","4","8"],[0.5,0.4,0.1]); -q4 = Quartet(4,["6","10","4","8"],[0.5,0.4,0.1]); -q5 = Quartet(5,["6","7","4","10"],[0.5,0.4,0.1]); - -d = DataCF([q1,q2,q3,q4,q5]); -extractQuartet!(net,d) - -oldht = net.ht - -x = [0.2,0.2,0.1,0.1,0.1] -err = false - -#println("x is $(x) all changed-----------") - -try - update!(q1.qnet,x,net) - q1.qnet.edge[7].gamma != x[1] || q1.qnet.edge[2].gamma != 1-x[1] ? error("qnet gamma not correct") : nothing - q1.qnet.edge[4].length != x[3] || q1.qnet.edge[8].length != x[4] ? error("qnet edge lengths not correct") : nothing - - update!(q2.qnet,x,net) - q2.qnet.edge[8].gamma != x[1] || q2.qnet.edge[4].gamma != 1-x[1] ? error("qnet gamma not correct") : nothing - (q2.qnet.edge[4].length !=x[2] || q2.qnet.edge[6].length !=x[3] || q2.qnet.edge[8].length !=x[4] || q2.qnet.edge[9].length !=x[5]) ? error("qnet edges lengths not correct") : nothing - - update!(q3.qnet,x,net) - q3.qnet.edge[8].gamma != x[1] || q3.qnet.edge[4].gamma != 1-x[1] ? error("qnet gamma not correct") : nothing - (q2.qnet.edge[4].length !=x[2] || q2.qnet.edge[6].length !=x[3] || q2.qnet.edge[8].length !=x[4] || q2.qnet.edge[9].length !=x[5]) ? error("qnet edges lengths not correct") : nothing - - update!(q4.qnet,x,net) - q4.qnet.edge[8].gamma != x[1] || q4.qnet.edge[4].gamma != 1-x[1] ? error("qnet gamma not correct") : nothing - (q2.qnet.edge[4].length !=x[2] || q2.qnet.edge[6].length !=x[3] || q2.qnet.edge[8].length !=x[4] || q2.qnet.edge[9].length !=x[5]) ? error("qnet edges lengths not correct") : nothing - - update!(q5.qnet,x,net) - q5.qnet.edge[7].gamma != x[1] || q5.qnet.edge[2].gamma != 1-x[1] ? error("qnet gamma not correct") : nothing - q5.qnet.edge[4].length != x[3] || q5.qnet.edge[8].length != x[4] ? error("qnet edge lengths not correct") : nothing - - reduce(&,[q.qnet.changed for q in d.quartet]) || error("all qnet should be changed") - - update!(net,x) - net.ht == x || ("net.ht not correctly changed to x with update") -catch - global err = true -end - -for q in d.quartet - update!(q.qnet,oldht,net) -end -update!(net,oldht) - -x = [0.1,0.2,1.,1.,1.] # changing t3 only -err = false - -#println("x is $(x) changing t3 only-----------") - -try - update!(q1.qnet,x,net) - q1.qnet.edge[7].gamma != x[1] || q1.qnet.edge[2].gamma != 1-x[1] ? error("qnet gamma not correct") : nothing - q1.qnet.edge[4].length != x[3] || q1.qnet.edge[8].length != x[4] ? error("qnet edge lengths not correct") : nothing - - update!(q2.qnet,x,net) - q2.qnet.edge[8].gamma != x[1] || q2.qnet.edge[4].gamma != 1-x[1] ? error("qnet gamma not correct") : nothing - (q2.qnet.edge[4].length !=x[2] || q2.qnet.edge[6].length !=x[3] || q2.qnet.edge[8].length !=x[4] || q2.qnet.edge[9].length !=x[5]) ? error("qnet edges lengths not correct") : nothing - - update!(q3.qnet,x,net) - q3.qnet.edge[8].gamma != x[1] || q3.qnet.edge[4].gamma != 1-x[1] ? error("qnet gamma not correct") : nothing - (q2.qnet.edge[4].length !=x[2] || q2.qnet.edge[6].length !=x[3] || q2.qnet.edge[8].length !=x[4] || q2.qnet.edge[9].length !=x[5]) ? error("qnet edges lengths not correct") : nothing - - update!(q4.qnet,x,net) - q4.qnet.edge[8].gamma != x[1] || q4.qnet.edge[4].gamma != 1-x[1] ? error("qnet gamma not correct") : nothing - (q2.qnet.edge[4].length !=x[2] || q2.qnet.edge[6].length !=x[3] || q2.qnet.edge[8].length !=x[4] || q2.qnet.edge[9].length !=x[5]) ? error("qnet edges lengths not correct") : nothing - - update!(q5.qnet,x,net) - q5.qnet.edge[7].gamma != x[1] || q5.qnet.edge[2].gamma != 1-x[1] ? error("qnet gamma not correct") : nothing - q5.qnet.edge[4].length != x[3] || q5.qnet.edge[8].length != x[4] ? error("qnet edge lengths not correct") : nothing - - [q.qnet.changed for q in d.quartet] == [false, true, true, true, false] || error("not all qnet should be changed") - - update!(net,x) - net.ht == x || ("net.ht not correctly changed to x with update") -catch - global err = true -end - -for q in d.quartet - update!(q.qnet,oldht,net) -end -update!(net,oldht) - - - -# ---- calculateExpCF -x = [0.2,0.2,0.1,0.1,0.1] -#println("---- calculate expCF for $(x)") -try - calculateExpCFAll!(d,x,net) - reduce(&,map(approxEq,q1.qnet.expCF,[(1-x[1])*(1/3*exp(-x[3]))+x[1]*(1-2/3*exp(-x[4])),(1-x[1])*(1-2/3*exp(-x[3]))+x[1]*(1/3*exp(-x[4])),(1-x[1])*(1/3*exp(-x[3]))+x[1]*(1/3*exp(-x[4]))])) || error("q1 expCF wrong") - t=-log(1+x[1]*(1-exp(-x[3]))-x[1]*x[1]*(1-exp(-x[5]-x[4]))-x[1]*x[1]*(1-exp(-x[3]))-(1-x[1])*(1-x[1])*(1-exp(-x[2]))) - reduce(&,map(approxEq,q2.qnet.expCF, [1-2/3*exp(-t),1/3*exp(-t),1/3*exp(-t)])) || error("q2 expCF wrong") - t=-log(1+x[1]*(1-exp(-x[3]-x[5]))-x[1]*x[1]*(1-exp(-x[4]))-x[1]*x[1]*(1-exp(-x[3]-x[5]))-(1-x[1])*(1-x[1])*(1-exp(-x[2]))) - reduce(&,map(approxEq,q3.qnet.expCF, [1/3*exp(-t),1/3*exp(-t),1-2/3*exp(-t)])) || error("q3 expCF wrong") - t=-log(1+x[1]*(1-exp(-x[5]))-x[1]*x[1]*(1-exp(-x[5]))-x[1]*x[1]*(1-exp(-x[4]))-(1-x[1])*(1-x[1])*(1-exp(-x[3]-x[2]))) - reduce(&,map(approxEq,q4.qnet.expCF, [1/3*exp(-t),1-2/3*exp(-t),1/3*exp(-t)])) || error("q4 expCF wrong") - reduce(&,map(approxEq,q5.qnet.expCF,[(1-x[1])*(1/3*exp(-x[3]))+x[1]*(1-2/3*exp(-x[4])),(1-x[1])*(1-2/3*exp(-x[3]))+x[1]*(1/3*exp(-x[4])),(1-x[1])*(1/3*exp(-x[3]))+x[1]*(1/3*exp(-x[4]))])) || error("q5 expCF wrong") - -catch - global err = true -end - -#logPseudoLik(d) - -if !err - #println("-------------Case I: NO ERRORS!------------") -else - globalerror = true -end - -@test !globalerror diff --git a/test/test_parameters.jl b/test/test_parameters.jl deleted file mode 100644 index 9f744fa52..000000000 --- a/test/test_parameters.jl +++ /dev/null @@ -1,82 +0,0 @@ -# tests with the 5 taxon networks parameters: net.ht, net.numht -# Claudia January 2015 - -# test functions - -#tests = ["C","F","G","H","J","D","E","I"]; -tests = ["F","G","H","J","I"]; -wrong = AbstractString[]; - -function whichtree(t::String) - if(t == "tree") - tree = "(((6:0.1,4:1.5)1:0.2,7:0.2)5:0.1,8:0.1,10:0.1);" # normal tree - elseif(t == "C") - tree = "((((6:0.1,4:1.5),(7:0.2)11#H1),11#H1),8:0.1,10:0.1);" # Case C: bad triangle II - elseif(t == "F") - tree = "(((6:0.1,(4)11#H1)1:0.2,(11#H1,7))5:0.1,8:0.1,10:0.1);" # Case F: bad diamond I - elseif(t == "G") - tree = "((((6:0.1,4:1.5)1:0.2,(7)11#H1)5:0.1,(11#H1,8)),10:0.1);" # Case G - elseif(t == "H") - tree = "((((6,4),#H1),7),(8)#H1,10);" # Case H - elseif(t == "J") - tree = "((((6)#H1,4),7),8,(#H1,10));" # Case J - elseif(t == "D") - tree = "((((6,4))#H1,(#H1,7)),8,10);" # Case D Bad triangle I - elseif(t == "E") - tree = "(((((8,10))#H1,7),#H1),6,4);" # Case E Bad triangle I - elseif(t == "I") - tree = "((((8,10))#H1,7),6,(4,#H1));" # Case I Bad diamond II - else - error("not a known 5 taxon network case") - end - return tree -end - - -function whichtest(t::String,net::HybridNetwork) - if(t == "C") - all(map(approxEq,net.ht,[exp(-1.)*(1-0.1*(1-exp(-1.))),exp(-1.)*(1-0.9*(1-exp(-1.))),-exp(-2.)*(0.1*(1-exp(-1.))*(1-exp(-1.))*0.9)])) || error("net.ht wrong in case $(t)") - net.numht == [41,42,43] || error("net.numht wrong in case $(t)") - elseif(t == "F") - all(map(approxEq,net.ht,[0.1,0.9*(1-exp(-.2)),0.1*(1-exp(-1.))])) || error("net.ht wrong in case $(t)") - net.numht == [8,31,32] || error("net.numht wrong in case $(t)") - net.index == [8,4,6] || error("net.index wrong in case $(t)") - elseif(t == "G") - all(map(approxEq,net.ht,[0.1,0.2,0.1,1.0])) || error("net.ht wrong in case $(t)") - net.numht == [7,3,6,9] || error("net.numht wrong in case $(t)") - net.index == [7,3,6,9] || error("net.index wrong in case $(t)") - elseif(t == "H") - all(map(approxEq,net.ht,[0.1,1.0,1.0,1.0])) || error("net.ht wrong in case $(t)") - net.numht == [4,3,5,7] || error("net.numht wrong in case $(t)") - net.index == [4,3,5,7] || error("net.index wrong in case $(t)") - elseif(t == "J") - all(map(approxEq,net.ht,[0.1,1.0,1.0,1.0])) || error("net.ht wrong in case $(t)") - net.numht == [8,4,6,10] || error("net.numht wrong in case $(t)") - net.index == [8,4,6,10] || error("net.index wrong in case $(t)") - elseif(t == "D") - all(map(approxEq,net.ht,[1.0,0.1*(1-exp(-1.)),0.1*0.1*(1-exp(-1.))+0.9*0.9*(1-exp(-2.))])) || error("net.ht wrong in case $(t)") - net.numht == [8,31,32] || error("net.numht wrong in case $(t)") - elseif(t == "E") - all(map(approxEq,net.ht,[1.0,0.9*(1-exp(-1.)),0.1*0.1*(1-exp(-2.))+0.9*0.9*(1-exp(-1.))])) || error("net.ht wrong in case $(t)") - net.numht == [8,31,32] || error("net.numht wrong in case $(t)") - elseif(t == "I") - all(map(approxEq,net.ht,[0.1,2.0,1.0,1.0,1.0])) || error("net.ht wrong in case $(t)") - net.numht == [9,4,6,9,10] || error("net.numht wrong in case $(t)") - net.index == [9,4,6,9,10] || error("net.index wrong in case $(t)") - else - error("not a known 5 taxon network case") - end -end - -for t in tests - #println("running $(t)") - global net = readTopologyLevel1(whichtree(t)); - try - whichtest(t,net) - catch - println("error in $(t)") - push!(wrong,t); - end -end - -@test isempty(wrong) diff --git a/test/test_parsimony.jl b/test/test_parsimony.jl index 6690e76cb..77cbbacf2 100644 --- a/test/test_parsimony.jl +++ b/test/test_parsimony.jl @@ -4,21 +4,30 @@ extrarun = false global net originalstdout = stdout +@testset "utility: readfastatodna" begin +fasta8sites = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_8sites.aln") +# fasta8sites = joinpath(dirname(pathof(PhyloNetworks)), "..", "examples", "Ae_bicornis_8sites.aln") +dna_dat, dna_weights = readfastatodna(fasta8sites, true) # 22 species +@test size(dna_dat) == (22, 9) +@test isa(dna_dat, DataFrame) +@test dna_weights == repeat([1], 8) +end + @testset "Fitch" begin # on a tree: -net = readTopology("(A,(B,(C,D)));") +net = readnewick("(A,(B,(C,D)));") tips = Dict("A" => 0, "B" => 0, "C" => 1, "D" => 1) redirect_stdout(devnull) # requires julia v1.6 -score, states = PhyloNetworks.parsimonyDiscreteFitch(net, tips) +score, states = PhyloNetworks.parsimonyfitch(net, tips) redirect_stdout(originalstdout) @test score==1 @test states==Dict(4=>Set([1]),-4=>Set([1]),-3=>Set([0]), 2=>Set([0]),3=>Set([1]),-2=>Set([0]),1=>Set([0])) # on a network: -net = readTopology("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);") +net = readnewick("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);") redirect_stdout(devnull) -score, states = PhyloNetworks.parsimonyDiscreteFitch(net, tips) +score, states = PhyloNetworks.parsimonyfitch(net, tips) redirect_stdout(originalstdout) @test score==1 @test states==Dict(4=>Set([1]),-4=>Set([0]),-3=>Set([1]), @@ -26,7 +35,7 @@ redirect_stdout(originalstdout) tips = Dict("A" => 0, "B" => 1, "C" => 0, "D" => 1) redirect_stdout(devnull) -score, states = PhyloNetworks.parsimonyDiscreteFitch(net, tips) +score, states = PhyloNetworks.parsimonyfitch(net, tips) redirect_stdout(originalstdout) @test score==2 @test states==Dict(4=>Set([0]),-6=>Set([0]),-4=>Set([0]), @@ -35,7 +44,7 @@ redirect_stdout(originalstdout) # from a data frame and with missing data: dat = DataFrame(taxon=["A","E","B","C","D"], trait=[missing,2,0,1,1]) redirect_stdout(devnull) -score, states = PhyloNetworks.parsimonyDiscreteFitch(net, dat) +score, states = PhyloNetworks.parsimonyfitch(net, dat) redirect_stdout(originalstdout) @test score==1 @test states==Dict(4=>Set([1]),-6=>Set([1]),-4=>Set([0]), @@ -44,49 +53,50 @@ end @testset "Testing level-based softwired parsimony" begin -net = readTopology("(A,(B,(C,D)));"); +net = readnewick("(A,(B,(C,D)));"); tips = Dict("A" => 0, "B" => 0, "C" => 1, "D" => 1); -@test parsimonySoftwired(net, tips) == 1.0 -net = readTopology("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);") -@test parsimonySoftwired(net, tips) == 1.0 -net = readTopology("((((A,(B)#H1),((C,(E)#H2),#H1)),(D,#H2)),(((F)#H3,G),(H,#H3)));"); +@test parsimonysoftwired(net, tips) == 1.0 +net = readnewick("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);") +@test parsimonysoftwired(net, tips) == 1.0 +net = readnewick("((((A,(B)#H1),((C,(E)#H2),#H1)),(D,#H2)),(((F)#H3,G),(H,#H3)));"); tips = Dict("A"=>0, "B"=>0, "C"=>0, "D"=>0, "E"=>0, "F"=>0, "G"=>0, "H"=>0); -@test parsimonySoftwired(net, tips) == 0.0 +@test parsimonysoftwired(net, tips) == 0.0 tips = Dict("A"=>0, "B"=>0, "C"=>0, "D"=>0, "E"=>0, "F"=>1, "G"=>1, "H"=>1); -@test parsimonySoftwired(net, tips) == 1.0 +@test parsimonysoftwired(net, tips) == 1.0 tips = Dict("A"=>1, "B"=>0, "C"=>0, "D"=>0, "E"=>0, "F"=>1, "G"=>1, "H"=>1); -@test parsimonySoftwired(net, tips) == 2.0 +@test parsimonysoftwired(net, tips) == 2.0 tips = Dict("A"=>"no", "B"=>"no", "C"=>"no", "D"=>"maybe", "E"=>"maybe", "F"=>"yes", "G"=>"yes", "H"=>"yes"); -@test parsimonySoftwired(net, tips) == 2.0 +@test parsimonysoftwired(net, tips) == 2.0 tips = Dict("A"=>"notatall", "B"=>"no", "C"=>"no", "D"=>"maybe", "E"=>"maybe", "F"=>"yes", "G"=>"notatall", "H"=>"yes"); -@test parsimonySoftwired(net, tips) == 3.0 +@test parsimonysoftwired(net, tips) == 3.0 -net = readTopology("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); +net = readnewick("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_8sites.aln") -species, sequences = PhyloNetworks.readFastaToArray(fastafile); -@test parsimonySoftwired(net, species, sequences) == 11.0 +species, sequences = PhyloNetworks.readfastatoarray(fastafile); +@test parsimonysoftwired(net, species, sequences) == 11.0 end # of test set for softwired parsimony if extrarun fastafile = "../examples/Ae_bicornis_Tr406_Contig10132.aln" - @test parsimonySoftwired(net, species, sequences) == 209.0 + species, sequences = PhyloNetworks.readfastatoarray(fastafile); + @test parsimonysoftwired(net, species, sequences) == 209.0 fastafile = "../examples/Ae_bicornis_Tr406_Contig10722.aln" - species, sequences = PhyloNetworks.readFastaToArray(fastafile); - @test parsimonySoftwired(net, species, sequences) == 583.0 - @time parsimonySoftwired(net, species, sequences) + species, sequences = PhyloNetworks.readfastatoarray(fastafile); + @test parsimonysoftwired(net, species, sequences) == 583.0 + @time parsimonysoftwired(net, species, sequences) # 1.299817 seconds (16.93 M allocations: 414.510 MiB, 3.47% gc time) end @testset "Testing general framework parsimony" begin -net = readTopology("(A,(B,(C,D)));"); +net = readnewick("(A,(B,(C,D)));"); tips = Dict("A" => 0, "B" => 0, "C" => 1, "D" => 1); @test parsimonyGF(net, tips) == 1.0 -net = readTopology("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);"); +net = readnewick("(((A,(B)#H1:::0.9),(C,#H1:::0.1)),D);"); @test parsimonyGF(net, tips) == 1.0 -net = readTopology("((((A,(B)#H1),((C,(E)#H2),#H1)),(D,#H2)),(((F)#H3,G),(H,#H3)));"); +net = readnewick("((((A,(B)#H1),((C,(E)#H2),#H1)),(D,#H2)),(((F)#H3,G),(H,#H3)));"); tips = Dict("A"=>0, "B"=>0, "C"=>0, "D"=>0, "E"=>0, "F"=>0, "G"=>0, "H"=>0); @test parsimonyGF(net, tips) == 0.0 tips = Dict("A"=>0, "B"=>0, "C"=>0, "D"=>0, "E"=>0, "F"=>1, "G"=>1, "H"=>1); @@ -97,19 +107,19 @@ tips = Dict("A"=>"no", "B"=>"no", "C"=>"no", "D"=>"maybe", "E"=>"maybe", "F"=>"y @test parsimonyGF(net, tips) == 2.0 tips = Dict("A"=>"notatall", "B"=>"no", "C"=>"no", "D"=>"maybe", "E"=>"maybe", "F"=>"yes", "G"=>"notatall", "H"=>"yes"); @test parsimonyGF(net, tips) == 3.0 -net = readTopology("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); +net = readnewick("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_8sites.aln") -species, sequences = PhyloNetworks.readFastaToArray(fastafile); +species, sequences = PhyloNetworks.readfastatoarray(fastafile); @test parsimonyGF(net, species, sequences) == 11.0 end # of test set for GF parsimony if extrarun fastafile = "../examples/Ae_bicornis_Tr406_Contig10132.aln" - species, sequences = PhyloNetworks.readFastaToArray(fastafile); + species, sequences = PhyloNetworks.readfastatoarray(fastafile); @test parsimonyGF(net, species, sequences) == 209.0 fastafile = "../examples/Ae_bicornis_Tr406_Contig10722.aln" - species, sequences = PhyloNetworks.readFastaToArray(fastafile); + species, sequences = PhyloNetworks.readfastatoarray(fastafile); @test parsimonyGF(net, species, sequences) == 583.0 @time parsimonyGF(net, species, sequences) """ @@ -126,14 +136,16 @@ end @testset "data from CSV, parsimony search" begin originalstdout = stdout -dat = DataFrame(CSV.File(joinpath(@__DIR__,"..","examples","Swadesh.csv")); copycols=false) -# net = readTopology("(((English,German),Norwegian),(Spanish,Portuguese));") -# species, sequences = PhyloNetworks.readCSVtoArray(dat) +dat = CSV.read(joinpath(@__DIR__,"..","examples","Swadesh.csv"), DataFrame) +# dat = CSV.read(joinpath(dirname(pathof(PhyloNetworks)),"..","examples","Swadesh.csv"), DataFrame) +# net = readnewick("(((English,German),Norwegian),(Spanish,Portuguese));") +# species, sequences = PhyloNetworks.readcsvtoarray(dat) # @test parsimonyGF(net, species, sequences) == 17.0 # arguments chosen for a very short run redirect_stdout(devnull) -@test_logs maxParsimonyNet(readTopology("(((English,Spanish),Norwegian),(German,Portuguese));"), - dat, hmax=1, runs=1, Nfail=2, outgroup="Spanish", rootname="", seed=6) +@test_broken PhyloNetworks.maxParsimonyNet( # replace @test_broken by @test_logs when fixed + readnewick("(((English,Spanish),Norwegian),(German,Portuguese));"), + dat, hmax=1, runs=1, Nfail=2, outgroup="Spanish", rootname="", seed=6) redirect_stdout(originalstdout) # best = PhyloNetworks.maxParsimonyNetRun1(net, dat, 100, 0.1, 1, 1234,stdout,false,0.3,"Spanish",:softwired) end diff --git a/test/test_partition.jl b/test/test_partition.jl deleted file mode 100644 index d7193a5b9..000000000 --- a/test/test_partition.jl +++ /dev/null @@ -1,35 +0,0 @@ -# test to see if update partition works -# Claudia May 2015 - -tree = "(((((((1,2),3),4),5),(6,7)),(8,9)),10);" - -# earlier seeds: 2738, 56326 up to v0.14.2 -seed = 41 - -currT0 = readTopologyLevel1(tree); -Random.seed!(seed); -besttree = deepcopy(currT0); -successful,_ = PhyloNetworks.addHybridizationUpdate!(besttree); -@test successful -@test_logs PhyloNetworks.writeTopologyLevel1(besttree,true) -net = deepcopy(besttree); -length(net.partition) -@test Set([e.number for e in p.edges] for p in net.partition) == - Set([[15], [11], [10], [9,7,5,3,1,2,4,6,8], [17], [14]]) - -successful = false -successful,_ = PhyloNetworks.addHybridizationUpdate!(besttree); -@test successful -@test_logs PhyloNetworks.writeTopologyLevel1(besttree,true) -net = deepcopy(besttree); -@test length(net.partition) == 9 -@test Set([e.number for e in p.edges] for p in net.partition) == - Set([[14], [11], [10], [17], [15], [22,8,9], [3,1,2], [4], [6]]) - -deleteHybridizationUpdate!(net,net.node[21]); -@test length(net.partition) == 6 -@test Set([e.number for e in p.edges] for p in net.partition) == - Set([[14], [11], [10], [17], [15], [22,8,9,3,1,2,4,21,5]]) - -deleteHybridizationUpdate!(net,net.node[18]); -@test length(net.partition) == 0 diff --git a/test/test_partition2.jl b/test/test_partition2.jl deleted file mode 100644 index d1e90d6df..000000000 --- a/test/test_partition2.jl +++ /dev/null @@ -1,114 +0,0 @@ -# functions to try to debug cui3.out -# converted to test function - -PhyloNetworks.CHECKNET || error("need CHECKNET==true in PhyloNetworks to test snaq in test_correctLik.jl") - -@testset "test: level-1 partitions" begin - -global net, flag, flag2, flag3, nocycle -text = "(Xmayae,((Xhellerii,(((Xclemenciae_F2,Xmonticolus):1.458,(((((Xmontezumae,(Xnezahuacoyotl)#H26:0.247::0.804):0.375,((Xbirchmanni_GARC,Xmalinche_CHIC2):0.997,Xcortezi):0.455):0.63,(#H26:0.0::0.196,((Xcontinens,Xpygmaeus):1.932,(Xnigrensis,Xmultilineatus):1.401):0.042):2.439):2.0)#H7:0.787::0.835,(Xmaculatus,(Xandersi,(Xmilleri,((Xxiphidium,#H7:9.563::0.165):1.409,(Xevelynae,(Xvariatus,(Xcouchianus,(Xgordoni,Xmeyeri):0.263):3.532):0.642):0.411):0.295):0.468):0.654):1.022):0.788):1.917)#H27:0.149::0.572):0.668,Xalvarezi):0.257,(Xsignum,#H27:1.381::0.428):4.669);" - -#net = readTopology("cui3.out") -net = readTopology(text) -#printPartitions(net) -#printEdges(net) -cleanBL!(net) -cleanAfterRead!(net,false) -length(net.hybrid) -@test [n.number for n in net.hybrid] == [7,15,25] # or: wrong hybrid nodes" - -# ----------------- update everything but partition ------------------ -@testset "udpate hybrid 1" begin -n=net.hybrid[1]; -flag, nocycle, edgesInCycle, nodesInCycle = updateInCycle!(net,n); -@test flag -@test [n.number for n in nodesInCycle] == [7,-16,-10,-11,-12] -@test [n.number for n in edgesInCycle] == [16,24,15,9,8] -flag2, edgesGammaz = updateGammaz!(net,n,false); -@test flag2 -@test isempty([n.number for n in edgesGammaz]) -@test !n.isBadDiamondI -@test !n.isBadDiamondII -flag3, edgesRoot = updateContainRoot!(net,n); -@test flag3 -@test [n.number for n in edgesRoot] == [7] -end - -@testset "udpate hybrid 2" begin -n=net.hybrid[2]; -flag, nocycle, edgesInCycle, nodesInCycle = updateInCycle!(net,n); -@test flag -@test [n.number for n in nodesInCycle] == [15,-24,-23,-22,-21,-20,-8] -@test [n.number for n in edgesInCycle] == [31,32,42,43,44,45,26] -flag2, edgesGammaz = updateGammaz!(net,n,false); -@test flag2 -@test isempty([n.number for n in edgesGammaz]) -@test !n.isBadDiamondI -@test !n.isBadDiamondII -flag3, edgesRoot = updateContainRoot!(net,n); -@test flag3 -@test [n.number for n in edgesRoot] == [25,15,9,6,14,12,10,11,13,24,23,19,17,18,22,20,21] -end - -@testset "udpate hybrid 3" begin -n=net.hybrid[3]; -flag, nocycle, edgesInCycle, nodesInCycle = updateInCycle!(net,n); -@test flag -@test [n.number for n in nodesInCycle] == [25,-29,-2,-3,-4] -@test [n.number for n in edgesInCycle] == [53,54,51,49,48] -flag2, edgesGammaz = updateGammaz!(net,n,false); -@test flag2 -@test isempty([n.number for n in edgesGammaz]) -@test !n.isBadDiamondI -@test !n.isBadDiamondII -flag3, edgesRoot = updateContainRoot!(net,n); -@test flag3 -@test [n.number for n in edgesRoot] == [47,5,3,4,46,45,27,44,28,43,29,42,32,30,41,33,40,34,39,35,38,36,37] - -@test isempty(net.partition) -end - -# -------------- update partition --------------------- -@testset "partition hybrid 1" begin -n=net.hybrid[1]; -nocycle, edgesInCycle, nodesInCycle = identifyInCycle(net,n); -@test [n.number for n in edgesInCycle] == [16,24,15,9,8] -@test [n.number for n in nodesInCycle] == [7,-16,-10,-11,-12] -updatePartition!(net,nodesInCycle) -@test length(net.partition) == 5 -@test [n.number for n in net.partition[1].edges] == [7] -@test [n.number for n in net.partition[2].edges] == [23,19,17,18,22,20,21] -@test [n.number for n in net.partition[3].edges] == [25] -@test [n.number for n in net.partition[4].edges] == [14,12,10,11,13] -@test [n.number for n in net.partition[5].edges] == [6] -end - -@testset "partition hybrid 2" begin -n=net.hybrid[2]; -nocycle, edgesInCycle, nodesInCycle = identifyInCycle(net,n); -@test [n.number for n in nodesInCycle] == [15,-24,-23,-22,-21,-20,-8] -@test [n.number for n in edgesInCycle] == [31,32,42,43,44,45,26] -updatePartition!(net,nodesInCycle) -@test length(net.partition) == 11 -@test [n.number for n in net.partition[6].edges] == [30] -@test [n.number for n in net.partition[7].edges] == [41,33,40,34,39,35,38,36,37] -@test [n.number for n in net.partition[8].edges] == [29] -@test [n.number for n in net.partition[9].edges] == [28] -@test [n.number for n in net.partition[10].edges] == [27] -@test [n.number for n in net.partition[11].edges] == [46,5,3,4,47] -end - -@testset "partition hybrid 3" begin -n=net.hybrid[3]; -nocycle, edgesInCycle, nodesInCycle = identifyInCycle(net,n); -@test [n.number for n in nodesInCycle] == [25,-29,-2,-3,-4] -@test [n.number for n in edgesInCycle] == [53,54,51,49,48] -updatePartition!(net,nodesInCycle) -@test length(net.partition) == 15 -@test [n.number for n in net.partition[12].edges] == [52] -@test [n.number for n in net.partition[13].edges] == [1] -@test [n.number for n in net.partition[14].edges] == [50] -@test [n.number for n in net.partition[15].edges] == [2] -end -#printPartitions(net) -end diff --git a/test/test_perfectData.jl b/test/test_perfectData.jl deleted file mode 100644 index 66da5d6d3..000000000 --- a/test/test_perfectData.jl +++ /dev/null @@ -1,1381 +0,0 @@ -## test to see if we get lik=0.0 with perfect data -## with a network of 15 taxa, 3 hyb -## Claudia September 2016 - -PhyloNetworks.CHECKNET || error("need CHECKNET==true in PhyloNetworks to test snaq in test_correctLik.jl") - -qvec = Quartet[]; -push!(qvec,Quartet(1,["10","12","7","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","11","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","8","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","4","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","11","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","4","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","7","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","8","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","4","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","7","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","7","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","7","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","8","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","4","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","8","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","8","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","4","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","8","4"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","11","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","8","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","7","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","11","8"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","7","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","8","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","7","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","11","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","7","8"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","7","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","4","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","7","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","7","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","7","4"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","8","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","7","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","4","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","7","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","11","4"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","8","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","11","7"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","11","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","8","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","7","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","4","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","7","4"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","11","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","7","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","4","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","7","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","8","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","7","8"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","11","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","8","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","8","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","11","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","7","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","4","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","8","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","7","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","11","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","8","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","4","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","8","4"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","8","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","8","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","8","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","12","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","4","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","8","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","4","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","8","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","4","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","4","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","4","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","4","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","4","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","4","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","8","4"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","4","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","4","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","8","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","8","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","4","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","4","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","4","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","4","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","4","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","4","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","8","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","8","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","8","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","4","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","4","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","4","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","8","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","8","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","7","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","11","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","4","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","4","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","4","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","4","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","4","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","4","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","8","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","4","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","7","4"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","8","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","7","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","7","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","7","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","8","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","4","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","8","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","8","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","7","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","7","8"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","8","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","9","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","8","4"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","7","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","4","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","8","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","4","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","9","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","2","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","2","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","4","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","4","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","8","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","9","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","2","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","7","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","4","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","2","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","9","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","7","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","9","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","9","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","2","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","8","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","9","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","1","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","9","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","9","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","6","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","1","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","5","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","7","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","1","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","4","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","2","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","7","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","9","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","4","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","13","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","4","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["10","3","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","8","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","4","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","4","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","8","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","8","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","4","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","8","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","8","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","4","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","4","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","8","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","4","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","8","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","4","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","4","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","4","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","4","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","4","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","4","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","4","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","4","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","4","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","8","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","4","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","8","4"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","4","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","8","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","4","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","8","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","11","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","7","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","8","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","4","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","5","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","4","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","8","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","8","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","4","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","4","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","2","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","4","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","8","4"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","8","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","2","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","9","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","2","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","4","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","9","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","1","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","4","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","8","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","9","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","6","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","2","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","1","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","9","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","9","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","2","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","4","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","4","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","9","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","9","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","8","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","8","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","8","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","4","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","9","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","9","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","4","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","8","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","8","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","4","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","2","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","1","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","9","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","7","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","3","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["12","13","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","4","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","4","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","4","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","4","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","4","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","4","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","4","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","4","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","8","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","4","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","9","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","4","5"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","2","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","6","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","9","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","2","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","2","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","9","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","2","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","4","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","1","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","1","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","9","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","4","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","9","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","1","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","4","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","9","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","4","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","2","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","9","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","4","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","9","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","2","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","9","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","4","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","5","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","4","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","13","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","3","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["11","9","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","4","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","5","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","8","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","3","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","1","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","1","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","9","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","9","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","5","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","2","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","9","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","2","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","9","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","5","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","2","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","5","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","5","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","9","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","9","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","5","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","5","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","9","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","2","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","6","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","5","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","13","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","9","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","5","3"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","2","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","9","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","9","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","1","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["7","2","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","4","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","5","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","2","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","3","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","2","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","2","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","9","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","6","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","3","13"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","9","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","9","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","2","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","9","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","1","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","3","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","9","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","3","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","2","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","9","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","1","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","1","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","9","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","9","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","3","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","9","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","2","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","3","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","9","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","3","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","3","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","5","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","3","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["8","13","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","2","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","1","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","9","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","2","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","9","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","9","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","9","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","9","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","6","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","9","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","9","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","6","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","9","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","13","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","9","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","1","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","1","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","9","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","13","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","1","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","9","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","2","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","1","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","9","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","2","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","2","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","2","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","2","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","9","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","9","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","9","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","9","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","9","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","9","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","2","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","13","9"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","9","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","1","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","9","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","13","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","9","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","13","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","9","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","2","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","9","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","13","2"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","2","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","9","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","2","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","9","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["4","13","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","9","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","3","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","13","9","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","2","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["5","13","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","9","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","2","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["9","2","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","6","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","2","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","9","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","2","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","2","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","9","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","9","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","1","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","1","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["9","2","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","2","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["9","6","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["9","1","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["2","1","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["1","6","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","9","2","1"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","9","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["9","2","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","2","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","2","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["2","1","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","9","2","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["2","6","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","2","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","6","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","2","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","9","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","9","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","9","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","9","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","2","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","2","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","9","1","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","9","1","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["9","1","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["9","2","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","9","15","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","9","2","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["9","1","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["9","2","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","1","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","9","2","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","1","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["3","1","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","2","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["9","2","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","9","6","15"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["2","1","6","14"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","9","1","6"],[0.5,0.4,0.1])); -push!(qvec,Quartet(1,["13","1","15","14"],[0.5,0.4,0.1])); - -dpre = DataCF(qvec); -net = readTopologyLevel1("(15,(1,((14,(#H1,(((12,13),(11,#H3)),(7,((10)#H3,(8,9)))))),((((2,3))#H2,(6,(5,(#H2,4)))))#H1)));"); -extractQuartet!(net,dpre) -df = writeExpCF(dpre.quartet) - -d = readTableCF!(df) -val = optBL!(net,d, .1,.1,.1,.1) -@test val ≈ 0.0 atol=1e-12 # || error("not correct likelihood with perfect data") diff --git a/test/test_phyLiNCoptimization.jl b/test/test_phyLiNCoptimization.jl deleted file mode 100644 index a432d38a4..000000000 --- a/test/test_phyLiNCoptimization.jl +++ /dev/null @@ -1,392 +0,0 @@ -@testset "phyLiNC" begin - -fastasimple = joinpath(@__DIR__, "..", "examples", "simple.aln") -fasta8sites = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_8sites.aln") # 8 sites only -fastacontig = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln") -fasta1missing = joinpath(@__DIR__, "..", "examples", "simple_missingone.aln") -fastaindiv = joinpath(@__DIR__, "..", "examples", "individuals.aln") -mappingfile = joinpath(@__DIR__, "..", "examples", "mappingIndividuals.csv") -#= for local trials only, not for automatic testing - pkgpath = dirname(Base.find_package("PhyloNetworks")) - fastasimple = abspath(joinpath(pkgpath, "..", "examples", "simple.aln")) - fasta8sites = abspath(joinpath(pkgpath, "..", "examples", "Ae_bicornis_8sites.aln")) - fastacontig = abspath(joinpath(pkgpath, "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln")) - fasta1missing = abspath(joinpath(pkgpath, "..", "examples", "simple_missingone.aln")) - fastaindiv = abspath(joinpath(pkgpath, "..", "examples", "individuals.aln")) - mappingfile = abspath(joinpath(pkgpath, "..", "examples", "mappingIndividuals.csv")) -=# -emptyconstraint = PhyloNetworks.TopologyConstraint[] - -@testset "optimize local BL & gammas, simple example" begin -Random.seed!(99) -net_simple = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);") -obj = PhyloNetworks.StatisticalSubstitutionModel(net_simple, fastasimple, :JC69) - -## Local BL -obj.loglik = -Inf64 -obj.net.edge[2].length= 0.0 # unzipping -e = PhyloNetworks.optimizelocalBL_LiNC!(obj, obj.net.edge[6], - PhyloNetworks.CacheLengthLiNC(obj, 1e-6,1e-6,1e-2,1e-3, 10)) -@test length(e) == 4 # not 5: edge below hybrid was excluded -@test obj.loglik > -40.0 # starting likelihood = -43.95468386633092 - -# ## Local Gamma -γcache = PhyloNetworks.CacheGammaLiNC(obj) -hybridmajorparent = PhyloNetworks.getparentedge(obj.net.hybrid[1]) -@test_nowarn PhyloNetworks.optimizelocalgammas_LiNC!(obj, hybridmajorparent, 1e-6, γcache) -@test hybridmajorparent.gamma != 0.9 -@test PhyloNetworks.getparentedgeminor(obj.net.hybrid[1]).gamma != 0.1 -end - -@testset "optimize local BL & gammas, complex network and 8 sites" begin -Random.seed!(98) -dna_dat, dna_weights = readfastatodna(fasta8sites, true); # 22 species, 3 hybrid nodes, 103 edges -net = readTopology("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); -PhyloNetworks.fuseedgesat!(93, net) -obj = (@test_logs (:warn, r"taxa with no data") PhyloNetworks.StatisticalSubstitutionModel(net, fasta8sites, :JC69)) -@test length(obj.net.leaf) == 22 -io = IOBuffer(); -PhyloNetworks.showdata(io, obj) -@test String(take!(io)) == "data:\n 22 species\n 8 sites" -PhyloNetworks.showdata(io, obj, true) -@test String(take!(io)) == -"data: - 22 species - 8 sites - 0 sites with no data (0.0%) - 2 invariant sites (25.0%) - 6 sites with 2 distinct states (75.0%) - 6 parsimony-informative sites (75.0%) - 6 sites with 1 or more missing values (75.0%) - 3.41% missing values overall" -close(io) - -preorder!(obj.net) -PhyloNetworks.checknetwork_LiNC!(obj.net, 3, true, true, emptyconstraint) -# checknetwork removes degree-2 nodes (including root) and 2- and 3-cycles -# and requires that the network is preordered. -PhyloNetworks.updateSSM!(obj, true; constraints=emptyconstraint) -PhyloNetworks.startingBL!(obj.net, obj.trait, obj.siteweight) -PhyloNetworks.unzip_canonical!(obj.net) -## Local BL -lcache = PhyloNetworks.CacheLengthLiNC(obj, 1e-6,1e-6,1e-2,1e-3, 5) -obj.loglik = +Inf64 -PhyloNetworks.optimizelocalBL_LiNC!(obj, obj.net.edge[27], lcache) -obj.loglik = -Inf64 -@test_nowarn PhyloNetworks.optimizelocalBL_LiNC!(obj, obj.net.edge[27], lcache) -@test obj.net.edge[27].length ≈ 1e-8 atol=.0001 -@test obj.net.edge[32].length ≈ 0.032 atol=.0005 -@test obj.loglik > -80.4 -# Local BL constrained edge -lengthe = obj.net.edge[44].length -@test_nowarn PhyloNetworks.optimizelocalBL_LiNC!(obj, obj.net.edge[44], lcache) -@test obj.net.edge[44].length == 0.0 -@test obj.loglik > -78.95 - -# ## Local Gamma -# edge[4] = major parent edge of hybrid[1] -γcache = PhyloNetworks.CacheGammaLiNC(obj) -@test_nowarn PhyloNetworks.optimizelocalgammas_LiNC!(obj, obj.net.edge[4], 1e-6,γcache) -@test obj.net.edge[4].gamma == 0.0 -@test PhyloNetworks.getparentedge(obj.net.hybrid[1]).gamma == 1.0 - -# gamma at a hybrid ladder: when some displayed trees don't have the focus edge -# 2 unzipped reticulations in a hybrid ladder, reasonable (small) branch lengths -net = readTopology("(#H2:0.0001::0.0244,((C:0.0262,((B:0.0)#H1:0.0::0.6)#H2:0.03::0.9756):0.4812,(#H1:0.0001::0.4,A:0.1274):0.0001):0.0274,D:0.151);") -obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastasimple, :JC69) -obj.trait[1][3] = 3 # to create discordance across sites -obj.trait[4][4] = 2 # for estimated γ to be within (0,1) -γcache = PhyloNetworks.CacheGammaLiNC(obj) -PhyloNetworks.discrete_corelikelihood!(obj) # -29.82754754416619 -ll = PhyloNetworks.optimizegamma_LiNC!(obj, obj.net.edge[4], .001, γcache, 3) -@test ll ≈ -29.655467369763585 -@test obj.net.edge[4].gamma ≈ 0.8090635871910823 -@test γcache.hase == [true, true, false] -@test all(γcache.clikn .== 0.0) -ll = PhyloNetworks.optimizegamma_LiNC!(obj, obj.net.edge[1], .001, γcache, 3) -@test ll ≈ -29.468517891012983 -@test obj.net.edge[1].gamma ≈ 0.19975558937688737 -@test γcache.hase[[1,2]] == [false,true] -@test γcache.hase[3] === missing -@test γcache.clikn[[6,7]] ≈ [0.25, 0.0007] rtol=0.01 -end #of local branch length and gamma optimization with localgamma! localBL! with 8 sites - -@testset "global branch length and gamma optimization" begin -# to run locally on complex network: -# net = readTopology("(H_vulgare_HVens23:0.5,(((Ae_speltoides_Tr251:0.5):0.5,(Ae_mutica_Tr237:0.0)#H4:1.0::0.7):0.5,((((((Ae_caudata_Tr139:0.5,Ae_caudata_Tr275:0.5):0.0)#H1:1.0::0.7,#H2:1.0::0.3):0.5,#H1:1.0::0.3):0.5,((Ae_comosa_Tr271:0.5,Ae_comosa_Tr272:0.5):0.5,((Ae_uniaristata_Tr403:0.5,Ae_uniaristata_Tr357:0.5):0.5,Ae_uniaristata_Tr402:0.5):0.5):0.5):0.5,(((Ae_tauschii_Tr352:0.5,Ae_tauschii_Tr351:0.5):0.5,Ae_tauschii_Tr125:0.5):0.5,(((((((Ae_longissima_Tr241:0.5,Ae_longissima_Tr242:0.5):0.5,Ae_longissima_Tr355:0.5):0.5,Ae_sharonensis_Tr265:0.5):0.5,((Ae_bicornis_Tr408:0.5,Ae_bicornis_Tr407:0.5):0.5,Ae_bicornis_Tr406:0.5):0.5):0.5,(Ae_searsii_Tr164:0.5,Ae_searsii_Tr165:0.5):0.5):0.0)#H2:1.0::0.7,#H4:1.0::0.3):0.5):0.5):0.5):0.5);"); -# obj = PhyloNetworks.StatisticalSubstitutionModel(net, fasta8sites, :JC69); -net = readTopology("(((A:0.5,(B:0.0)#H1:1.0::0.9):0.5,(C:0.5,#H1:1.0::0.1):0.5):0.5,D:0.5);") -# branch lengths set to 0.5, then unzipped -> some BL are 0, some 1, most 0.5 -obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastasimple, :JC69); - -## optimizeBL -Random.seed!(5); -lcache = PhyloNetworks.CacheLengthLiNC(obj, 1e-6,1e-6,1e-2,1e-3, 5) -obj.loglik = -Inf64 -@test_nowarn PhyloNetworks.optimizealllengths_LiNC!(obj, lcache); -@test all(e.length != 1.0 for e in obj.net.edge) -@test sum(e.length == 1.0e-8 for e in obj.net.edge) >= 2 -@test sum(e.length == 0.0 for e in obj.net.edge) == 1 -@test sum(e.length for e in obj.net.edge) > 0.7 - -## optimizegammas -- and delete hybrid edges with γ=0 -γcache = PhyloNetworks.CacheGammaLiNC(obj) -@test_nowarn PhyloNetworks.optimizeallgammas_LiNC!(obj,1e-6,γcache,100) -@test obj.net.numHybrids == 0 -end - -@testset "data to SSM pruning: complex network" begin -net = readTopology("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); -PhyloNetworks.fuseedgesat!(93, net) -for edge in net.edge # reset network - setLength!(edge,1.0) -end -for h in net.hybrid - setGamma!(PhyloNetworks.getparentedge(h),0.6) -end -obj = (@test_logs (:warn, r"pruned") PhyloNetworks.StatisticalSubstitutionModel(net, fasta8sites, :JC69)) -@test length(obj.net.leaf) == 22 -@test length(obj.net.edge) == 52 -@test length(obj.net.hybrid) == 3 -@test !PhyloNetworks.hashybridladder(obj.net) -end - -@testset "checknetwork LiNC" begin -tree = readTopology("(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);"); -@test any(length(n.edge) == 2 for n in tree.node) # one node of degree 2 -preorder!(tree) -PhyloNetworks.checknetwork_LiNC!(tree, 1, true, true) -@test all(length(n.edge) != 2 for n in tree.node) # no nodes of degree 2 -net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);") -@test_throws ErrorException PhyloNetworks.checknetwork_LiNC!(net, 0, true, true) - -netstr = "(#H2:0.1::0.2,((C:0.2,((B:0.3)#H1:0.4)#H2:0.5::0.8):0.6,(#H1:0.7,((A1:0.8)#H3:0.01,(A2:0.9,#H3:0.02):0.03):1.0):1.1):1.2,O:1.3);" -net = readTopology(netstr) -# 2 reticulation in a hybrid ladder, and another isolated reticulation -undoinfo = PhyloNetworks.unzip_canonical!(net) -@test all(PhyloNetworks.getchildedge(h).length == 0.0 for h in net.hybrid) # unzipped -@test writeTopology(net, round=true) == "(#H2:0.8::0.2,((C:0.2,((B:0.0)#H1:0.0)#H2:1.2::0.8):0.6,(#H1:1.0,((A1:0.0)#H3:0.81,(A2:0.9,#H3:0.82):0.03):1.0):1.1):1.2,O:1.3);" -PhyloNetworks.rezip_canonical!(undoinfo...) -@test writeTopology(net, round=true) == netstr -end - -@testset "update root in SSM displayed trees" begin -# W structure -net = readTopology("(C:0.0262,(B:0.0)#H2:0.03::0.9756,(((D:0.1,A:0.1274):0.0)#H1:0.0::0.6,(#H2:0.0001::0.0244,#H1:0.151::0.4):0.0274):0.4812);") -# "((C:0.0262,(B:0.0)#H2:0.03::0.9756):0.4812,((D:0.1,A:0.1274):0.0)#H1:0.0::0.6,(#H2:0.0001::0.0244,#H1:0.151::0.4):0.0274);") -obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastasimple, :JC69) -@test [t.node[t.root].number for t in obj.displayedtree] == [5,5,5,5] -# obj.displayedtree[1]: (C:0.026,(B:0.0):0.03,(((D:0.1,A:0.127):0.0):0.0):0.481); -# move the root to place the W structure at the root: -# the network's root node will be missing from some displayed trees. -rootatnode!(obj.net, 7) # node 7 = tree node whose 2 children are both hybrids -# "(#H2:0.0001::0.0244,((C:0.0262,(B:0.0)#H2:0.03::0.9756):0.4812,((D:0.1,A:0.1274):0.0)#H1:0.0::0.6):0.0274,#H1:0.151);" -PhyloNetworks.updateSSM_root!(obj) # re-root displayed trees in the same way -@test [t.node[t.root].number for t in obj.displayedtree] == [6,7,7,7] -@test writeTopology(obj.displayedtree[1]) == "(((D:0.1,A:0.1274):0.0)H1:0.0,(C:0.0262,(B:0.0)H2:0.03):0.4812);" -end - -@testset "skip γ and lengths optimization when needed" begin -# W structure, with middle γs = 0 -net = readTopology("(C:0.0262,(B:0.0)#H2:0.03::1,(((D:0.1,A:0.1274):0.0)#H1:0.004::1,(#H2:0.0001,#H1:0.151):0.0274):0.4812);") -obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastasimple, :JC69) -for i in [8,9] setGamma!(obj.net.edge[i], 0.0); end -PhyloNetworks.updateSSM!(obj) -lcache = PhyloNetworks.CacheLengthLiNC(obj, 1e-6,1e-6,1e-2,1e-3, 5); -e = PhyloNetworks.optimizelocalBL_LiNC!(obj, obj.net.edge[10], lcache) -@test length(e) == 3 # not 5: the 2 edges with γ = 0 were excluded -@test obj.net.edge[10].length == 0.0274 -# hybrid ladder, with lower γ = 0 -net = readTopology("(#H2:0.0001::0.0244,((C:0.0262,((B:0.0)#H1:0.0::0.6)#H2:0.03::0.9756):0.4812,(#H1:0.0001::0.4,A:0.1274):0.0001):0.0274,D:0.151);") -obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastasimple, :JC69) -setGamma!(obj.net.edge[4], 0.0); PhyloNetworks.updateSSM!(obj) -e = PhyloNetworks.optimizelocalBL_LiNC!(obj, obj.net.edge[5], lcache) -@test length(e) == 4 -@test [obj.net.edge[i].length for i in [1,5]] == [0.0001, 0.03] -γcache = PhyloNetworks.CacheGammaLiNC(obj); -ll = PhyloNetworks.optimizegamma_LiNC!(obj, obj.net.edge[5], .001, γcache, 3) -@test ll ≈ -31.124547305074074 # same as before optimization -end - -@testset "optimizestructure with simple example" begin -#= network pre-processing: resulting net hard-coded below. -net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);") -obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastasimple, :JC69; maxhybrid=1) -PhyloNetworks.checknetwork_LiNC!(obj.net, 1, true, true) -PhyloNetworks.updateSSM!(obj, true; constraints=emptyconstraint) -PhyloNetworks.startingBL!(obj.net, obj.trait, obj.siteweight) -PhyloNetworks.unzip_canonical!(obj.net) -writeTopology(obj.net) -=# -net = readTopology("((A:0.3399824481995197,(B:0.0)#H1:0.08353360676474617::0.9):0.0001,(C:0.0001,#H1:0.048844990600034506::0.1):0.10871530327558311,D:0.33998306091744424);") -obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastasimple, :JC69; maxhybrid=1) -PhyloNetworks.discrete_corelikelihood!(obj) -@test obj.loglik ≈ -29.7762035 -maxmoves = 2 -Random.seed!(90) -γcache = PhyloNetworks.CacheGammaLiNC(obj) -lcache = PhyloNetworks.CacheLengthLiNC(obj, 1e-6,1e-6,1e-2,1e-3, 5) -PhyloNetworks.optimizestructure!(obj, maxmoves, 1, true, true, 0,100, - emptyconstraint, 1e-6, γcache, lcache) -@test obj.loglik > -27.6 # -27.42 with RNG from julia 1.5 - -# allow hybrid ladders -Random.seed!(110) -PhyloNetworks.optimizestructure!(obj, maxmoves, 1, true, false, 0,100, - emptyconstraint, 1e-6, γcache, lcache) -@test obj.loglik > -27.5 # -27.42 with RNG from julia 1.5 -end # of optimizestructure with simple example - -@testset "phyLiNCone with simple net, no constraints" begin -no3cycle = true -net = readTopology("((A:0.3399824481995197,(B:0.0)#H1:0.08353360676474617::0.9):0.0001,(C:0.0001,#H1:0.048844990600034506::0.1):0.10871530327558311,D:0.33998306091744424);") -seed = 102 -for nohybridladder in [true, false] - #= - net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); - obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastasimple, :JC69) - PhyloNetworks.checknetwork_LiNC!(obj.net, 1, no3cycle, nohybridladder) - PhyloNetworks.updateSSM!(obj, true; constraints=emptyconstraint) - PhyloNetworks.startingBL!(obj.net, obj.trait, obj.siteweight) - PhyloNetworks.unzip_canonical!(obj.net) - writeTopology(obj.net) # result hard-coded above. independent of nohybridladder - =# - obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastasimple, :JC69) - obj.loglik = -Inf # missing otherwise, which would cause an error below - γcache = PhyloNetworks.CacheGammaLiNC(obj) - lcache = PhyloNetworks.CacheLengthLiNC(obj, 1e-6,1e-6,1e-2,1e-3, 5) - @test_nowarn PhyloNetworks.phyLiNCone!(obj, 1, no3cycle, - nohybridladder, 3, 2, false, false, - devnull, seed, 0.5, emptyconstraint, - 1e-2, 1e-2, 1e-2, 1e-2, 0.0, 25.0, 0.01,0.9, - γcache, lcache) - @test obj.loglik > -27.45 -end -end - -@testset "phyLiNC no constraints: HKY, rate variation" begin -net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); -obj = @test_nowarn PhyloNetworks.phyLiNC(net, fastasimple, :JC69, :G, 2; maxhybrid=2, # no missing BLs, so they're not re-estimated - no3cycle=true, nohybridladder=true, maxmoves=2, - nreject=1, nruns=1, filename="", verbose=false, seed=108) -@test obj.loglik > -27.5 # depends on RNG. -27.4 with julia 1.5, -27.27 earlier -net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); -obj = @test_nowarn PhyloNetworks.phyLiNC(net, fastasimple, :HKY85; maxhybrid=2, - no3cycle=true, nohybridladder=true, maxmoves=2, probST=1.0, # not enough moves to get back to a good topology - nreject=1, nruns=1, filename="phyLiNC2", verbose=false, seed=0) -@test obj.loglik > -24.21 -@test read("phyLiNC2.err", String) == "" -@test startswith(read("phyLiNC2.log", String), "PhyLiNC network estimation starting") -rm("phyLiNC2.log") -rm("phyLiNC2.err") - -net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); -addprocs(1) # multiple cores -@everywhere using PhyloNetworks -#using Distributed; @everywhere begin; using Pkg; Pkg.activate("."); using PhyloNetworks; end -originalstdout = stdout # verbose=true below -redirect_stdout(devnull) -obj = PhyloNetworks.phyLiNC(net, fastasimple, :JC69; maxhybrid=2, no3cycle=true, - nohybridladder=true, maxmoves=2, nreject=1, nruns=2, - filename="phyLiNCmult", verbose=true, seed=106) -redirect_stdout(originalstdout) -@test obj.loglik > -28.27 -rmprocs(workers()) # remove extra processors -@test occursin("using 1 worker", read("phyLiNCmult.log", String)) -rm("phyLiNCmult.log") - -# phyLiNC w/ maxhybrid = 0 -net_h0 = readTopology("(((A:2.0,B:1.0):1.5,C:0.6):0.5,D:2.0);"); -obj = @test_nowarn PhyloNetworks.phyLiNC(net_h0, fastasimple, :JC69, :G, 2; maxhybrid=0, - no3cycle=true, nohybridladder=true, maxmoves=2, - nreject=1, nruns=1, filename="", verbose=false, seed=115) -@test obj.loglik > -27.4 -end - -@testset "phyLiNC with simple net and one constraint" begin -net_level1_s = readTopology("(((S8,S9),((((S1,S4),(S5)#H1),(#H1,(S6,S7))))#H2),(#H2,S10));") # S1A S1B S1C go on leaf 1 -# 3-cycle at degree-2 root -> 2-cycle after root deletion, removed within LiNC -# constraint -net_level1_i, c_species = PhyloNetworks.mapindividuals(net_level1_s, mappingfile) -PhyloNetworks.resetNodeNumbers!(net_level1_i) -net_level1_i.node[22].number = 100 -PhyloNetworks.updateconstraints!(c_species, net_level1_i) -@test c_species[1].taxonnums == Set([8,9,100]) -@test c_species[1].node.number == 21 -@test PhyloNetworks.getparent(net_level1_i.node[22].edge[1]).number == 21 - -obj = PhyloNetworks.StatisticalSubstitutionModel(net_level1_i,fastaindiv,:JC69,:GI,2) -# obj.net = deepcopy of input net, so we need to rebuild the constraints -c_species[1] = PhyloNetworks.TopologyConstraint(0x01, c_species[1].taxonnames, obj.net) -# obj.net = deepcopy of input net, so we need to rebuild the constraints if done after -@test_logs (:warn, r"no 3-cycle") match_mode=:any PhyloNetworks.checknetwork_LiNC!(obj.net, 2, - true, true, c_species, true) -PhyloNetworks.updateSSM!(obj, true; constraints=emptyconstraint) - -#= assign good starting branch lengths: find them outside of tests -for e in obj.net.edge e.length = 0.1; end # was -1.0 for missing -PhyloNetworks.startingBL!(obj.net, obj.trait, obj.siteweight) -PhyloNetworks.unzip_canonical!(obj.net) -print([e.length for e in obj.net.edge]) -=# -startingbl = [0.07817851911808402, 0.16346448006948466, 0.007466318403444228, 0.34338840607739174, 0.17023758685593676, 0.03060241610507292, 0.0, 0.5775895221009606, 0.05156530617279971, 0.33292850647444944, 0.13056644275564092, 0.27314259657043044, 0.07441709795812174, 0.0001, 0.0909334086743112, 0.017615628089233237, 0.13268439288408584, 0.14375488372292924, 0.3199334263745607] -for (i,e) in enumerate(obj.net.edge) - e.length = startingbl[i] -end -PhyloNetworks.setalpha!(obj.ratemodel, 0.48438) -obj.loglik = -Inf # actual likelihood -56.3068141288164. Need something non-missing -seed = 103 -γcache = PhyloNetworks.CacheGammaLiNC(obj) -lcache = PhyloNetworks.CacheLengthLiNC(obj, 1e-2,1e-2,1e-2,1e-2, 5) -@test_nowarn PhyloNetworks.phyLiNCone!(obj, 2, true, true, - 3, 2, false, false, devnull, - seed, 0.5, c_species, 1e-2, 1e-2, - 1e-2, 1e-2, 0.0,50.0, 0.01,.9, γcache, lcache) -@test obj.loglik > -65.4 # -65.0 with RNG from julia 1.5 - -obj = PhyloNetworks.phyLiNC(net_level1_s, # missing BLs, so BLs are re-estimated before starting - fastaindiv, :JC69, :Inv; maxhybrid=2, no3cycle=true, nohybridladder=true, - verbose=false, filename="", speciesfile=mappingfile, seed=138, nruns=1, - maxmoves=10, nreject=2) -@test obj.loglik > -67.7 # -69.83824 with :noRV -@test 0.19 < obj.ratemodel.pinv[1] < 0.3 -# test that species stayed together after optimization, as the only polytomy -function polytomyS1(node) - length(node.edge) > 3 || return false - return Set(n.name for n in PhyloNetworks.getchildren(node)) == Set(["S1A", "S1B", "S1C"]) -end -@test sum(polytomyS1(nod) for nod in obj.net.node) == 1 -end - -# hybrid flip tests -@testset "hybrid flip basics" begin -no3cycle = true -# nohybridladder = true w/ simple 1 hybrid starting network -Random.seed!(123) -# below: net already checked for PhyLiNC, startingBL and unzipped -net = readTopology("((A:0.3399824481995197,(B:0.0)#H1:0.08353360676474617::0.9):0.0001,(C:0.0001,#H1:0.048844990600034506::0.1):0.10871530327558311,D:0.33998306091744424);") -obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastasimple, :JC69) -obj.loglik = -Inf # loglik missing otherwise, which would cause an error below -γcache = PhyloNetworks.CacheGammaLiNC(obj) -lcache = PhyloNetworks.CacheLengthLiNC(obj, 1e-6,1e-6,1e-2,1e-3, 5) -@test PhyloNetworks.fliphybridedgeLiNC!(obj, obj.loglik, true, emptyconstraint, 1e-6, γcache, lcache) -@test obj.loglik ≈ -27.7273003 atol=.0001 -@test !PhyloNetworks.deletehybridedgeLiNC!(obj, obj.loglik, no3cycle, emptyconstraint, γcache, lcache) -@test obj.loglik ≈ -27.7273003 atol=.0001 - -# nohybridladder = false w/ hybrid ladder starting network -Random.seed!(2) -# below: net already checked for PhyLiNC and unzipped -net = readTopology("(#H2:0.02495259889870113::0.0244,((C:1e-4,((B:0.0)#H1:0.0::0.6)#H2:0.034190897863530335::0.9756):0.24434924848805456,(#H1:0.01539513240840275::0.4,A:0.2864250860992079):1.0e-8):1e-4,D:0.2716998373895161);") -obj = PhyloNetworks.StatisticalSubstitutionModel(net, fastasimple, :JC69) -obj.loglik = -Inf # loglik missing otherwise, which would cause an error below -γcache = PhyloNetworks.CacheGammaLiNC(obj); -lcache = PhyloNetworks.CacheLengthLiNC(obj, 1e-6,1e-6,1e-2,1e-3, 5); -@test PhyloNetworks.fliphybridedgeLiNC!(obj, obj.loglik, false, emptyconstraint, 1e-6, γcache, lcache) -@test obj.loglik ≈ -29.05 atol=.1 -previousloglik = obj.loglik -@test PhyloNetworks.deletehybridedgeLiNC!(obj, obj.loglik, no3cycle, emptyconstraint, γcache, lcache) -@test obj.loglik > previousloglik + 0.1 -@test !PhyloNetworks.fliphybridedgeLiNC!(obj, obj.loglik, false, emptyconstraint, 1e-6, γcache, lcache) -end # hybrid flip basics -end # of overall phyLiNC test set diff --git a/test/test_readInputData.jl b/test/test_readInputData.jl deleted file mode 100644 index 167973791..000000000 --- a/test/test_readInputData.jl +++ /dev/null @@ -1,199 +0,0 @@ -## Claudia: commented these tests out because they were not part of runtests.jl -## when I added the test for readNexusTrees. So, I was not sure if they were -## not included for a reason (slow test?) - -## @testset "test: read CF data" begin -## # d=readInputData("1.ms"); #tableCF0.txt -## d = (@test_logs PhyloNetworks.readInputData("1.ms",:all,0,["1","2","3","4","5","6"],false,"none",false,false);) #tableCF0.txt -## d = PhyloNetworks.readInputData("1.ms",:all,0,false); # writes summaryTreesQuartets.txt -## d=readInputData("1.ms",:rand,10); #tableCF3.txt -## d=readInputData("1.ms",[1,2,3,4,5]); #tableCF4.txt - -## d=readInputData("1.ms","allQuartets.txt"); #tableCF1.txt -## d=readInputData("1.ms","allQuartets.txt",:rand,10); #tableCF2.txt -## d=readInputData("1.ms","allQuartets.txt",true,"try4.txt"); #try4.txt - -## descData(d) - - -## d = readTrees2CF("1.ms"); -## d = readTrees2CF("1.ms",filename="try.txt"); -## d = readTrees2CF("1.ms","allQuartets.txt",filename="hola.txt"); -## d = readTrees2CF("1.ms","allQuartets.txt",whichQ=:rand,numQ=10,filename="hola.txt"); - -## d= readTableCF("tableCF.txt"); -## d2= readTableCF("tableCFbad.txt") -## end - - -@testset "test: reading nexus file" begin -# with translate table, hybrids, failed γ in net 2, bad net 3, v2 format in net 4 -nexusfile = joinpath(@__DIR__, "..", "examples", "test_reticulatetreeblock.nex") -# nexusfile = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","test_reticulatetreeblock.nex") -vnet = (@test_logs (:warn, r"^hybrid edge") (:warn,r"^skipped") readnexus_treeblock(nexusfile)); -@test length(vnet) == 3 -@test writeTopology(vnet[1]) == "((tax4,(tax3,#H7:0.001::0.08):0.3):0.6,(tax2,(tax1:0.1)#H7:0.9::0.92):10.0);" -@test writeTopology(vnet[3]) == "((tax1:1.13,((tax2:0.21)#H1:0.89::0.72,(tax3:1.03,(#H1:0.3::0.28,tax4:0.51)S3:0.51)S4:0.08)S5:0.2):0.6,tax5:1.14);" -# example without translate table and without reticulations -nexusfile = joinpath(@__DIR__, "..", "examples", "test.nex") -# nexusfile = joinpath(dirname(pathof(PhyloNetworks)), "..","examples","test.nex") -vnet = readnexus_treeblock(nexusfile, PhyloNetworks.readTopologyUpdate, false, false; reticulate=false); -@test length(vnet) == 10 -@test length(vnet[10].edge) == 9 -@test vnet[10].edge[7].length ≈ 0.00035 -end - -@testset "readMultiTopology" begin - multitreepath = joinpath(@__DIR__, "..", "examples", "multitrees.newick") - # methods that take a file name - multi1 = readMultiTopology(multitreepath, false) # slow but safe - multi2 = readMultiTopology(multitreepath) - @test typeof(multi1) == typeof(multi2) - @test writeTopology.(multi1) == writeTopology.(multi2) - # methods that take newick strings - multitree = readlines(multitreepath) - multi1s = readMultiTopology(multitree, false) - multi2s = readMultiTopology(multitree) - @test writeTopology.(multi1s) == writeTopology.(multi1) - @test writeTopology.(multi1s) == writeTopology.(multi2s) - @test typeof(multi1s) == typeof(multi1) - @test typeof(multi1s) == typeof(multi2s) -end - -@testset "test: calculate quartet CF from input gene trees" begin -sixtreestr = ["(E,((A,B),(C,D)),O);","(((A,B),(C,D)),(E,O));","(A,B,((C,D),(E,O)));", - "(B,((C,D),(E,O)));","((C,D),(A,(B,E)),O);","((C,D),(A,B,E),O);"] -sixtrees = readTopology.(sixtreestr) -df1 = writeTableCF(countquartetsintrees(sixtrees)...) -df2 = writeTableCF(readTrees2CF(sixtrees, writeTab=false, writeSummary=false)) -o = [1,2,4,7,11,3,5,8,12,6,9,13,10,14,15] -@test select!(df1, Not(:qind)) == df2[o,:] -q,t = countquartetsintrees(sixtrees, Dict("A"=>"AB", "B"=>"AB"); showprogressbar=false); -df1 = writeTableCF(q,t) -@test df1[!,:CF12_34] ≈ [0,0,2/3,2/3,1] -@test df1[!,:CF13_24] ≈ [0,0,1/3,1/3,0] -@test df1[!,:CF14_23] ≈ [1.,1,0,0,0] -@test df1[!,:ngenes] ≈ [6.,6,6,6,6] -# again, but weight each allele -q,t = countquartetsintrees(sixtrees, Dict("A"=>"AB", "B"=>"AB"); weight_byallele=true, showprogressbar=false); -df1 = writeTableCF(q,t) -@test df1[!,:CF12_34] ≈ [0,0,7/11,7/11,1] -@test df1[!,:CF13_24] ≈ [0,0,4/11,4/11,0] -@test df1[!,:CF14_23] ≈ [1.,1,0,0,0] -@test df1[!,:ngenes] ≈ [11.,11,11,11,6] -# different averaging: first across each set of 4 alleles, then -# across sets of 4 alleles that map to the same set of 4 species -CSV.write("tmp_qCF.csv", df2) -CSV.write("tmp_map.csv", DataFrame(allele = ["A","B"], species = ["AB","AB"])) -df2_byallele = (@test_logs (:warn, r"not all alleles were mapped") mapAllelesCFtable("tmp_map.csv", "tmp_qCF.csv")) -rm.(["tmp_qCF.csv","tmp_map.csv"]); -q = readTableCF!(df2_byallele); -df2 = writeTableCF(q) # 45×8 DataFrames.DataFrame -# df2[7:11,:] -# df12 = innerjoin(df1, df2, on=[:t1,:t2,:t3,:t4], makeunique=true) -# all([df12[:,4+i] ≈ df12[:,8+i] for i in 1:4]) # false: because averaging done differently by the 2 functions -@test df2 == DataFrame( - t1=["AB","AB","AB","AB","AB","AB","AB","AB","AB","AB","C"], - t2=["AB__2","AB__2","AB__2","AB__2","AB__2","AB__2","C","C","C","D","D"], - t3=["C","C","C","D","D","E","D","D","E","E","E"], - t4=["D","E","O","E","O","O","E","O","O","O","O"], - CF12_34=[1.0,0.75,1.0,0.75,1.0,0.75,0.0,0.0,(3/5+4/6)/2,(3/5+4/6)/2,1.0], - CF13_24=[0,0.25,0,0.25,0,0,0,0,(2/5+2/6)/2,(2/5+2/6)/2,0.0], - CF14_23=[0,0,0,0,0,0.25,1,1,0,0,0], - ngenes=Union{Missing,Float64}[5,4,5,4,5,4,5.5,5.5,5.5,5.5,6] -) -# basic tests for QuartetT type -nCk = PhyloNetworks.nchoose1234(5) -oneQ = PhyloNetworks.QuartetT(1,3,4,6, [.92,.04,.04, 100], nCk) -@test string(oneQ) == "4-taxon set number 8; taxon numbers: 1,3,4,6\ndata: [0.92, 0.04, 0.04, 100.0]" -end - -@testset "convert QuartetT vector to dataframe" begin -SVector = PhyloNetworks.StaticArrays.SVector -MVector = PhyloNetworks.StaticArrays.MVector -MMatrix = PhyloNetworks.StaticArrays.MMatrix -# without taxon names, length-3 vector of boolean data -qlist = [ - PhyloNetworks.QuartetT(1, SVector{4}(1,2,3,4), MVector{3,Bool}(0,1,0)), - PhyloNetworks.QuartetT(2, SVector{4}(1,2,3,5), MVector{3,Bool}(0,0,1)), -] -@test writeTableCF(qlist) == DataFrame(qind=[1,2],t1=[1,1],t2=[2,2],t3=[3,3], - t4=[4,5],CF12_34=[false,false],CF13_24=[true,false],CF14_23=[false,true]) -# with taxon names -@test writeTableCF(qlist, ["a","b","c","d","e"]) == DataFrame( - qind=[1,2],t1=["a","a"],t2=["b","b"],t3=["c","c"],t4=["d","e"], - CF12_34=[false,false],CF13_24=[true,false],CF14_23=[false,true]) -# 3x2 data, Int8-valued -qlist = [PhyloNetworks.QuartetT(1, SVector{4}(1,2,3,4), MMatrix{3,2,Int8}(1:6))] -@test writeTableCF(qlist) == DataFrame(qind=1,t1=1,t2=2,t3=3,t4=4, - CF12_34=Int8[1], CF13_24=Int8[2], CF14_23=Int8[3], - V2_12_34=Int8[4],V2_13_24=Int8[5],V2_14_23=Int8[6]) -# custom column names -@test_logs (:error, r"^'colnames'") writeTableCF(qlist, colnames=["v1","v2"]) -@test writeTableCF(qlist, colnames=["v1","v2","v3","w1","w2","w3"]) == - DataFrame(qind=1,t1=1,t2=2,t3=3,t4=4, v1=Int8[1],v2=Int8[2],v3=Int8[3], - w1=Int8[4],w2=Int8[5],w3=Int8[6]) -end - -if false # was used to time `countquartetsintrees` vs `readTrees2CF` -dir = "/Users/ane/Documents/private/concordance/quartetNetwork/multiind/data" -treefile = joinpath(dir, "raxml_1387_sample_5species4alleles.tre") -tree = readMultiTopology(treefile); # 1387 trees -# extrema([t.numTaxa for t in tree]) # 4-16 taxa in each -@time df1 = writeTableCF(countquartetsintrees(tree)...) -# 0.139761 seconds (900.12 k allocations: 52.000 MiB, 11.52% gc time). 3876×8 DataFrames.DataFrame -@time df2 = writeTableCF(readTrees2CF(tree, writeTab=false, writeSummary=false)) -# 13.154085 seconds (84.86 M allocations: 10.010 GiB, 7.21% gc time). 3876×8 DataFrames.DataFrame -df12 = innerjoin(df1, df2, on=[:t1,:t2,:t3,:t4], makeunique=true) -@test all([df12[:,4+i] == df12[:,8+i] for i in 1:4]) -# using BenchmarkTools -# @benchmark countquartetsintrees(tree) -#= -memory estimate: 49.08 MiB -allocs estimate: 788504 --------------- -minimum time: 110.907 ms (10.89% GC) -median time: 121.782 ms (11.20% GC) -mean time: 125.725 ms (14.00% GC) -maximum time: 227.248 ms (54.16% GC) --------------- -samples: 40 -evals/sample: 1 -=# -# @benchmark readTrees2CF(tree, writeTab=false, writeSummary=false) -#= -BenchmarkTools.Trial: - memory estimate: 10.01 GiB - allocs estimate: 84744840 - -------------- - minimum time: 13.547 s (8.63% GC) - median time: 13.547 s (8.63% GC) - mean time: 13.547 s (8.63% GC) - maximum time: 13.547 s (8.63% GC) - -------------- - samples: 1 - evals/sample: 1 -=# -mappingfile = joinpath(dir, "strain2bin_map.csv") -using CSV -taxonmap = DataFrame(CSV.File(mappingfile); copycols=false) # 110×3 DataFrames.DataFrame -taxonmap = Dict(taxonmap[i,:allele] => taxonmap[i,:species] for i in 1:110) -@time df1 = writeTableCF(countquartetsintrees(tree, taxonmap; weight_byallele=true)...) -# 0.119289 seconds (698.57 k allocations: 43.305 MiB, 17.40% gc time). 5×8 DataFrames.DataFrame -## larger examples: 98 to 110 taxa, 1387 trees -tree = readMultiTopology(joinpath(dir, "raxml_1387.tre")) # 1387 trees, 98-110 taxa in each -@time df1 = writeTableCF(countquartetsintrees(tree)...) -# 1219.94 seconds = 20.3 min (298.45 M allocations: 8.509 GiB, 0.79% gc time). 5773185×8 DataFrames.DataFrame -## mid-size example: to be able to run the slower algorithm and compare times -tree = readMultiTopology(joinpath(dir, "raxml_1387_sample_13species4alleles.tre")); # 1387 trees, 19-40 taxa in each -@time df1 = writeTableCF(countquartetsintrees(tree)...) -# 5.639443 seconds (16.84 M allocations: 568.496 MiB, 7.50% gc time). 292825×8 DataFrame -# ~ 600 times faster -@time df2 = writeTableCF(readTrees2CF(tree, writeTab=false, writeSummary=false)) -# 3365.783672 seconds = 50.1 min (13.43 G allocations: 2.665 TiB, 21.33% gc time). 292825×8 DataFrame -df12 = innerjoin(df1, df2, on=[:t1,:t2,:t3,:t4], makeunique=true) -@test df12[!,8] ≈ df12[!,12] # number of genes -hasdata = map(iszero, df12[!,8]) # sum: 34 four-taxon sets have data for 0 genes -df12[hasdata,5:12] # countquartetsintrees gives 0s, readTrees2CF gives NaN -@test all([df12[.!hasdata,4+i] ≈ df12[.!hasdata,8+i] for i in 1:3]) # true. yeah! -end diff --git a/test/test_traits.jl b/test/test_recursion_matrices.jl similarity index 85% rename from test/test_traits.jl rename to test/test_recursion_matrices.jl index 2899b0809..cd428f9ab 100644 --- a/test/test_traits.jl +++ b/test/test_recursion_matrices.jl @@ -1,13 +1,12 @@ # continuous trait evolution @testset "traits: shared path, vcv, descendence matrix" begin -global tree_str, net, ind tree_str= "(A:0.5,((B:1,#H1:1::0.1):1,(C:1,(D:1)#H1:1::0.9):1):0.5);" -net = readTopology(tree_str) +net = readnewick(tree_str) preorder!(net) ## V matrix -V1 = sharedPathMatrix(net) +V1 = sharedpathmatrix(net) @test_logs show(devnull, V1) ## By hand V matrix @@ -56,7 +55,7 @@ end ## Test names with tree tree_str = "(((t2:0.1491947961,t4:0.3305515735):0.5953111246,t3:0.9685578963):0.1415281736,(t5:0.7093406462,t1:0.1888024569):0.9098094522);" -C = vcv(readTopology(tree_str)) +C = vcv(readnewick(tree_str)) # C_R = R"ape::vcv(ape::read.tree(text = $tree_str))" # names_R = rcopy(R"colnames($C_R)") names_R = ["t2", "t4", "t3", "t5", "t1"] @@ -67,10 +66,10 @@ names_R = ["t2", "t4", "t3", "t5", "t1"] ## Descendence Matrix Test ######################## tree_str= "(A:0.5,((B:1,#H1:1::0.4):1,(C:1,(D:1)#H1:1::0.6):1):0.5);" -net = readTopology(tree_str) +net = readnewick(tree_str) preorder!(net) -T = descendenceMatrix(net) +T = descendencematrix(net) T2 = [1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 @@ -88,18 +87,18 @@ T2 = [1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ## New formula ################# -net = readTopology("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);") +net = readnewick("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);") preorder!(net) -V1 = sharedPathMatrix(net) +V1 = sharedpathmatrix(net) hyb = net.hybrid[2] ## Find child edge hyb_edges = [e.hybrid for e in hyb.edge] child_edge = hyb.edge[.!hyb_edges][1] -child = child_edge.isChild1 ? child_edge.node[1] : child_edge[17].node[2] +child = child_edge.ischild1 ? child_edge.node[1] : child_edge[17].node[2] ## Find number of child edge -nodeNumbersTopOrder = [n.number for n in net.nodes_changed] +nodeNumbersTopOrder = [n.number for n in net.vec_node] p = indexin([child.number], nodeNumbersTopOrder) ## Find parents edges and node numbers par_edge_1 = hyb.edge[hyb_edges][1] @@ -115,16 +114,16 @@ gam = par_edge_1.gamma ## Two extreme networks par_edge_1.gamma = 1. par_edge_2.gamma = 0. -V_t_1 = sharedPathMatrix(net) +V_t_1 = sharedpathmatrix(net) par_edge_1.gamma = 0. par_edge_2.gamma = 1. -V_t_2 = sharedPathMatrix(net) +V_t_2 = sharedpathmatrix(net) ## Descendant indicatrice matrix des = PhyloNetworks.descendants(par_edge_1, true) # true to get internal nodes also mask = indexin(des, V_t_1.nodeNumbersTopOrder) -D = zeros(net.numNodes, net.numNodes) +D = zeros(net.numnodes, net.numnodes) D[mask, mask] .= 1.0 ## Formula diff --git a/test/test_relaxed_reading.jl b/test/test_relaxed_reading.jl index 3890a32f9..686847a72 100644 --- a/test/test_relaxed_reading.jl +++ b/test/test_relaxed_reading.jl @@ -1,76 +1,82 @@ @testset "test: newick parsing" begin global net -@testset "readTopology: spaces and comments" begin +@testset "readnewick: spaces and comments" begin global n1, n2, n3 - #Test newlines, spaces, tabs, and carriage returns - n1 = readTopology("(A,((B,#H1),(C,(D)#H1)));") - n2 = readTopology("(A\n,\t (\n\r (B , #H1 ),( C ,(D )#H1 ) \n\n\n\n\n) );") - @test writeTopology(n1) == writeTopology(n2) + #Test newlines, spaces, tabs, and carriage returns + n1 = readnewick("(A,((B,#H1),(C,(D)#H1)));") + n2 = readnewick("(A\n,\t (\n\r (B , #H1 ),( C ,(D )#H1 ) \n\n\n\n\n) );") + @test writenewick(n1) == writenewick(n2) - #Test spaces in troublesome locations - n3 = readTopology("( A, ( ( B , #H 1 ) ,( C , ( D )#H1 ) ) ) ;") - @test writeTopology(n1) == writeTopology(n3) + #Test spaces in troublesome locations + n3 = readnewick("( A, ( ( B , #H 1 ) ,( C , ( D )#H1 ) ) ) ;") + @test writenewick(n1) == writenewick(n3) - #Test spaces in names - resultant = readTopology("('Homo sapiens', ((B,#H1),(C,(D)#H1)));") - expected = readTopology("('Homosapiens',((B,#H1),(C,(D)#H1)));") - @test writeTopology(resultant) == writeTopology(expected) + #Test spaces in names + resultant = readnewick("('Homo sapiens', ((B,#H1),(C,(D)#H1)));") + expected = readnewick("('Homosapiens',((B,#H1),(C,(D)#H1)));") + @test writenewick(resultant) == writenewick(expected) - #Test other white symbols in names - resultant = readTopology("('H\tom\ro\nsa p \n\n\n\n\n\n\n\ni\t\t\t\t\t\t\t\ten s ', ((B,#H1),(C,(D)#H1)));") - expected = readTopology("('Homosapiens',((B,#H1),(C,(D)#H1)));") - @test writeTopology(resultant) == writeTopology(expected) + #Test other white symbols in names + resultant = readnewick("('H\tom\ro\nsa p \n\n\n\n\n\n\n\ni\t\t\t\t\t\t\t\ten s ', ((B,#H1),(C,(D)#H1)));") + expected = readnewick("('Homosapiens',((B,#H1),(C,(D)#H1)));") + @test writenewick(resultant) == writenewick(expected) # nexus-style comments and negative edge or gamma values - n1 = (@test_logs (:error, r"expecting non-negative value") (:error, r"expecting non-negative value") readTopology("(E,((B)#H1[&com:1],((D:-1[&theta=2][&prob=0.3],C:[&length:4]1.2[&com 5])[&internalname=G],(#H1:::-0.1,A))))[&com=6];")) - @test writeTopology(n1) == "(E,((B)#H1:::1.0,((D:0.0,C:1.2),(#H1:::0.0,A))));" + n1 = (@test_logs (:error, r"expecting non-negative value") (:error, r"expecting non-negative value") readnewick("(E,((B)#H1[&com:1],((D:-1[&theta=2][&prob=0.3],C:[&length:4]1.2[&com 5])[&internalname=G],(#H1:::-0.1,A))))[&com=6];")) + @test writenewick(n1) == "(E,((B)#H1:::1.0,((D:0.0,C:1.2),(#H1:::0.0,A))));" # edge cases that should error - @test_throws Exception readTopology("(E,((B)#3,((D,C),(#3,A))));") # name not starting with letter - @test_logs (:warn,r"^Expected H") (:warn,r"^Expected H") readTopology("(E,((B)#P1,((D,C),(#P1,A))));") + @test_throws Exception readnewick("(E,((B)#3,((D,C),(#3,A))));") # name not starting with letter + @test_logs (:warn,r"^Expected H") (:warn,r"^Expected H") readnewick("(E,((B)#P1,((D,C),(#P1,A))));") @test_logs (:warn,r"received h") ( - @test_throws Exception readTopology("(E,((B)#H#h,((D,C),(#H#h,A))));") # 2 # sign in the name + @test_throws Exception readnewick("(E,((B)#H#h,((D,C),(#H#h,A))));") # 2 # sign in the name ) - @test_throws Exception readTopology("(E,((B)#H1,((D,C),((F)#H1,A))));") # both H1 internal - @test_throws Exception readTopology("(E,((B)#H1") # doesn't end with ; - @test_throws Exception readTopology(IOBuffer("E;")) # Expected beginning of tree with ( + @test_throws Exception readnewick("(E,((B)#H1,((D,C),((F)#H1,A))));") # both H1 internal + @test_throws Exception readnewick("(E,((B)#H1") # doesn't end with ; + @test_throws Exception readnewick(IOBuffer("E;")) # Expected beginning of tree with ( end -@testset "isMajor and gamma consistency" begin - net = readTopology("((((B)#H1)#H2,((D,C,#H2:::0.8),(#H1,A))));"); - @test writeTopology(net, round=true, digits=8) == "(#H2:::0.2,((D,C,((B)#H1)#H2:::0.8),(#H1,A)));" - net = readTopologyLevel1("(E,((B)#H1:::.5,((D,C),(#H1:::.5,A))));"); - @test writeTopology(net) == "(D:1.0,C:1.0,((#H1:1.0::0.5,A:1.0):1.0,((B:1.0)#H1:1.0::0.5,E:1.0):1.0):1.0);" - originalstdout = stdout - redirect_stdout(devnull) # requires julia v1.6 - @test_logs PhyloNetworks.printEverything(net) - redirect_stdout(originalstdout) +@testset "ismajor & gamma consistency, and miscellaneous" begin + net = readnewick("((((B)#H1)#H2,((D,C,#H2:::0.8),(#H1,A))));"); + @test writenewick(net, round=true, digits=8) == "(#H2:::0.2,((D,C,((B)#H1)#H2:::0.8),(#H1,A)));" + net = readnewick("(E,((B)#H1:::.5,((D,C),(#H1:::.5,A))));"); + @test writenewick(net) == "(E,((B)#H1:::0.5,((D,C),(#H1:::0.5,A))));" + @test !PhyloNetworks.shrinkedge!(net,net.edge[6]) # parent to (D,C) + @test_throws "at a hybrid" PhyloNetworks.resolvetreepolytomy!(net, net.node[3]) + PhyloNetworks.resolvetreepolytomy!(net, net.node[8]) + @test net.node[11].number == 7 # new node + @test length(net.edge) == 11 + @test net.edge[11].number == 6 # new edge, recycled old unused number + @test net.edge[11].length == 0 # from old node -5 towards new node 7 + @test (getparent(net.edge[11]).number,getchild(net.edge[11]).number)==(-5,7) + @test (getparent(net.edge[4]).number, getchild(net.edge[4]).number) == (7,4) + @test (getparent(net.edge[5]).number, getchild(net.edge[5]).number) == (7,5) end @testset "internal nodes, writemulti" begin - @test writeTopology(readTopology("(a,b):0.5;")) == "(a,b);" - @test writeTopology(readTopology("((a,(b)#H1)i1,(#H1,c))r;")) == "((a,(b)#H1)i1,(#H1,c))r;" - @test writeTopology(readTopology("((a,(b)#H1)i1,(#H1,c))r;"), internallabel=false) == "((a,(b)#H1),(#H1,c));" - n11 = (@test_logs readTopology("((a,(b)#H1)i1,(#H1,c)i2)root:0.5;")); - n12 = (@test_logs readTopology("(((a,(b)#H2)i1,(#H2,c)i2)root:0.5);")); # root edge was deleted - # writeTopology(net) == "((a,(b)#H1)i1,(#H1,c)i2);" - # readTopology("((((a,(b)#H1)i1,(#H1,c)i2)root:0.5));"); still has 1 (of the 2) root edges - # writeMultiTopology([n1,n2], stdout) - n11.root = 2 # below the hybrid node: will trigger RootMismatch and message below - originalstdout = stdout - redirect_stdout(devnull) - writeMultiTopology([n11,n12], "test_relaxedreading.net") - rm("test_relaxedreading.net") - redirect_stdout(originalstdout) + @test writenewick(readnewick("(a,b):0.5;")) == "(a,b);" + @test writenewick(readnewick("((a,(b)#H1)i1,(#H1,c))r;")) == "((a,(b)#H1)i1,(#H1,c))r;" + @test writenewick(readnewick("((a,(b)#H1)i1,(#H1,c))r;"), internallabel=false) == "((a,(b)#H1),(#H1,c));" + n11 = (@test_logs readnewick("((a,(b)#H1)i1,(#H1,c)i2)root:0.5;")); + n12 = (@test_logs readnewick("(((a,(b)#H2)i1,(#H2,c)i2)root:0.5);")); # root edge was deleted + # writenewick(net) == "((a,(b)#H1)i1,(#H1,c)i2);" + # readnewick("((((a,(b)#H1)i1,(#H1,c)i2)root:0.5));"); still has 1 (of the 2) root edges + # writemultinewick([n1,n2], stdout) + n11.rooti = 2 # below the hybrid node: will trigger RootMismatch and message below + originalstdout = stdout + redirect_stdout(devnull) + writemultinewick([n11,n12], "test_relaxedreading.net") + rm("test_relaxedreading.net") + redirect_stdout(originalstdout) end @testset "write for hybrid-lambda" begin - net = readTopology("((a:1,(bH:1)#H1:1::0.8)H2:5,(#H1:0::0.2,c:1):1);"); + net = readnewick("((a:1,(bH:1)#H1:1::0.8)H2:5,(#H1:0::0.2,c:1):1);"); @test hybridlambdaformat(net) == "((a:1.0,(bH:1.0)H1#0.8:1.0)I1:5.0,(H1#0.8:0.0,c:1.0)I2:1.0)I3;" - net = readTopology("((#H1:::0.2,c),(I3,(b)#H1:::0.8):5);") + net = readnewick("((#H1:::0.2,c),(I3,(b)#H1:::0.8):5);") @test hybridlambdaformat(net) == "((H1#0.2,c)I4,(I3,(b)H1#0.2)I5:5.0)I6;" - net = readTopology("((((B)#H1:::0.7,D)100:4,(#H1:::0.3,E)98:6.2):2,O);") # bootstrap values + net = readnewick("((((B)#H1:::0.7,D)100:4,(#H1:::0.3,E)98:6.2):2,O);") # bootstrap values @test hybridlambdaformat(net) == "((((B)H1#0.7,D)I1:4.0,(H1#0.7,E)I2:6.2)I3:2.0,O)I4;" - net = readTopology("((((D)#H1:::0.7,D)1:4,(#H1:::0.3,E)1:6.2):2,O);") # 2 tips named D + net = readnewick("((((D)#H1:::0.7,D)1:4,(#H1:::0.3,E)1:6.2):2,O);") # 2 tips named D @test_throws Exception hybridlambdaformat(net) - net = readTopology("((((B)#H1,D)1:4,(#H1,E)1:6.2):2,O);") # missing gamma + net = readnewick("((((B)#H1,D)1:4,(#H1,E)1:6.2):2,O);") # missing gamma @test_logs (:error, r"^edge.*0.5$") (@test hybridlambdaformat(net) == "((((B)H1#0.5,D)I1:4.0,(H1#0.5,E)I2:6.2)I3:2.0,O)I4;") end end diff --git a/test/test_simulate.jl b/test/test_simulate.jl deleted file mode 100644 index 5199971fc..000000000 --- a/test/test_simulate.jl +++ /dev/null @@ -1,154 +0,0 @@ -# Tests to simulate traits - -## Get a network and make it ultrametric -net = readTopology("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); - -@testset "Simulate function against fixed values" begin - -## Simulate a BM -Random.seed!(17920921); # fix the seed -pars = ParamsBM(1, 0.1); # params of a BM -@test_logs show(devnull, pars) - -sim = simulate(net, pars); # simulate according to a BM -@test_logs show(devnull, sim) -@test_throws ErrorException sim[:Tips, :Broken] - -# Extract simulated values -traitsTips = sim[:Tips] -traitsNodes = sim[:InternalNodes] -# values simulated under julia v1.6.4 -#traitsTipsExp = [0.6455995230091043,-0.22588106270381064,0.05703904710270408,-0.692650796714688,1.578622599565194,1.4106438068675058,1.9166557600811194,1.0579005662214953,1.2340762902144904,1.4130757789427886,0.7115737497673081,2.201943319276716]; -#traitsNodesExp = [-0.3481603206484607,-0.6698437934551933,-0.018135478212541654,-0.33844527112230455,-0.0717742134084467,0.19417331380691694,1.3919535151447147,1.5106942025265466,1.2526948727806593,1.1552248152172964,1.224823113083187,1.0617270280846993,1.0436547766241817,1.0]; -@test length(traitsTips) == 12 -@test length(traitsNodes) == 14 -@test traitsNodes[end] == 1.0 # ancestral state -@test 0 < sum(traitsNodes)/14 < 2 -@test 0 < sum(traitsTips)/14 < 2 - -end - -############################################################################### -## Test of distibution -############################################################################### -@testset "Simulate test distribution" begin - -## Generate some values -Random.seed!(18480224); # fix the seed -pars = ParamsBM(1, 0.1); # params of a BM -N = 50000 -S = length(tipLabels(net)); -values = zeros(Float64, (S, N)); -for i = 1:N - values[:,i] = simulate(net, pars)[:Tips] -end - -## Check that each tip has same mean (1) -for s in 1:S - @test mean(values[s, :]) ≈ pars.mu atol=0.01 -end - -## Check for variances -V = sharedPathMatrix(net); -Sig = V[:Tips] * pars.sigma2; -for s in 1:S - for t in s:S - @test cov(values[s, :], values[t, :]) ≈ Sig[s, t] atol=0.01 - end -end - -end -############################################################################### -## With Shifts -############################################################################### -@testset "Simulate with Shifts" begin -global net -net = readTopology("(A:2.5,((B:1,#H1:0.5::0.4):1,(C:1,(D:0.5)#H1:0.5::0.6):1):0.5);") - -## Test construction function -@test_throws ErrorException ShiftNet(net.edge[7], 3.0, net) # can't put a shift on hybrid branch -@test_throws ErrorException ShiftNet(net.node[6], 3.0, net) # can't put a shift on hybrid branch -@test ShiftNet(net).shift ≈ zeros(length(net.node)) -@test ShiftNet(net.edge[8], 3.0, net).shift ≈ ShiftNet([net.edge[8]], [3.0], net).shift -@test ShiftNet(net.edge[8], 3.0, net).shift ≈ ShiftNet(net.node[7], 3.0, net).shift -@test ShiftNet(net.node[7], 3.0, net).shift ≈ ShiftNet([net.node[7]], [3.0], net).shift - -## Concatenate function -sh1 = ShiftNet(net.node[7], 3.0, net)*ShiftNet(net.node[9], -2.1, net) -@test sh1.shift ≈ ShiftNet([net.node[7], net.node[9]], [3.0, -2.1], net).shift -@test_throws ErrorException sh1*ShiftNet(net.edge[7], 2.0, net) # can't concatenate if the two affect the same edges -@test sh1.shift ≈ (sh1*ShiftNet([net.node[7]], [3.0], net)).shift - -## Values and edge numbers functions -sh = ShiftNet(net.node[7], 3.0, net) -@test getShiftEdgeNumber(sh) == [8] -@test all(getShiftValue(sh) .== [3.0]) - -## Hybrid shifts -@test shiftHybrid([2.0], net).shift ≈ ShiftNet(net.edge[6], 2.0, net).shift -@test shiftHybrid(2.0, net).shift ≈ shiftHybrid([2.0], net).shift - -## Test simulate - -# No shift on root -@test_throws ErrorException simulate(net, ParamsBM(1.0, 0.1, ShiftNet(net.node[9], 3.0, net))) - -@test ParamsBM(1.0, 1.0, net).shift.shift ≈ ParamsBM(1.0, 1.0, ShiftNet(net)).shift.shift - -pars = ParamsBM(1, 0.1, ShiftNet(net.edge[8], 3.0, net)); # params of a BM -@test_logs show(devnull, pars) -@test_logs show(devnull, pars.shift) - -Random.seed!(17920921); # fix the seed -sim = simulate(net, pars); # simulate according to a BM -@test_logs show(devnull, sim) - -traitsTips = sim[:Tips]; -traitsNodes = sim[:InternalNodes]; -meansTips = sim[:Tips, :Exp]; -meansNodes = sim[:InternalNodes, :Exp]; -@test meansTips == [1.,1.,1.0+3,1.0+3.0*0.6] -@test meansNodes == [1., 1.0+3.0*0.6, 1.0+3, 1., 1.] -@test length(traitsTips) == 4 -@test length(traitsNodes) == 5 -@test traitsNodes[end] == 1.0 # ancestral state -@test all(-1.0 .< traitsNodes-meansNodes .< 1.0) -@test all(-1.0 .< traitsTips-meansTips .< 1.0) - -# Test same as MultiBM -pars = ParamsMultiBM([1.0], 0.1*ones(1,1), ShiftNet(net.edge[8], 3.0, net)); -simMulti = simulate(net, pars); -@test simMulti[:Tips, :Exp] ≈ sim[:Tips, :Exp]' -@test simMulti[:InternalNodes, :Exp] ≈ sim[:InternalNodes, :Exp]' - -############################################################################### -## Test of distibution - with shifts -############################################################################### - -## Generate some values -Random.seed!(18480224); # fix the seed -@test_throws ErrorException ParamsBM(1, 0.1, ShiftNet(net.edge[8], [3.0, 1.0], net)) -pars = ParamsBM(1, 0.1, ShiftNet(net.edge[8], 3.0, net)); # params of a BM -N = 50000 -S = length(tipLabels(net)); -values = zeros(Float64, (S, N)); -for i = 1:N - values[:,i] = simulate(net, pars)[:Tips] -end - -## Check that each tip has same mean (1) -expectations = simulate(net, pars)[:Tips,:Exp] -for s in 1:S - @test mean(values[s, :]) ≈ expectations[s] atol=1e-2 -end - -## Check for variances -V = sharedPathMatrix(net); -Sig = V[:Tips] * pars.sigma2; -for s in 1:S - for t in s:S - @test cov(values[s, :], values[t,:]) ≈ Sig[s, t] atol=1e-2 - end -end - -end diff --git a/test/test_simulate_mbd.jl b/test/test_simulate_mbd.jl deleted file mode 100644 index 730e4f7ef..000000000 --- a/test/test_simulate_mbd.jl +++ /dev/null @@ -1,207 +0,0 @@ -# Tests to simulate multivariate traits - -## Get an ultrametric network ('net' already in global scope) -net = readTopology("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); - -@testset "Simulate data and check means and dimensions" begin - -# one single trait -pars = ParamsMultiBM([5.0], ones(1,1)) -sim = simulate(net, pars) -@test sim[:Tips, :Exp] == [5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0] - -trait_dim = 3 - -## Simulate a MBD -Random.seed!(17920921); # fix the seed - -μ = randn(trait_dim) -Σ = randn(trait_dim, trait_dim) -Σ = Σ * Σ' # needs to be positive definite - -@test_throws ErrorException ParamsMultiBM(μ[1:2], Σ) - -pars = ParamsMultiBM(μ, Σ); # params of a MBD -@test_logs show(devnull, pars) - -sim = simulate(net, pars); # simulate according to a BM -@test_logs show(devnull, sim) -@test_throws ErrorException sim[:Tips, :Broken] - -# Extract simulated values -traitsTips = sim[:Tips]; -traitsNodes = sim[:InternalNodes]; - -# Check dimensions -@test size(traitsTips) == (trait_dim, net.numTaxa) -@test size(traitsNodes) == (trait_dim, net.numNodes - net.numTaxa) - -# Check means (no shifts) -@test sim[:All, :Exp] ≈ μ * ones(net.numNodes)' - -end - -############################################################################### -## Test of distibution (fixed root) -############################################################################### -@testset "Simulate test distribution (fixed root)" begin -trait_dim = 3 - -## Generate some values -Random.seed!(18480224); # fix the seed -μ = randn(trait_dim) -Σ = randn(trait_dim, trait_dim) -Σ = Σ * Σ' # needs to be positive definite -pars = ParamsMultiBM(μ, Σ); # params of a MBD - -N = 10000 -S = length(tipLabels(net)); -μ_sim = zeros(trait_dim, S) -Σ_sim = zeros(trait_dim * S, trait_dim * S) -for i = 1:N - tips = simulate(net, pars)[:Tips] - μ_sim .+= tips - v_sim = vec(tips) - Σ_sim .+= v_sim * v_sim' -end -μ_sim ./= N -Σ_sim ./= N -Σ_sim = Σ_sim - vec(μ_sim) * vec(μ_sim)' - -## Check means -μ_true = μ * ones(S)' -@test isapprox(μ_sim, μ_true, atol=0.3) - -## Check covariance -Ψ = Matrix(vcv(net)) -Σ_true = kron(Ψ, Σ) # 36x36 matrix -@test isapprox(Σ_sim, Σ_true, atol=0.5, norm= x -> maximum(abs.(x))) - -end - -############################################################################### -## Test of distibution (random root) -############################################################################### -@testset "Simulate test distribution (random root)" begin -trait_dim = 3 - -## Generate some values -Random.seed!(24452384); # fix the seed -μ = randn(trait_dim) -Σ = randn(trait_dim, trait_dim) -Σ = Σ * Σ' # needs to be positive definite -pars = ParamsMultiBM(μ, Σ); # params of a MBD - -Σ_root = randn(trait_dim, trait_dim) -Σ_root = Σ_root * Σ_root' / 10.0 # needs to be positive definite (and not too big to reduce variance in test) -pars.varRoot = Σ_root -pars.randomRoot = true - -@test_logs show(devnull, pars) -show(devnull, pars) - -N = 10000 -S = length(tipLabels(net)); -μ_sim = zeros(trait_dim, S) -Σ_sim = zeros(trait_dim * S, trait_dim * S) -for i = 1:N - tips = simulate(net, pars)[:Tips] - μ_sim .+= tips - v_sim = vec(tips) - Σ_sim .+= v_sim * v_sim' -end -μ_sim ./= N -Σ_sim ./= N -Σ_sim = Σ_sim - vec(μ_sim) * vec(μ_sim)' - -## Check means -@test isapprox(μ_sim, μ * ones(S)', atol=0.2) - -## Check covariance -Ψ = Matrix(vcv(net)) -Σ_true = kron(Ψ, Σ) + kron(ones(S, S), pars.varRoot) -@test isapprox(Σ_sim, Σ_true, atol=3.6) # norm L2 of 36x36 matrix - -end - - -################################################################################ -## With shifts -################################################################################ - -net = readTopology("(A:2.5,((B:1,#H1:0.5::0.4):1,(C:1,(D:0.5)#H1:0.5::0.6):1):0.5);") - -@testset "Simulate with Shifts" begin -trait_dim = 3 - -Random.seed!(275698234545); # fix the seed - -## Test construction function -@test_throws ErrorException ShiftNet(net.edge[7], [1.0, 2.0], net) # can't put a shift on hybrid branch -@test_throws ErrorException ShiftNet(net.node[6], [1.0, 2.0], net) # can't put a shift on hybrid branch -@test_throws ErrorException ShiftNet([net.node[7], net.node[6]], [1.0 2.0], net) # dimensions don't match -@test ShiftNet(net.edge[8], [1.0, 2.0], net).shift ≈ ShiftNet([net.edge[8]], [1.0 2.0], net).shift -@test ShiftNet(net.edge[8], [1.0, 2.0], net).shift ≈ ShiftNet(net.node[7], [1.0, 2.0], net).shift -@test ShiftNet(net.node[7], [1.0, 2.0], net).shift ≈ ShiftNet([net.node[7]], [1.0 2.0], net).shift - -## Concatenate function -sh1 = ShiftNet(net.node[7], [1.0, 2.0], net)*ShiftNet(net.node[9], [3.0, -1.5], net) -@test_logs show(devnull, sh1) -@test sh1.shift ≈ ShiftNet([net.node[7], net.node[9]], [1.0 2.0; 3.0 -1.5], net).shift -@test_throws ErrorException sh1*ShiftNet(net.edge[7], [4.0, 3.5], net) # can't concatenate if the two affect the same edges -@test sh1.shift ≈ (sh1*ShiftNet([net.node[7]], [1.0 2.0], net)).shift -@test_throws ErrorException sh1*ShiftNet(net.edge[8], [4.0, 3.5, 5.0], net) # can't concatenate if the two affect the same edges - -## Values and edge numbers functions -@test getShiftEdgeNumber(sh1) == [-1, 8] -@test getShiftValue(sh1) == [3.0 -1.5; 1.0 2.0] - -## Hybrid shifts -@test shiftHybrid([4.5 2.0], net).shift ≈ ShiftNet(net.edge[6], [4.5, 2.0], net).shift -@test_throws ErrorException shiftHybrid([4.5 2.0; 3.0 5.0], net) # dimension mismatch - -## Distributions -μ = randn(trait_dim) -Σ = randn(trait_dim, trait_dim) -Σ = Σ * Σ' # needs to be positive definite - -@test ParamsMultiBM(μ, Σ, net).shift.shift ≈ ParamsMultiBM(μ, Σ, ShiftNet(net, trait_dim)).shift.shift -@test_throws ErrorException ParamsMultiBM(μ, Σ, ShiftNet(net, 1)) - -# Shift at root causes an error. -sh = ShiftNet(net.node[7], [1.0, 2.0, -1.0], net)*ShiftNet(net.node[9], [3.0, -1.5, 4.2], net) -pars = ParamsMultiBM(μ, Σ, sh) -@test_throws ErrorException simulate(net, pars) - -# One shift, not at the root -sh = ShiftNet(net.node[7], [1.0, 2.0, -1.0], net) -pars = ParamsMultiBM(μ, Σ, sh) - -@test_logs show(devnull, pars) -show(devnull, pars) - -N = 10000 -S = length(tipLabels(net)); -μ_sim = zeros(trait_dim, S) -Σ_sim = zeros(trait_dim * S, trait_dim * S) -for i = 1:N - tips = simulate(net, pars)[:Tips] - μ_sim .+= tips - v_sim = vec(tips) - Σ_sim .+= v_sim * v_sim' -end -μ_sim ./= N -Σ_sim ./= N -Σ_sim = Σ_sim - vec(μ_sim) * vec(μ_sim)' - -## Check means -sim = simulate(net, pars) -μ_true = sim[:Tips, :Exp] -@test μ_true ≈ μ .+ [0 0 1 0.6; 0 0 2 1.2; 0 0 -1 -.6] # from shift on edge 8 only -@test isapprox(μ_sim, μ_true, atol=0.2) - -## Check covariance -Ψ = Matrix(vcv(net)) -Σ_true = kron(Ψ, Σ) -@test isapprox(Σ_sim, Σ_true, norm = x -> maximum(abs.(x)), atol=0.5) # 12x12 matrix -end diff --git a/test/test_traitLikDiscrete.jl b/test/test_traitLikDiscrete.jl deleted file mode 100644 index 5c4cd0672..000000000 --- a/test/test_traitLikDiscrete.jl +++ /dev/null @@ -1,753 +0,0 @@ -runall = false; -@testset "Testing traitLikDiscrete" begin -global net, n1, n2, d -@testset "Testing Substitution Models, P and Q matrices" begin - -m1 = BinaryTraitSubstitutionModel(1.0, 2.0); -@test_logs show(devnull, m1) -m1 = BinaryTraitSubstitutionModel(1.0,2.0, ["carnivory", "non-carnivory"]); -@test nstates(m1)==2 -@test PhyloNetworks.nparams(m1)==2 -@test_logs show(devnull, m1) -@test_throws ErrorException PhyloNetworks.BinaryTraitSubstitutionModel(-1.0,2.0) -m2 = EqualRatesSubstitutionModel(4, 3.0); -@test nstates(m2)==4 -@test PhyloNetworks.nparams(m2)==1 -m2 = EqualRatesSubstitutionModel(4, 3.0, ["S1","S2","S3","S4"]); -@test_logs show(devnull, m2) -@test_throws AssertionError PhyloNetworks.EqualRatesSubstitutionModel(2, 0.001, ["abs"]); -@test_throws AssertionError PhyloNetworks.EqualRatesSubstitutionModel(1, 0.001, ["abs"]); -m3 = TwoBinaryTraitSubstitutionModel([2.0,1.2,1.1,2.2,1.0,3.1,2.0,1.1], -["carnivory", "noncarnivory", "wet", "dry"]); -@test_logs show(devnull, m3) -@test nstates(m3)==4 -@test PhyloNetworks.nparams(m3)==8 - -@test Q(m1) == SMatrix{2,2}(-1.0, 2.0, 1.0, -2.0) -@test Q(m2) == SMatrix{4,4}(-9.0, 3, 3, 3, 3, -9, 3, 3, 3, 3, -9, 3, 3, 3, 3, -9) -@test Q(m3) ≈ SMatrix{4,4}(-3.0, 3.1, 1.2, 0.0, 1.0, -4.2, 0.0, 2.2, 2.0, 0.0, -3.2, 1.1, 0.0, 1.1, 2.0, -3.3) atol=1e-4 -@test P(m1, 0.5) ≈ SMatrix{2,2}(0.7410433867161432,0.5179132265677134,0.2589566132838567,0.4820867734322865) atol=1e-15 -@test P(m2, 0.1) ≈ SMatrix{4,4}(0.4758956589341516,0.17470144702194956,0.17470144702194962,0.17470144702194945,0.17470144702194956,0.47589565893415153,0.17470144702194967,0.17470144702194945,0.17470144702194962,0.17470144702194967,0.4758956589341516,0.17470144702194945,0.17470144702194945,0.17470144702194945,0.17470144702194945,0.4758956589341518) atol=1e-15 -@test P(m3, 0.5) ≈ SMatrix{4,4}(0.39839916380463375,0.36847565707393248,0.23055614536582461,0.22576141081414305,0.1545971371424259,0.25768553619230444,0.14816051303688715,0.24300762748855972,0.29194735222005136,0.20198250750421617,0.35349416558860958,0.20267178083856716,0.15505634683288913,0.17185629922954704,0.26778917600867863,0.32855918085873009) atol=1e-15 -#@test P(m3, 0.5) ≈ [0.22313 1.64872 2.71828 1.0; 4.71147 0.122456 1.0 1.73325; 1.82212 1.0 0.201897 2.71828; 1.0 3.00417 1.73325 0.19205] atol=1e-4 -#@test P(m1, [0.02,0.01]) ≈ Array{Float64,2}[[0.980588 0.0194118; 0.0388236 0.961176], [0.990149 0.00985149; 0.019703 0.980297]] atol=1e-6 -#@test P(m2, [0.02,0.01]) ≈ Array{Float64,2}[[0.839971 0.053343 0.053343 0.053343; 0.053343 0.839971 0.053343 0.053343; 0.053343 0.053343 0.839971 0.053343; 0.053343 0.053343 0.053343 0.839971], [0.91519 0.0282699 0.0282699 0.0282699; 0.0282699 0.91519 0.0282699 0.0282699; 0.0282699 0.0282699 0.91519 0.0282699; 0.0282699 0.0282699 0.0282699 0.91519]] atol=1e-6 - -end - -@testset "types of RVAS" begin -# no rate variation -rv = RateVariationAcrossSites() -@test nparams(rv) == 0 -@test_logs show(devnull, rv) -@test rv.ratemultiplier == [1.0] -# +G model -rv = RateVariationAcrossSites(alpha=1.0, ncat=4) -@test nparams(rv) == 1 -@test_logs show(devnull, rv) -@test rv.ratemultiplier ≈ [0.146, 0.513, 1.071, 2.27] atol=.002 -PhyloNetworks.setalpha!(rv, 2.0) -@test rv.ratemultiplier ≈ [0.319, 0.683, 1.109, 1.889] atol=.002 -@test all(rv.lograteweight .≈ -1.3862943611198906) -@test_logs PhyloNetworks.setparameters!(rv, [10.]) -@test PhyloNetworks.getparameters(rv) == [10] -@test PhyloNetworks.getparamindex(rv) == [2] -# +I model -rv = RateVariationAcrossSites(pinv=0.3) -@test nparams(rv) == 1 -@test_logs show(devnull, rv) -@test rv.ratemultiplier ≈ [0, 1.429] atol=.002 -@test rv.lograteweight ≈ [-1.2039728043259361,-0.35667494393873245] -PhyloNetworks.setpinv!(rv, 0.05) -@test rv.ratemultiplier ≈ [0, 1.053] atol=.002 -@test rv.lograteweight ≈ [-2.995732273553991,-0.05129329438755058] -@test_logs PhyloNetworks.setparameters!(rv, [0.1]) -@test PhyloNetworks.getparameters(rv) == [0.1] -@test PhyloNetworks.getparamindex(rv) == [1] -# +G+I model -rv = RateVariationAcrossSites(pinv=0.3, alpha=2.0, ncat=4) -@test nparams(rv) == 2 -@test_logs show(devnull, rv) -@test rv.ratemultiplier ≈ [0.0, 0.456, 0.976, 1.584, 2.698] atol=.002 -@test rv.lograteweight ≈ [-1.204, -1.743, -1.743, -1.743, -1.743] atol=.002 -PhyloNetworks.setalpha!(rv, 3.0) -@test rv.ratemultiplier ≈ [0.0, 0.6, 1.077, 1.584, 2.454] atol=.002 -PhyloNetworks.setpinv!(rv, 0.05) -@test rv.ratemultiplier ≈ [0.0, 0.442, 0.793, 1.167, 1.808] atol=.002 -@test rv.lograteweight ≈ [-2.996, -1.438, -1.438, -1.438, -1.438] atol=.002 -@test_logs PhyloNetworks.setparameters!(rv, [0.1,2.0]) -@test PhyloNetworks.getparameters(rv) == [0.1,2.0] -@test PhyloNetworks.getparamindex(rv) == [1,2] -# test for errors -@test_throws AssertionError PhyloNetworks.setalpha!(rv, -0.05) -@test_throws AssertionError PhyloNetworks.setpinv!(rv, -0.05) -@test_throws ErrorException RateVariationAcrossSites(ncat=4) -@test_throws AssertionError RateVariationAcrossSites(alpha=-2.0, ncat=4) -@test_throws AssertionError RateVariationAcrossSites(pinv=1.5) -@test_throws AssertionError RateVariationAcrossSites(pinv=-0.01) -@test_throws AssertionError RateVariationAcrossSites(pinv=0.5, alpha=-2., ncat=2) -@test_throws AssertionError RateVariationAcrossSites(pinv=-0.1, alpha=2., ncat=2) -# default object from symbol -@test typeof(RateVariationAcrossSites(:noRV)) == PhyloNetworks.RVASGamma{1} -@test typeof(RateVariationAcrossSites(:G)) == PhyloNetworks.RVASGamma{4} -@test typeof(RateVariationAcrossSites(:I)) == PhyloNetworks.RVASInv -@test typeof(RateVariationAcrossSites(:GI)) == PhyloNetworks.RVASGammaInv{5} -@test_throws ErrorException RateVariationAcrossSites(:unknown) -end - -@testset "Testing random discrete trait simulation" begin - -m1 = BinaryTraitSubstitutionModel(1.0,2.0, ["carnivory", "non-carnivory"]); -m2 = EqualRatesSubstitutionModel(4, [3.0], ["S1","S2","S3","S4"]); -# on a single branch -Random.seed!(1234); -anc = [1,2,1,2,2] -@test sum(randomTrait(m1, 0.1, anc) .== anc) >= 4 -Random.seed!(12345); -anc = [1,3,4,2,1] -@test sum(randomTrait(m2, 0.05, anc) .== anc) >= 4 -# on a network -net = readTopology("(A:1.0,(B:1.0,(C:1.0,D:1.0):1.0):1.0);") -Random.seed!(21); -a,b = randomTrait(m1, net) -@test size(a) == (1, 7) -@test all(x in [1,2] for x in a) -@test sum(a .== 1) >=2 && sum(a .== 2) >= 2 -@test b == ["-2", "-3", "-4", "D", "C", "B", "A"] -if runall - for e in net.edge e.length = 10.0; end - @time a,b = randomTrait(m1, net; ntraits=100000) # ~ 0.014 seconds - sum(a[:,1])/100000 # expect 1.5 at root - sum(a[:,2])/100000 # expect 1.333 at other nodes - @time a,b = randomTrait(m2, net; ntraits=100000) # ~ 0.02 seconds - length([x for x in a[:,1] if x==4])/length(a[:,1]) # expect 0.25 - length([x for x in a[:,2] if x==4])/length(a[:,2]) - length([x for x in a[:,3] if x==4])/length(a[:,3]) - length([x for x in a[:,4] if x==4])/length(a[:,4]) - length([x for x in a[:,5] if x==4])/length(a[:,5]) - length([x for x in a[:,6] if x==4])/length(a[:,6]) - length([x for x in a[:,7] if x==4])/length(a[:,7]) # expect 0.25 -end - -net2 = readTopology("(((A:4.0,(B:1.0)#H1:1.1::0.9):0.5,(C:0.6,#H1:1.0):1.0):3.0,D:5.0);") -Random.seed!(496); -a,b = randomTrait(m1, net2; keepInternal=false) -@test a == [1 1 1 2] -@test b == ["D", "C", "B", "A"] -Random.seed!(496); -a,b = randomTrait(m1, net2; keepInternal=true) -@test size(a) == (1, 9) -@test all(x in [1,2] for x in a) -@test b == ["-2", "D", "-3", "-6", "C", "-4", "H1", "B", "A"] -if runall - for e in net2.edge - if e.hybrid - e.length = 0.0 - end - end - a,b = randomTrait(m1, net2; ntraits=100000) - # plot(net2, shownodenumber=true) shows: H1 listed 7th, parents listed 4th and 6th - c = map( != , a[:, 4],a[:, 6] ); # traits when parents have different traits - n1 = sum(map( ==, a[c,7],a[c,6] )) # 39644 traits: hybrid ≠ major parent - n2 = sum(map( ==, a[c,7],a[c,4] )) # 4401 traits: hybrid ≠ minor parent - n1/sum(c) # expected 0.9 - n2/sum(c) # expected 0.1 - for e in net2.edge - e.length = 0.0 - end - net2.edge[4].length = 10.0 - a,b = randomTrait(m1, net2; ntraits=100000); - a[:, 1] == a[:, 2] # true: root = leaf D, as expected - a[:, 1] == a[:, 5] # true: root = leaf C - sum(a[:, 6])/100000 # expected 1.3333 - a[:, 6] == a[:, 9] # true: major hybrid parent node = leaf A -end - -end - -@testset "Test discrete likelihood, fixed topology" begin - -# test on a tree -#= -likelihood calculated in R using a fixed Q matrix, first with ace() then -with fitdiscrete(), then with fitMK(). problem: they give different results, -see http://blog.phytools.org/2015/09/the-difference-between-different.html -- ace: misses log(#states) in its log-likelihood -- fitdiscrete in geiger: uses empirical prior at root, not stationary dist, - but "lik" object is very flexible -- fitMk is correct. also great for 2 correlated binary traits -library(ape) -mytree = read.tree(text = "(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);") -states = c(1,1,2,2) -names(states) = mytree$tip.label -fitER = ace(states, mytree, model="ER", type="discrete") -print(fitER$loglik, digits=17) # log-likelihood = -1.9706530878326345 -print(fitER$loglik - log(2), digits=17) # -2.6638002683925799 -print(fitER$rates, digits=17) # rates = 0.3743971742794559 -print(fitER$lik.anc, digits=17)# posterior probs of states at nodes: 3x2 matrix (3 internal nodes, 2 states) -library(geiger) -fitER = fitdiscrete(mytree, states, model="ER") -print(fitER$opt$q12, digits=17) # rates = 0.36836216513047726 -print(fitER$opt$lnL, digits=17) # log-likelihood = -2.6626566310743804 -lik = fitER$lik -lik(0.3743971742794559, root="given",root.p=c(.5,.5)) # -2.6638002630818232: same as ace + log(2) -library(phytools) -Q2 = matrix(c(-1,1,1,-1),2,2)*fitER$opt$q12 -fit2 = fitMk(mytree, states, model="ER", fixedQ=Q2) -print(fit2$logLik, digits=17) # log-likelihood = -2.6638637960257574 -fitER = fitdiscrete(mytree, states, model="ARD") -lik = fitER$lik -Q = c(0.29885191850718751, 0.38944304456937912) # q12, q21 -lik(Q, root="given", root.p=Q[2:1]/sum(Q)) # -2.6457428692377234 -lik(Q, root="flat") # -2.6447321523303113 -Q = c(0.2, 0.3) # q12, q21 -lik(Q, root="flat") # -2.6754091090953693 .1,.7: -3.3291679800706073 -optim(Q, lik, lower=1e-8, control=list(fnscale=-1), root="flat") -# rates = 0.29993140042699212 0.38882902905265493 loglik=-2.6447247349802496 -states=c(1,2,1); names(states)=c("A","B","D") -fitER = fitdiscrete(mytree, states, model="ARD"); lik = fitER$lik -lik(Q, root="flat") # -2.1207856874033491 -=# - -net = readTopology("(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);"); -tips = Dict("A" => "lo", "B" => "lo", "C" => "hi", "D" => "hi"); #? this is supposed to be an AbstractVector, is a Dict{String,String} -m1 = EqualRatesSubstitutionModel(2,[0.36836216513047726], ["lo", "hi"]); -fit1 = (@test_logs fitdiscrete(net, m1, tips; optimizeQ=false, optimizeRVAS=false)); -@test_logs show(devnull, fit1) -@test StatsBase.loglikelihood(fit1) ≈ -2.6638637960257574 atol=2e-4 -@test StatsBase.dof(fit1) == 1 -species = ["G","C","A","B","D"] -dat1 = DataFrame(trait = ["hi","hi","lo","lo","hi"], species = species) -m2 = BinaryTraitSubstitutionModel(0.2, 0.3, ["lo", "hi"]) -fit2 = (@test_logs fitdiscrete(net, m2, dat1; optimizeQ=false, optimizeRVAS=false)) -@test fit2.trait == [[1],[1],[2],[2]] -@test StatsBase.loglikelihood(fit2) ≈ -2.6754091090953693 atol=2e-4 -originalstdout = stdout -redirect_stdout(devnull) -#OPTIMIZES RATES -fit2 = @test_logs fitdiscrete(net, m2, dat1; optimizeQ=true, optimizeRVAS=false, verbose=true) # 65 iterations -redirect_stdout(originalstdout) -@test fit2.model.rate ≈ [0.29993140042699212, 0.38882902905265493] atol=2e-4 -@test StatsBase.loglikelihood(fit2) ≈ -2.6447247349802496 atol=2e-4 -m2.rate[:] = [0.2, 0.3]; -dat2 = DataFrame(trait1= ["hi","hi","lo","lo","hi"], trait2=["hi",missing,"lo","hi","lo"]); -fit3 = (@test_logs fitdiscrete(net, m2, String7.(species), dat2; optimizeQ=false, optimizeRVAS=false)) - -@test fit3.loglik ≈ (-2.6754091090953693 - 2.1207856874033491) -PhyloNetworks.fit!(fit3; optimizeQ=true, optimizeRVAS=false) -@test fit3.model.rate ≈ [0.3245645980184735, 0.5079500171263976] atol=1e-4 -PhyloNetworks.fit!(fit3; optimizeQ=true, optimizeRVAS=true) -fit3.net = readTopology("(A,(B,(C,D):1.0):1.0);"); # no branch lengths -@test_throws ErrorException PhyloNetworks.fit!(fit3; optimizeQ=true, optimizeRVAS=true) -# fit() catches the error (due to negative branch lengths) - -# test on a network, 1 hybridization -net = readTopology("(((A:4.0,(B:1.0)#H1:1.1::0.9):0.5,(C:0.6,#H1:1.0::0.1):1.0):3.0,D:5.0);") -# function below used to check that simulation proportions == likelihood -m1 = BinaryTraitSubstitutionModel([1.0, 2.0], [1,2]) # model.label = model.index -function traitprobabilities(model, net, ntraits=10) - res, lab = randomTrait(model, net; ntraits=ntraits) - tips = findall(in(tipLabels(net)), lab) # indices of tips: columns in res - dat = DataFrame(species = lab[tips]) - tmp = StatsBase.countmap([res[i,tips] for i in 1:ntraits]) - i = 0 - prop = Float64[] - for (k,v) in tmp - i += 1 - dat[Symbol("x",i)] = k - push!(prop, v/ntraits) - end - npatterns = i - lik = Float64[] - for i in 1:npatterns - fit = fitdiscrete(net, model, dat[[:species, Symbol("x",i)]]; optimizeQ=false, optimizeRVAS=false) - push!(lik, fit.loglik) - end - return dat, prop, lik -end -#= -using PhyloNetworks, StatsBase, DataFrames -d, p, ll = traitprobabilities(m1, net, 100000000); -all(isapprox.(log.(p), ll, atol=1e-3)) # true -hcat(log.(p), ll) - -1.62173 -1.62184 - -3.00805 -3.00807 - -4.39506 -4.39436 - -3.00747 -3.0082 - -3.70119 -3.70121 - -3.00759 -3.0082 - -2.31516 -2.31505 - -2.31554 -2.31499 - -3.0083 -3.0082 - -3.008 -3.0082 - -2.31475 -2.31505 - -3.702 -3.70135 - -3.00836 -3.00813 - -3.70033 -3.70121 - -2.31546 -2.31499 - -3.70124 -3.70135 -=# -d = DataFrame(species=["D","C","B","A"], x1=[1,1,1,1], x2=[1,2,2,1], x3=[2,2,2,2], x4=[1,1,2,2], - x5=[2,2,2,1], x6=[2,2,1,1], x7=[1,1,2,1], x8=[2,1,1,1], x9=[2,1,2,1], x10=[1,2,1,2], - x11=[1,2,1,1], x12=[2,2,1,2], x13=[2,1,1,2], x14=[1,2,2,2], x15=[1,1,1,2], x16=[2,1,2,2]) -lik = Float64[] -for i in 1:16 - fit = fitdiscrete(net, m1, d[!,[:species, Symbol("x",i)]]; optimizeQ=false, optimizeRVAS=false) - push!(lik, fit.loglik) -end -traitloglik_all16 = [-1.6218387598967712, -3.008066347196894, -4.3943604143403245, -3.008199100743402, - -3.70121329832901, -3.0081981601869483, -2.315051933868397, -2.314985711030534, - -3.0081988850020873, -3.0081983709272504, -2.3150512090547584, -3.70134532205944, - -3.008132923628349, -3.7012134632082083, -2.3149859724945876, -3.7013460518770915] -@test lik ≈ traitloglik_all16 -fit1 = fitdiscrete(net, m1, d[!,:species], d[!,2:17]; optimizeQ=false, optimizeRVAS=false) -@test fit1.loglik ≈ sum(traitloglik_all16) # log of product = sum of logs - -# with parameter estimation -net = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);") -m1 = BinaryTraitSubstitutionModel([1.0, 1.0], ["lo", "hi"]) -dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]) -fit1 = fitdiscrete(net, m1, dat; optimizeQ=false, optimizeRVAS=false) -@test fit1.loglik ≈ -2.77132013004859 -PhyloNetworks.fit!(fit1; optimizeQ=true, optimizeRVAS=false) -@test fit1.model.rate ≈ [0.2722263130324768, 0.34981109618902395] atol=1e-4 -@test fit1.loglik ≈ -2.727701700695741 -# for information only: function used locally to check for correct parameter estimation -function simulateManyTraits_estimate(ntraits) - m1 = BinaryTraitSubstitutionModel([1.0, 0.5], [1,2]) - res, lab = randomTrait(m1, net; ntraits=ntraits) - tips = findall(in(tipLabels(net)), lab) # indices of tips: columns in res - dat = DataFrame(transpose(res[:,tips])); species = lab[tips] - return fitdiscrete(net, m1, species, dat; optimizeRVAS = false) -end -# simulateManyTraits_estimate(100000) -# α=1.1124637623451075, β=0.5604529225895175, loglik=-25587.1 with ntraits=10000 -# α=0.9801472136310236, β=0.4891696992781437, loglik=-255755.6 with ntraits=100000 -# time with ntraits=100000: 907.2s = 15min 7s (one single processor, no binning of traits with same pattern) - -# ancestral state reconstruction - fixit!! -fit1.model.rate[1] = 0.2722263130324768; -fit1.model.rate[2] = 0.34981109618902395; -@test_throws ErrorException ancestralStateReconstruction(fit1, 4) # 1 trait, not 4: error -asr = ancestralStateReconstruction(fit1) -@test DataFrames.propertynames(asr) == [:nodenumber, :nodelabel, :lo, :hi] -@test asr[!,:nodenumber] == collect(1:9) -@test asr[!,:nodelabel] == ["A","B","C","D","5","6","7","8","H1"] -@test asr[!,:lo] ≈ [1.,1.,0.,0., 0.28602239466671175, 0.31945742289603263, - 0.16855042517785512, 0.7673588716207436, 0.7827758475866091] atol=1e-5 -@test asr[!,:hi] ≈ [0.,0.,1.,1.,0.713977605333288, 0.6805425771039674, - 0.8314495748221447, 0.23264112837925616, 0.21722415241339132] atol=1e-5 -pltw = [-0.08356534477069566, -2.5236181051014333] -@test PhyloNetworks.posterior_logtreeweight(fit1) ≈ pltw atol=1e-5 -@test PhyloNetworks.posterior_logtreeweight(fit1, 1:1) ≈ reshape(pltw, (2,1)) atol=1e-5 -@test PhyloNetworks.posterior_loghybridweight(fit1, "H1") ≈ -2.5236227134322293 - -end # end of testset, fixed topology - -@testset "testing readfastatodna" begin -fastafile = joinpath(@__DIR__, "..", "examples", "test_8_withrepeatingsites.aln") -#fastafile = abspath(joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "test_8_withrepeatingsites.aln")) -dat, weights = readfastatodna(fastafile, true); -@test weights == [3.0, 1.0, 1.0, 2.0, 1.0] -#check that no columns are repeated, only correct columns removed -@test size(dat,2) == 6 - -#test on data with no repeated site patterns -fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_8sites.aln") -#fastafile = abspath(joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "Ae_bicornis_8sites.aln")) -dat, weights = readfastatodna(fastafile, true); -#check that weights are correct -@test weights == ones(Float64, 8) -#check that no columns are repeated, only correct columns removed -@test size(dat,2) == 9 -end #testing readfastatodna - -@testset "NucleicAcidSubsitutionModels" begin - -#test NASM models basics -mJC69 = JC69(0.5, false); -@test Q(mJC69) ≈ [-0.5 0.166667 0.166667 0.166667; - 0.166667 -0.5 0.166667 0.166667; - 0.166667 0.166667 -0.5 0.166667; - 0.166667 0.166667 0.166667 -0.5] atol=1e-5 -@test P(mJC69, 1.0) ≈ [0.635063 0.121646 0.121646 0.121646; - 0.121646 0.635063 0.121646 0.121646; - 0.121646 0.121646 0.635063 0.121646; - 0.121646 0.121646 0.121646 0.635063] atol=1e-5 - -@test_throws ErrorException HKY85([0.5, 0.5], [0.25, 0.25, 0.25, 0.25], true) -@test_throws ErrorException HKY85([.1,.1,.1], [0.25, 0.25, 0.25, 0.25], false) -@test_throws ErrorException HKY85([0.5], [0.25, 0.25, 0.25, 0.25], false) -#= HKY matrix from simulations with seq-gen -echo '(t1:0,t2:0.1);' > twotaxon.phy -seq-gen -m HKY -l 10000 -t 1.1145320197044333 -f 0.37 0.40 0.05 0.18 -of < twotaxon.phy > twotaxon_10000.fas -seq-gen -m HKY -l 100000000 -t 1.1145320197044333 -f 0.37 0.40 0.05 0.18 -of < twotaxon.phy > twotaxon.fas -# transition/transversion ratio = 1.11453 (K=3) -# tstv = kappa (here we want 3) * (pa*pg + pc*pt)/(py*pr) = 1.1145320197044333 -system.time(dat <- phyDat(read.dna("twotaxon.fas", format="fasta"))) # 99 seconds -bf = baseFreq(dat) # 0.36996372 0.40000796 0.04997551 0.18005282 -w = attr(dat, "weight") -acgt = attr(dat, "levels") -mat = matrix(NA,4,4, dimnames=list(acgt, acgt)) -for (pattern in 1:16){ - i = dat[[1]][pattern] - j = dat[[2]][pattern] - mat[i,j] = w[pattern] -} -mat/sum(w) # joint probabilities - a c g t -a 0.34529570 0.01368654 0.00483382 0.00615715 -c 0.01366887 0.36582571 0.00185338 0.01864593 -g 0.00483558 0.00185214 0.04245549 0.00083627 -t 0.00615407 0.01865763 0.00082884 0.15441288 -m = (mat/sum(w) + t(mat/sum(w)))/2 # symmetric: we know it should be bc reversible - a c g t -a 0.34529570 0.01367771 0.004834700 0.006155610 -c 0.01367771 0.36582571 0.001852760 0.018651780 -g 0.00483470 0.00185276 0.042455490 0.000832555 -t 0.00615561 0.01865178 0.000832555 0.154412880 -m/bf # transition probabilities - a c g t -a 0.93332315 0.03697040 0.013068038 0.01663842 -c 0.03419358 0.91454609 0.004631808 0.04662852 -g 0.09674139 0.03707336 0.849525983 0.01665926 -t 0.03418780 0.10359060 0.004623949 0.85759765 -@time dna_dat, dna_weights = readfastatodna("twotaxon_10000.fas", true); -# 1000 sites: 0.009950 seconds. 10_000 sites: 0.272987 seconds -# takes forever with 100_000_000 sites: far from linear -=# -mHKY85 = HKY85([0.5, 0.5], [0.25, 0.25, 0.25, 0.25], false) -@test Q(mHKY85) ≈ [ -0.375 0.125 0.125 0.125; - 0.125 -0.375 0.125 0.125; - 0.125 0.125 -0.375 0.125; - 0.125 0.125 0.125 -0.375] atol=1e-5 -@test P(mHKY85, 1.0) ≈ [0.704898 0.0983673 0.0983673 0.0983673; - 0.0983673 0.704898 0.0983673 0.0983673; - 0.0983673 0.0983673 0.704898 0.0983673; - 0.0983673 0.0983673 0.0983673 0.704898] atol=1e-5 - -@test P!(P(mHKY85, 1.0), mHKY85, 3.0) ≈ [0.417348 0.194217 0.194217 0.194217; - 0.194217 0.417348 0.194217 0.194217; - 0.194217 0.194217 0.417348 0.194217; - 0.194217 0.194217 0.194217 0.417348] atol=1e-5 - -mHKY85rel = HKY85(3.0, [.37,.40,.05,.18]) -@test Q(mHKY85rel) ≈ [-.7086 .388274 .145603 .174723; - .359154 -.931858 .0485343 .52417; - 1.07746 .388274 -1.64046 .174723; - .359154 1.16482 .0485343 -1.57251] atol=1e-3 -@test PhyloNetworks.P(HKY85([3.0], [.37,.40,.05,.18]), 0.1) ≈ - [.93332315 .03697040 .013068038 .01663842; # values: from seq-gen simulations - .03419358 .91454609 .004631808 .04662852; - .09674139 .03707336 .849525983 .01665926; - .03418780 .10359060 .004623949 .85759765] atol=1e-3 - -@test P!(P(mJC69, 1.0), mJC69, 3.5) ≈ [0.322729 0.225757 0.225757 0.225757; - 0.225757 0.322729 0.225757 0.225757; - 0.225757 0.225757 0.322729 0.225757; - 0.225757 0.225757 0.225757 0.322729] atol=1e-5 - -@test_logs show(devnull, mJC69) -@test_logs show(devnull, mHKY85) -end # end of testing NASMs - -@testset "fitdiscrete for NucleicAcidSubsitutionModels & RateVariationAcrossSites" begin -# test fitdiscrete with NASM # - # based on 3 alignments in PhyloNetworks/examples -net = readTopology("(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);"); -tips = Dict("A" => BioSymbols.DNA_A, "B" => BioSymbols.DNA_A, "C" => BioSymbols.DNA_G, "D" => BioSymbols.DNA_G); - -# JC without optimization (confirmed with ape ace() function and phangorn) -mJC69 = JC69(0.2923350741254221, false) #ace() gives Q matrix cell, not rate. lambda = (1.0/3.0)*obj.rate[1] so rate = 3*0.097445024708474035 = 0.2923350741254221 - #phangorn gives rate = 0.292336 -fitJC69 = fitdiscrete(net, mJC69, tips; optimizeQ=false); -@test loglikelihood(fitJC69) ≈ -4.9927386890207304 atol=2e-6 #ace() from ape pkg and our method agree here. - #from ace() + log(4) - -# JC without optimize at 0.25 -mJC69 = JC69([0.25], false) -fitJC69 = fitdiscrete(net, mJC69, tips; optimizeQ=false); -@test loglikelihood(fitJC69) ≈ -4.99997 atol=2e-3 #from phangorn - -# JC with optimization (confirmed with ape ace() function and phangorn) -mJC69 = JC69([0.25], false) -fitJC69 = fitdiscrete(net, mJC69, tips; optimizeQ=true) -@test Q(fitJC69.model)[1,2] ≈ 0.097445024708474035 atol = 2e-3 #confirmed with ace() in ape pkg (ace calls Q matrix rate) -@test loglikelihood(fitJC69) ≈ -4.9927386890207304 atol=2e-6 #confirmed with ape pkg ace() + log(4) and phangorn optim.pml - -#= HKY without optimization, confirmed with phangorn R code: -library(phangorn) -mytree = read.tree(text = "(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);") -states = factor(c(1,1,3,3), levels=c("1","2","3","4")) -names(states) = mytree$tip.label -mydata <- as.phyDat(states) -# likelihood without optimization -fitHKY_phan <- pml(mytree, mydata, model = "HKY") #this is equivalent to rate = [4/3, 4/3] -print(fitHKY_phan$logLik, digits = 10) # -5.365777014 -fitHKY_phan$rate # 1 -=# -mHKY85 = HKY85([4.0/3, 4.0/3], [0.25, 0.25, 0.25, 0.25], false); # absolute -fitHKY85 = fitdiscrete(net, mHKY85, tips; optimizeQ=false); -@test loglikelihood(fitHKY85) ≈ -5.365777014 atol = 2e-8 # equivalent to phangorn $logLik -mHKY85 = HKY85([1.0], [0.25, 0.25, 0.25, 0.25], true); # relative -fitHKY85 = fitdiscrete(net, mHKY85, tips; optimizeQ=false); -@test loglikelihood(fitHKY85) ≈ -5.365777014 atol = 2e-8 # equivalent to above b/c transversion/transition rates equal - -#= HKY85 with optimization, confirmed with ape ace() in R -# NOTE: ace does not include log(#states) in its log-likelihood -library(ape) -mytree = read.tree(text = "(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);") -states = factor(c(1,1,3,3), levels=c("1","2","3","4")) -names(states) = mytree$tip.label -HKYQ <- matrix(c(0,2,1,2, 2,0,2,1, 1,2,0,2, 2,1,2,0), 4) -fitHKY = ace(states, mytree, type = "discrete", model=HKYQ) -print(fitHKY$loglik - log(4), digits=17) # -3.3569474489525244 -print(fitHKY$rates*4, digits=17) # 1.4975887229148119 0.0 -=# -mHKY85 = HKY85([0.5, 0.1], [0.25, 0.25, 0.25, 0.25], false); # absolute -fitHKY85 = fitdiscrete(net, mHKY85, tips; optimizeQ=true) -@test fitHKY85.model.rate[1] ≈ 1.4975887229148119 atol = 2e-4 # equivalent to ape ace() rate * 4 -@test loglikelihood(fitHKY85) ≈ -3.3569474489525244 atol = 2e-8 # equivalent to ape ace() fitHKY$loglik - log(4) - -# test RateVariationAcrossSites with NASM -rv = RateVariationAcrossSites(alpha=1.0, ncat=4) -rv.ratemultiplier[:] = [0.1369538, 0.4767519, 1.0000000, 2.3862944] # NOTE: phangorn calculates gamma quantiles differently, so I assign them for testing -mJC69 = JC69([1.0], true) -fitJC69rv = fitdiscrete(net, mJC69, rv, tips; optimizeQ=false, optimizeRVAS=false, ftolRel=1e-20); -@test loglikelihood(fitJC69rv) ≈ -5.26390008 atol = 2e-8 -@test dof(fitJC69rv) == 1 # relative JC: 0, rate variation: 1 - -fitJC69rvOpt = fitdiscrete(net, mJC69, rv, tips, optimizeQ=false, optimizeRVAS=true); - -mHKY85 = HKY85([4.0/3, 4.0/3], [0.25, 0.25, 0.25, 0.25], false); -fitHKY85rv = fitdiscrete(net, mHKY85, rv, tips; optimizeQ=false, optimizeRVAS=false); -@test loglikelihood(fitHKY85rv) ≈ -5.2639000803742979 atol = 2e-5 #from phangorn -@test dof(fitHKY85rv) == 3 # absolute HKY (fixed base freqs.): 2, rate variation: 1 - -fitHKY85rvOpt = fitdiscrete(net, mHKY85, rv, tips; optimizeQ=false, optimizeRVAS=true); - -## TEST WRAPPERS ## -#for species, trait data -net_dat = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);") -dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]) -species_alone = ["C","A","B","D"] -dat_alone = DataFrame(trait=["hi","lo","lo","hi"]) -net_tips = readTopology("(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);"); -@test_throws ErrorException fitdiscrete(net_dat, :bogus, species_alone, dat_alone); -@test_throws ErrorException fitdiscrete(net_dat, BinaryTraitSubstitutionModel([1.,1.], ["lo","hi"]), dat_alone); -s1 = fitdiscrete(net_dat, :ERSM, species_alone, dat_alone; optimizeQ=false) -@test_logs show(devnull, s1) -s1 = fitdiscrete(net_dat, :ERSM, species_alone, dat_alone, :G; optimizeQ=false, optimizeRVAS=false) -@test_logs show(devnull, s1) -s2 = fitdiscrete(net_dat, :BTSM, species_alone, dat_alone; optimizeQ=false, optimizeRVAS=false) -@test_logs show(devnull, s2) -@test_throws ErrorException fitdiscrete(net_dat, :TBTSM, species_alone, dat_alone; optimizeQ=false, optimizeRVAS=false) -dna_alone = DataFrame(trait=['A','C','C','A']) -s3 = fitdiscrete(net_dat, :JC69, species_alone, dna_alone, :G; optimizeRVAS=false, ftolRel=.1,ftolAbs=.2,xtolRel=.1,xtolAbs=.2) # 1 site: no info to optimize RVAS -@test s3.model.relative -@test s3.ratemodel.alpha == [1.0] -@test_logs show(devnull, s3) -s4 = fitdiscrete(net_dat, :HKY85, species_alone, dna_alone, :G; optimizeRVAS=false, ftolRel=.1,ftolAbs=.2,xtolRel=.1,xtolAbs=.2) -@test s4.model.relative -@test s4.model.pi == [3,3,1,1]/8 -@test s4.ratemodel.alpha == [1.0] -@test_logs show(devnull, s4) - -#for dna data (output of fastatodna) -fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln") -#fastafile = abspath(joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln")) -dna_dat, dna_weights = readfastatodna(fastafile, true); -net_dna = readTopology("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); -@test PhyloNetworks.startingrate(net_dna) ≈ 0.02127659574468085 # 1/length(net_dna.leaf) -for edge in net_dna.edge # adds branch lengths - setLength!(edge,1.0) - if edge.gamma < 0 - setGamma!(edge, 0.5) - end -end - -d1 = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(net_dna, - :ERSM, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false)) -@test_logs show(devnull, d1) -@test_throws ErrorException fitdiscrete(net_dna, :BTSM, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false); -@test_throws ErrorException fitdiscrete(net_dna, :TBTSM, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false); -@test_throws ErrorException fitdiscrete(net_dna, :bogus, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false); -d2 = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(net_dna, - :JC69, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false)) -@test_logs show(devnull, d2) -d2 = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(net_dna, - :JC69, dna_dat, dna_weights, :GI; optimizeQ=false, optimizeRVAS=false)) -@test_logs show(devnull, d2) -d3 = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(net_dna, - :HKY85, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false)) -@test_logs show(devnull, d3) - -end #testing fitdiscrete for NucleicAcidSubsitutionModels & RateVariationAcrossSites - -@testset "readfastatodna with NASM and RateVariationAcrossSites" begin -fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln") -#fastafile = abspath(joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln")) -dna_dat, dna_weights = readfastatodna(fastafile, true); - -dna_net_top = readTopology("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); -for edge in dna_net_top.edge #adds branch lengths - setLength!(edge,1.0) -end - -nasm_model = JC69([0.3], false); # relative=false: absolute version -rv = RateVariationAcrossSites(alpha=1.0, ncat=2); # 2 rates to go faster -# below: error because missing gammas, after warning for extra taxa -(@test_logs (:warn, r"pruned") @test_throws ErrorException fitdiscrete(dna_net_top, nasm_model, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false)) -# set gamma at the 3 reticulations, to fix error above -setGamma!(dna_net_top.edge[6],0.6) -setGamma!(dna_net_top.edge[7],0.6) -setGamma!(dna_net_top.edge[58],0.6) - -dna_net = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(dna_net_top, - nasm_model, dna_dat, dna_weights; optimizeQ=false)) -@test dna_net.model.rate == nasm_model.rate -@test dna_net.ratemodel.ratemultiplier == [1.0] -dna_net_optQ = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(dna_net_top, - nasm_model, rv, dna_dat, dna_weights; optimizeQ=true, optimizeRVAS=false, ftolRel=.1, ftolAbs=.2, xtolRel=.1, xtolAbs=.2)) -@test dna_net_optQ.model.rate != nasm_model.rate -@test dna_net_optQ.ratemodel.alpha[1] == 1.0 -dna_net_optRVAS = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(dna_net_top, - nasm_model, rv, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=true, ftolRel=.1, ftolAbs=.2, xtolRel=.1, xtolAbs=.2)) -@test dna_net_optRVAS.model.rate == nasm_model.rate -@test dna_net_optRVAS.ratemodel.alpha[1] != 1.0 -@test dna_net_optRVAS.ratemodel.ratemultiplier ≈ [0.02, 1.98] atol=0.05 -originalstdout = stdout -redirect_stdout(devnull) -dna_net_opt_both = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(dna_net_top, - nasm_model, rv, dna_dat, dna_weights; optimizeQ=true, optimizeRVAS=true, closeoptim=true, ftolRel=.1, ftolAbs=.2, xtolRel=.1, xtolAbs=.2, verbose=true)) -redirect_stdout(originalstdout) -@test dna_net_opt_both.model.rate != nasm_model.rate -@test dna_net_opt_both.ratemodel.alpha[1] != 1.0 -# for this example: all NaN values if no lower bound on RVAS's alpha, because it goes to 0 -@test dna_net_opt_both.ratemodel.ratemultiplier ≈ [1e-4, 2.0] atol=0.02 -@test dna_net_opt_both.loglik > -3800. -# should be ~ -3708.1 -- but low tolerance: just check it's not horrible. -# with default tol: alpha=0.05, JC rate=0.00288, loglik=-3337.413 -# under wrong model where all traits have evolved under same (unknown) displayed tree: -# should be ~ -2901.3 -- but low tolerance: just check it's > -3100. -# with default strict tolerance values: takes *much* longer, alpha=0.05, JC rate = 0.00293, loglik = -2535.618 -end # of testing readfastatodna with NASM and RateVariationAcrossSites - -@testset "stationary and empiricalDNAfrequencies" begin - -BTSM_1 = BinaryTraitSubstitutionModel(1.0, 2.0); -ERSM_1 = EqualRatesSubstitutionModel(4, 3.0, ["S1","S2","S3","S4"]); -@test PhyloNetworks.stationary(BTSM_1) ≈ [0.6666666666666666, 0.3333333333333333] atol=1e-6 -@test PhyloNetworks.stationary(ERSM_1) == [0.25, 0.25, 0.25, 0.25] - -JC69_1 = JC69(0.5, false); -@test PhyloNetworks.stationary(JC69_1) == [0.25, 0.25, 0.25, 0.25] -HKY85_1 = HKY85([0.5, 0.5], [0.2, 0.3, 0.25, 0.25], false) -@test PhyloNetworks.stationary(HKY85_1) == [0.2, 0.3, 0.25, 0.25] - -# test empiricalDNAfrequencies with string type -# Bayesian correction by default: more stable and avoids zeros -dna_String = view(DataFrame(A = ["s1", "s2"], site1 = ["A", "A"], site2 = ["G", "T"]), :, 2:3) -@test PhyloNetworks.empiricalDNAfrequencies(dna_String, [1, 1]) ≈ [3,1,2,2]/(4+4) -# with char type -dna_Char = view(DataFrame(A = ["s1", "s2"], site1 = ['A', 'A'], site2 = ['G', 'T']), :, 2:3) -@test PhyloNetworks.empiricalDNAfrequencies(dna_Char, [1, 1]) ≈ [3,1,2,2]/(4+4) -# uncorrected estimate -@test PhyloNetworks.empiricalDNAfrequencies(dna_Char, [1, 1], false) ≈ [2,0,1,1]/4 -# with ambiguous sites -dna_Char = DataFrame(site1 = ['A','A','Y'], site2 = ['G','T','V']) -@test PhyloNetworks.empiricalDNAfrequencies(dna_Char, [1, 1], false, false) ≈ [2,0,1,1]/4 -@test PhyloNetworks.empiricalDNAfrequencies(dna_Char, [1, 1], false) ≈ [2+1/3,1/2+1/3,1+1/3,1+1/2]/6 -# with DNA type and weights -#fastafile = abspath(joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "test_8_withrepeatingsites.aln")) -fastafile = joinpath(@__DIR__, "..", "examples", "test_8_withrepeatingsites.aln") -dat, weights = readfastatodna(fastafile, true); -@test PhyloNetworks.empiricalDNAfrequencies(view(dat, :, 2:6), weights) ≈ [0.21153846153846154, 0.3076923076923077, 0.40384615384615385, 0.07692307692307693] atol=1e-9 - -#test PhyloNetworks.empiricalDNAfrequencies with bad type -dna_bad = view(DataFrame(A = ["s1", "s2"], trait1 = ["hi", "lo"], trait2 = ["lo", "hi"]), :, 2:3) -@test_throws ErrorException PhyloNetworks.empiricalDNAfrequencies(dna_bad, [1, 1]) - -end #testing stationary and empiricalDNAfrequencies functions - -@testset "startingBL!" begin -fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_8sites.aln") # 8 sites only -# locally: fastafile = joinpath(@__DIR__, "../../dev/PhyloNetworks/", "examples", "Ae_bicornis_8sites.aln") #small data -dna_dat, dna_weights = readfastatodna(fastafile, true); -# 22 species, 3 hybrid nodes, 103 edges -dna_net = readTopology("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); -# create trait object -dat2 = PhyloNetworks.traitlabels2indices(dna_dat[!,2:end], JC69([0.5])) -o, dna_net = @test_logs (:warn, "the network contains taxa with no data: those will be pruned") match_mode=:any PhyloNetworks.check_matchtaxonnames!(dna_dat[:,1], dat2, dna_net) -trait = view(dat2, o) -PhyloNetworks.startingBL!(dna_net, trait, dna_weights) -@test maximum(e.length for e in dna_net.edge) > 0.03 -@test_logs PhyloNetworks.startingBL!(dna_net, trait) # no dna_weights - -dna_dat, dna_weights = readfastatodna(fastafile, true); -dna_net = readTopology("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); -dat2 = PhyloNetworks.traitlabels2indices(dna_dat[!,2:end], HKY85([0.5], [0.25, 0.25, 0.25, 0.25], true)) -o, dna_net = @test_logs (:warn, "the network contains taxa with no data: those will be pruned") match_mode=:any PhyloNetworks.check_matchtaxonnames!(dna_dat[:,1], dat2, dna_net) -trait = view(dat2, o) -PhyloNetworks.startingBL!(dna_net, trait, dna_weights) -@test maximum(e.length for e in dna_net.edge) > 0.03 -@test_logs PhyloNetworks.startingBL!(dna_net, trait) # no dna_weights -end # of startingBL! - -@testset "testing prep and wrapper functions" begin -# read in data -#at home: fastafile = joinpath(@__DIR__, "../../dev/PhyloNetworks/", "examples", "Ae_bicornis_Tr406_Contig10132.aln") #small data -fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln") -dna_dat, dna_weights = readfastatodna(fastafile, true); - -dna_net_top = readTopology("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); -for edge in dna_net_top.edge #adds branch lengths - setLength!(edge,1.0) -end -#Fixes the gamma error (creates a network) -setGamma!(dna_net_top.edge[6],0.6) -setGamma!(dna_net_top.edge[7],0.6) -setGamma!(dna_net_top.edge[58],0.6) - -# tests # -net_dat = readTopology("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);") -dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]) - -jmod = PhyloNetworks.defaultsubstitutionmodel(dna_net_top, :JC69, dna_dat, dna_weights) -@test jmod.rate == [1.0] -emod = PhyloNetworks.defaultsubstitutionmodel(dna_net_top, :ERSM, dna_dat, dna_weights) -@test emod.rate[1] ≈ 0.009708737864077669 -@test typeof(emod) == EqualRatesSubstitutionModel{DNA} -hmod = PhyloNetworks.defaultsubstitutionmodel(dna_net_top, :HKY85, dna_dat, dna_weights) -@test typeof(hmod) == HKY85 -bmod = PhyloNetworks.defaultsubstitutionmodel(dna_net_top, :BTSM, dat, [1.0, 1.0, 1.0, 1.0]) -@test typeof(bmod) == BinaryTraitSubstitutionModel{String} -@test_throws ErrorException PhyloNetworks.defaultsubstitutionmodel(dna_net_top, :QR, dat, [1.0, 1.0, 1.0, 1.0]) - - -test_SSM = (@test_logs (:warn, r"pruned") match_mode=:any PhyloNetworks.StatisticalSubstitutionModel(dna_net_top, fastafile, :JC69)) -@test typeof(test_SSM.model) == JC69 -@test test_SSM.nsites == 209 -@test test_SSM.siteweight[1:5] == [23.0, 18.0, 13.0, 16.0, 1.0] - -end #of testing prep and wrapper functions - -@testset "testing fit! functions for full network optimization" begin -# read in data # -#test -#fastafile = joinpath(@__DIR__, "../../dev/PhyloNetworks/", "examples", "Ae_bicornis_Tr406_Contig10132.aln") #small data -fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln") -dna_dat, dna_weights = readfastatodna(fastafile, true); - -dna_net_top = readTopology("((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);"); -for edge in dna_net_top.edge #adds branch lengths - setLength!(edge,1.0) -end -#Fixes the gamma error (creates a network) -setGamma!(dna_net_top.edge[6],0.6) -setGamma!(dna_net_top.edge[7],0.6) -setGamma!(dna_net_top.edge[58],0.6) -@test_logs (:warn, r"pruned") match_mode=:any PhyloNetworks.StatisticalSubstitutionModel(dna_net_top, fastafile, :JC69) -end #of testing fit! functions for full network optimization - -end # of nested testsets diff --git a/test/test_undirectedOtherNetworks.jl b/test/test_undirectedOtherNetworks.jl deleted file mode 100644 index bbae482c5..000000000 --- a/test/test_undirectedOtherNetworks.jl +++ /dev/null @@ -1,95 +0,0 @@ -## julia script to test undirectedOtherNetworks -## function that will give all the networks obtained by -## moving the hybrid nodes inside each cycle -## Claudia April 2016 - -@testset "test: move hybrid around cycle" begin -global net -net = readTopology("(((B)#H2,((C,#H2)S1,(A)S2)S3)S4);") -@test_logs hybridatnode!(net, 7) -@test_throws ErrorException hybridatnode!(net, 8) - -## very important semicolon at the end because show changes containRoot -net = readTopologyLevel1("(6,(((1,2):1.8702617089780738,(3,(4)#H7:0.042493238243074646::0.9015570666393798):10.0):10.0,(5,#H7:1.1830905092006163::0.09844293336062017):10.0):0.5);"); -out = "6" -checkNet(net) -otherNet1 = undirectedOtherNetworks(net, insideSnaq=true); -length(otherNet1) == 4 || error("wrong number of other networks") -otherNet1[1].hybrid[1].number == -8 || error("wrong new hybrid") -otherNet1[2].hybrid[1].number == -3 || error("wrong new hybrid") -otherNet1[3].hybrid[1].number == -4 || error("wrong new hybrid") -otherNet1[4].hybrid[1].number == -6 || error("wrong new hybrid") -checkNet(otherNet1[1], false,checkPartition=false) -checkNet(otherNet1[2], false,checkPartition=false) -checkNet(otherNet1[3], false,checkPartition=false) -checkNet(otherNet1[4], false,checkPartition=false) -##i=4 -otherNet2 = undirectedOtherNetworks(net, outgroup=out, insideSnaq=true); -length(otherNet2) == 3 || error("wrong number of other networks") -otherNet2[1].hybrid[1].number == -8 || error("wrong new hybrid") -otherNet2[2].hybrid[1].number == -4 || error("wrong new hybrid") -otherNet2[3].hybrid[1].number == -6 || error("wrong new hybrid") -checkNet(otherNet2[1], false,checkPartition=false) -checkNet(otherNet2[2], false,checkPartition=false) -checkNet(otherNet2[3], false,checkPartition=false) -##i=3 - - -net = readTopologyLevel1("(4:1.0,(3:1.0,((1:1.0,2:1.0):1.87)#H7:10.0::0.51):0.042,(5:1.0,(#H7:10.0::0.49,6:1.0):10.0):1.183);"); -out = "4" -checkNet(net) -otherNet1 = undirectedOtherNetworks(net, insideSnaq=true); -length(otherNet1) == 4 || error("wrong number of other networks") -otherNet1[1].hybrid[1].number == -7 || error("wrong new hybrid") -otherNet1[2].hybrid[1].number == -6 || error("wrong new hybrid") -otherNet1[3].hybrid[1].number == -2 || error("wrong new hybrid") -otherNet1[4].hybrid[1].number == -3 || error("wrong new hybrid") -checkNet(otherNet1[1], false,checkPartition=false) -checkNet(otherNet1[2], false,checkPartition=false) -checkNet(otherNet1[3], false,checkPartition=false) -checkNet(otherNet1[4], false,checkPartition=false) -##i=4 -otherNet2 = undirectedOtherNetworks(net, outgroup=out, insideSnaq=true); -length(otherNet2) == 3 || error("wrong number of other networks") -otherNet2[1].hybrid[1].number == -7 || error("wrong new hybrid") -otherNet2[2].hybrid[1].number == -6 || error("wrong new hybrid") -otherNet2[3].hybrid[1].number == -3 || error("wrong new hybrid") -checkNet(otherNet2[1], false,checkPartition=false) -checkNet(otherNet2[2], false,checkPartition=false) -checkNet(otherNet2[3], false,checkPartition=false) -##i=3 - - -net = readTopologyLevel1("(6,((5,#H7:0.0::0.29999):10.0,(((2,#H9:0.0::0.15902):0.02332,(1,(3)#H9:0.9417::0.84098):0.12997):1.2018,(4)#H7:0.01722::0.70001):9.99428):0.24593);"); -out = "6" -checkNet(net) -otherNet1 = undirectedOtherNetworks(net, insideSnaq=true); -length(otherNet1) == 6 || error("wrong number of other networks") -checkNet(otherNet1[1], false,checkPartition=false) -checkNet(otherNet1[2], false,checkPartition=false) -checkNet(otherNet1[3], false,checkPartition=false) -checkNet(otherNet1[4], false,checkPartition=false) -checkNet(otherNet1[5], false,checkPartition=false) -checkNet(otherNet1[6], false,checkPartition=false) -otherNet1[1].hybrid[2].number == -7 && otherNet1[1].hybrid[1].number == 3 || error("wrong new hybrid") -otherNet1[2].hybrid[2].number == -6 && otherNet1[2].hybrid[1].number == 3 || error("wrong new hybrid") -otherNet1[3].hybrid[2].number == -8 && otherNet1[3].hybrid[1].number == 3 || error("wrong new hybrid") -otherNet1[4].hybrid[1].number == 5 && otherNet1[4].hybrid[2].number == -4 || error("wrong new hybrid") -otherNet1[5].hybrid[1].number == 5 && otherNet1[5].hybrid[2].number == -3 || error("wrong new hybrid") -otherNet1[6].hybrid[1].number == 5 && otherNet1[6].hybrid[2].number == -5 || error("wrong new hybrid") -##i=6 -otherNet2 = undirectedOtherNetworks(net, outgroup=out, insideSnaq=true); -length(otherNet2) == 4 || error("wrong number of other networks") -checkNet(otherNet2[1], false,checkPartition=false) -checkNet(otherNet2[2], false,checkPartition=false) -checkNet(otherNet2[3], false,checkPartition=false) -checkNet(otherNet2[4], false,checkPartition=false) -otherNet2[1].hybrid[2].number == -7 && otherNet2[1].hybrid[1].number == 3 || error("wrong new hybrid") -otherNet2[2].hybrid[1].number == 3 && otherNet2[2].hybrid[2].number == -8 || error("wrong new hybrid") -otherNet2[3].hybrid[1].number == 5 && otherNet2[3].hybrid[2].number == -4 || error("wrong new hybrid") -otherNet2[4].hybrid[1].number == 5 && otherNet2[4].hybrid[2].number == -5 || error("wrong new hybrid") -##i=3 - -## net = readTopologyLevel1("(Xgordoni,Xmeyeri,(Xcouchianus,(Xvariatus,(Xevelynae,((Xxiphidium,#H25:9.992::0.167):1.383,(Xmilleri,(Xandersi,(Xmaculatus,((((Xhellerii,(Xalvarezi,Xmayae):0.327):0.259,Xsignum):1.866,(Xclemenciae_F2,Xmonticolus):1.461):0.786,((((Xmontezumae,(Xnezahuacoyotl)#H26:0.247::0.807):0.372,((Xbirchmanni_GARC,Xmalinche_CHIC2):1.003,Xcortezi):0.454):0.63,((Xcontinens,Xpygmaeus):1.927,((Xnigrensis,Xmultilineatus):1.304,#H26:0.0::0.193):0.059):2.492):2.034)#H25:0.707::0.833):1.029):0.654):0.469):0.295):0.41):0.646):3.509):0.263);") - -end